TCP服务器IO模型 之 并发阻塞
1. 引言
在 Linux 环境下多进程的应用很多,其中最主要的就是网络/客户服务器。多进程服务器是当客户有请求时,服务器用一个子进程来处理客户请求。父进程继续等待其它客户的请求。这种方法的优点是当客户有请求时,服务器能及时处理客户,特别是在客户服务器交互系统中。对于一个 TCP 服务器,客户与服务器的连接可能并不马上关闭,可能会等到客户提交某些数据后再关闭,这段时间服务器端的进程会阻塞,所以这时操作系统可能调度其它客户服务进程,这比起循环服务器大大提高了服务性能。
2. 多进程并发服务器实现思路
TCP 并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理。以下为多进程并发服务器和客户端交互的拓扑结构:
- 客户端 c1 会对服务器发起连接,并且产生连接套接字 fd1
- 服务器S为了能够实现并发阻塞,会产生一个与其一模一样的子进程,并且屏蔽与客户端c1的连接套接字fd
- 子进程1只需要负责与客户端 c1 进行通信,所以可以屏蔽监听端点。
- 子进程1负责与客户端 c1 进行通信
- 当有客户端 c2 进行链接时,如此类推。
问题思考:
-
客户端退出时对应子进程要如何处理,避免僵尸进程?
答:子进程一以signal(SIGCHLD, cleanup)
信号通知的方式通知父进程退出清理僵尸