加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

事件 – 事件驱动的I / O如何允许多处理?

发布时间:2020-12-16 09:21:03 所属栏目:安全 来源:网络整理
导读:我知道事件驱动的I / O,如选择,投票,epoll等允许有人建立一个高度可扩展的Web服务器,但我很困惑的细节.如果服务器只有一个执行线程和一个进程运行,那么当服务器正在为准备好的客户机运行“处理”例程时,不是以串行方式完成处理就绪客户端列表,因为它不能安排



我知道事件驱动的I / O,如选择,投票,epoll等允许有人建立一个高度可扩展的Web服务器,但我很困惑的细节.如果服务器只有一个执行线程和一个进程运行,那么当服务器正在为准备好的客户机运行“处理”例程时,不是以串行方式完成处理就绪客户端列表,因为它不能安排在多个核心或cpus上?此外,当这种处理正在发生…服务器不会没有反应?

我以前认为这是人们使用线程池来处理后端的事件I / O的原因,但是当我最近听到并不是每个人都为其应用程序使用线程池时,我感到困惑.

解决方法

嗯.我想,你(原来的海报)和其他的答案是这样的.

你似乎掌握了事件驱动的部分,但是在事件触发之后会发生什么事情.

要了解的关键是,Web服务器通常花费很少的时间“处理”请求,并且花费大量时间等待磁盘和网络I / O.

当一个请求进来时,服务器通常需要做两件事情之一.加载文件并将其发送到客户端,或将请求传递给其他内容(通常,CGI脚本,这些天FastCGI由于明显的原因而更常见).

在这两种情况下,服务器的工作在计算上是最小的,它只是客户端和磁盘之间的中间人,或者是“别的东西”.

这就是为什么这些服务器使用所谓的非阻塞I / O.

确切的机制从一个操作系统到另一个操作系统不同,但关键是读或写请求总是立即返回(或接近).当您尝试写入套接字时,系统可以立即接受缓冲区中的内容,或者返回类似EWOULDBLOCK的错误信息,让您知道现在无法使用更多数据.

一旦写入被“接受”,程序就可以记录连接的状态(例如“发送10000字节的5000”等等),并移动到准备采取行动的下一个连接,然后返回到系统首先准备好采取更多的数据.

这与正常的阻塞套接字不同,因为操作系统尝试通过网络将数据发送到客户端,大型写请求可能会阻塞相当长的一段时间.

在某种意义上说,这与使用线程I / O的方式并没有太大的不同,但是它以内存,上下文切换和通用“内务”的形式大大减少了开销,并且最大限度地利用了什么操作系统做最好的(或者应该是,反正):快速处理I / O.

对于多处理器/多核系统,同样的原则也适用.这种风格的服务器在每个单独的CPU上仍然非常有效.您只需要一个将自己的多个实例分叉以利用其他处理器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读