事件 – 事件驱动的I / O如何允许多处理?
我知道事件驱动的I / O,如选择,投票,epoll等允许有人建立一个高度可扩展的Web服务器,但我很困惑的细节.如果服务器只有一个执行线程和一个进程运行,那么当服务器正在为准备好的客户机运行“处理”例程时,不是以串行方式完成处理就绪客户端列表,因为它不能安排在多个核心或cpus上?此外,当这种处理正在发生…服务器不会没有反应? 我以前认为这是人们使用线程池来处理后端的事件I / O的原因,但是当我最近听到并不是每个人都为其应用程序使用线程池时,我感到困惑. 解决方法
嗯.我想,你(原来的海报)和其他的答案是这样的.
你似乎掌握了事件驱动的部分,但是在事件触发之后会发生什么事情. 要了解的关键是,Web服务器通常花费很少的时间“处理”请求,并且花费大量时间等待磁盘和网络I / O. 当一个请求进来时,服务器通常需要做两件事情之一.加载文件并将其发送到客户端,或将请求传递给其他内容(通常,CGI脚本,这些天FastCGI由于明显的原因而更常见). 在这两种情况下,服务器的工作在计算上是最小的,它只是客户端和磁盘之间的中间人,或者是“别的东西”. 这就是为什么这些服务器使用所谓的非阻塞I / O. 确切的机制从一个操作系统到另一个操作系统不同,但关键是读或写请求总是立即返回(或接近).当您尝试写入套接字时,系统可以立即接受缓冲区中的内容,或者返回类似EWOULDBLOCK的错误信息,让您知道现在无法使用更多数据. 一旦写入被“接受”,程序就可以记录连接的状态(例如“发送10000字节的5000”等等),并移动到准备采取行动的下一个连接,然后返回到系统首先准备好采取更多的数据. 这与正常的阻塞套接字不同,因为操作系统尝试通过网络将数据发送到客户端,大型写请求可能会阻塞相当长的一段时间. 在某种意义上说,这与使用线程I / O的方式并没有太大的不同,但是它以内存,上下文切换和通用“内务”的形式大大减少了开销,并且最大限度地利用了什么操作系统做最好的(或者应该是,反正):快速处理I / O. 对于多处理器/多核系统,同样的原则也适用.这种风格的服务器在每个单独的CPU上仍然非常有效.您只需要一个将自己的多个实例分叉以利用其他处理器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 为什么scala Map没有实现unapply?
- 在哪里可以找到用于go语言的Vim语法文件?
- Bootstrap3 排版-缩略语
- rails使用bootstrap3-wysiwyg可视化编辑器并实现自定义图片
- scala – 为什么标准集合类型中没有toVector方法(如toList,
- 创建快捷方式到桌面、任务栏、开始菜单、快速启动栏、程序组
- node.js – npm package.json和docker(挂载……)
- ctags+taglist+winmanger 打造vim 编辑器
- 为什么我无法获得由docker build创建的文件尾部的输出
- ssh – 当一个命令以太多的输出淹没你的终端时你会怎么做?