服务器本质上是一个运行无限循环侦听端口的后台进程吗?例如:
while(1){
command = read(127.0.0.1:xxxx);
if(command){
execute(command);
}
}
Run Code Online (Sandbox Code Playgroud)
当我说服务器时,我显然不是指物理服务器(计算机).我指的是MySQL服务器,或Apache等.
完全披露 - 我没有时间浏览任何源代码.实际代码示例会很棒!
有三种"服务器" - 分叉,线程和单线程(非阻塞).所有这些都通常以你展示的方式循环,不同之处在于有什么东西要服务时会发生什么.
分叉服务就是这样.对于每个请求,调用fork()创建一个处理请求的新子进程,然后退出(或保持活动状态,以处理后续请求,具体取决于设计).
线程服务就像分叉服务,但是创建一个新线程来代替整个新进程来提供请求.就像叉子一样,有时线程会留下来处理后续请求.性能和占用空间的差异仅仅是线程与分支的差异.根据不为客户端提供服务的内存使用情况(并且容易发生变化),通常最好不要克隆整个地址空间.这里唯一增加的复杂性是同步.
单个进程(也称为单线程)服务器只会派生一次进行守护进程.它不会产生新线程,也不会产生子进程.它将继续轮询()套接字以找出文件描述符何时准备好接收数据,或者是否有可处理的数据.每个连接的数据保持在自己的结构中,由各种状态(写入,等待ACK,读取,关闭等)标识.如果操作得当,这可能是一种非常有效的设计.在等待工作时,您没有多个子节点或线程阻塞,而是在准备好时为您提供单个进程和事件循环服务请求.
在某些情况下,单线程服务会产生多个线程,但是其他线程无法处理传入请求,例如,可能(例如)在线程中设置本地套接字,允许管理员获取所有连接的状态.
对于非阻塞的http服务器进行一点点Google搜索将会产生一些有趣的手动滚动Web服务器,这些服
简而言之,差异是一旦进入无限循环就会发生的事情,而不仅仅是无限循环:)