一、高性能服务器编程的提出
在之前的网络编程中,通常会有这样固定模式的一段代码
如上图,现在的问题就是:只要本次链接的客户端没有断开链接,那么就不会跳出while循环,也就意味着此时只能有一个客户端与服务器通讯,这样的设计已经不能满足要求了,所以提出了高性能服务器编程,一个服务器可以和多个客户端进行通讯。
二、多进程编程
1、思路
父进程负责accept(从监听队列获取链接),然后fork创建子进程。
子进程负责和客户端进行具体的通信
2、注意
(1)因为父子进程共享文件描述符,所以创建出子进程后,父进程没有必要单独传递文件描述符
(2)父进程创建出子进程后,关闭accept返回的文件描述符
A、如果父进程不关闭文件描述符,则后续创建的子进程会将所有的文件描述符继承下来
B、如果父进程不关闭文件描述符,则后续的链接的文件描述符不断增大,链接的客户端的数量就受一个进程最多打开的的文件的限制
3、代码
(1)服务器
因为客户端每关闭一个链接,就相当于杀死一个子进程,但是父进程一直存在,会导致僵死进程的产生,所以在代码中有处理僵死进程的函数fun。
(2)客户端
4、测试结果
(1)客户端:同时打开了三个客户端,输入的数据如下
(2)服务器
三、多线程编程
1、思路
主线程负责获取链接,然后通过pthread_create创建函数线程
函数线程负责和客户端进行具体的通信
2、注意
(1)创建函数线程时,必须将链接客户端的文件描述符(即accept的返回值)传递给函数线程,而且只能是值传递,因为如果通过全局变量或者地址传递,可能导致一个处于等待队列正在等待的文件描述符被立即获取的文件描述符覆盖,导致有一个文件描述符没有被处理。
(2)主线程不能创建出函数线程后,将文件描述符关闭。线程共用一个PCB,即多个线程用一个文件描述符,主线程关闭文件描述符,整个进程也就关闭了文件描述符,函数线程就没有办法使用了。
3、多进程与多线程
多进程:(1)创建多进程会消耗大量的系统资源
(2)如果子进程在很短时间内结束,系统的负担会加重
多线程:(1)创建线程资源消耗相对较小
(2)线程之间比进程之间数据共享更容易
(3)线程结束释放资源少
4、代码
(1)服务器
(2)客户端
5、结果
(1)客户端
(2)服务器