select()
像lighttpd或nginx这样的非分叉(也称为单线程或基于)的网络服务器越来越受欢迎.
虽然有大量文档解释分叉服务器(各种详细程度),但非分叉服务器的文档很少.
我找了一个鸟的眼睛看怎么一个非分叉的Web服务器的作品.(伪)代码或状态机图,剥离到最低限度,将是伟大的.
我知道以下资源,并发现它们很有帮助.
但是,我对原则感兴趣,而不是实现细节.
特别:
为什么这种类型的服务器有时称为非阻塞,select()
基本上是块?
处理请求可能需要一些时间.在没有特定侦听器线程或进程的情况下,新请求会发生什么?请求处理是以某种方式中断还是时间切片?
编辑: 据我所知,在处理请求(例如文件读取或CGI脚本运行)时,服务器无法接受新连接.这不意味着如果CGI脚本运行,比如2秒左右,这样的服务器可能会错过很多新的连接吗?
基本伪代码:
setup
while true
select/poll/kqueue
with fd needing action do
read/write fd
if fd was read and well formed request in buffer
service request
other stuff
Run Code Online (Sandbox Code Playgroud)
select()
和朋友阻止,但套接字I/O没有阻塞.只有在你有趣的事情发生之前,你才被阻止.service request
上面通常意味着打开一个文件,将其添加到列表中select
,并注意从那里读取的东西会转到某个套接字.适当时用FastCGI代替文件.编辑: