服务器是作为后台进程运行的无限循环吗?

时间:2010-04-28 12:53:54

标签: c theory

服务器本质上是一个运行无限循环侦听端口的后台进程吗?例如:

while(1){
   command = read(127.0.0.1:xxxx);
   if(command){
      execute(command);
   }
}

当我说服务器时,我显然不是指物理服务器(计算机)。我指的是MySQL服务器,或Apache等。

完全披露 - 我没有时间浏览任何源代码。实际代码示例会很棒!

3 个答案:

答案 0 :(得分:6)

这或多或少是服务器软件通常做的事情。

通常它变得更复杂,因为无限循环“仅”接受连接,并且每个连接通常可以处理多个“命令”(或者在使用的协议中调用它们),但基本思想大致是这样。

答案 1 :(得分:5)

有三种“服务器” - 分叉,线程和单线程(非阻塞)。所有这些都通常以你展示的方式循环,不同之处在于有什么东西需要服务。

分叉服务就是这样。对于每个请求,调用fork()创建一个处理请求的新子进程,然后退出(或保持活动状态,以处理后续请求,具体取决于设计)。

线程服务就像分叉服务,但是创建了一个新的线程而不是一个新的进程来提供请求。就像叉子一样,有时线程会留下来处理后续请求。性能和占用空间的差异仅仅是线程与分支的差异。根据为客户端提供服务(并且容易发生变化)的内存使用情况,通常最好不要克隆整个地址空间。这里唯一增加的复杂性是同步。

单个进程(也称为单线程)服务器将只派一次进行守护进程。它不会产生新的线程,也不会产生子进程。它将继续轮询()套接字以找出文件描述符何时准备好接收数据,或者是否有可处理的数据。每个连接的数据保持在自己的结构中,由各种状态(写入,等待ACK,读取,关闭等)标识。如果操作得当,这可能是一种非常有效的设计。在等待工作时,不是让多个子节点或线程阻塞,而是在准备就绪时为您提供单个进程和事件循环服务。

在某些情况下,单线程服务会产生多个线程,但是其他线程无法处理传入请求,可能(例如)在线程中设置本地套接字,允许管理员获取状态所有的联系。

对于非阻塞的http服务器进行一点点Google搜索会产生一些有趣的手动Web服务器,这些服务器被编写为代码高尔夫挑战。

简而言之,不同之处在于输入无限循环后会发生的事情,而不仅仅是无限循环:)

答案 2 :(得分:2)

说的是,是的。服务器只是“永远循环”并提供服务的东西。但是,通常你会发现“守护进程”会执行诸如打开STDOUT和STDERR到文件句柄或/ dev / null以及双叉等操作。从某种意义上说,您的代码是一个非常简单的“服务器”。