linux下并发服务器的设计

转自研发客:http://www.yanfake.com 

在网络环境下,当服务一个客户请求可能花费较长时间时,我们并不希望整个服务器被单个客户长期占用,而是希望同时服务多个客户。一般我们的处理方法是通过在while循环accept客户的链接,然后通过线程处理已经连接过来的客户。还有一种比较好的方法,就是通过unix的fork函数建立一个子进程来处理。
    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。注意内核对象的引用计数会增加两次,父进程一次,子进程一次。下面是伪代码:转自研发客:http://www.yanfake.com

pid_t pid;
int listenfd, connfd;
listenfd = Socket( ... );
/* fill in sockaddr_in{} with server's well-known port */ Bind(listenfd, ... );
Listen(listenfd, LISTENQ);
for( ; ; )
 {
connfd = Accept (listenfd, ... ); /* probably blocks */ // 图4.14 4.15 连接成功
if( (pid = fork()) == 0)
//图4.16 建立一个子进程成功,不过两个进程都在监听和连接着客户
//所以需要#2#1分别关闭子进程的监听和父进程的连接套接字

{
#2 Close(listenfd); /* child closes listening socket */
doit(connfd); /* process the request */
Close(connfd); /* done with this client */
exit(0); /* child terminates */
}
#1 Close(connfd); //#2,#1 图4.17 /* parent closes connected socket */
}


服务器建立的过程
:
linux下并发服务器的设计 - 静灯笼 - 静灯笼的博客

linux下并发服务器的设计 - 静灯笼 - 静灯笼的博客
linux下并发服务器的设计 - 静灯笼 - 静灯笼的博客
linux下并发服务器的设计 - 静灯笼 - 静灯笼的博客

posted @ 2012-01-06 10:36  yanfake  阅读(219)  评论(0编辑  收藏  举报