高性能服务器编程-多进程编程与多线程编程
来源:互联网 发布:心中的秘密知乎 编辑:程序博客网 时间:2024/04/30 22:30
一、高性能服务器编程的提出
在之前的网络编程中,通常会有这样固定模式的一段代码
如上图,现在的问题就是:只要本次链接的客户端没有断开链接,那么就不会跳出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)服务器
- 高性能服务器编程-多进程编程与多线程编程
- 高性能服务器编程--多进程和多线程
- Linux 高性能服务器编程——多进程编程
- Linux高性能服务器编程——多进程编程
- Linux——高性能服务器编程,多进程编程
- 高性能服务器编程——多进程编程
- linux高性能服务器编程之多进程
- Linux 高性能服务器编程——多线程编程
- 高性能Socket服务器编程
- Linux高性能服务器编程
- Linux高性能服务器编程
- 高性能服务器编程感悟
- Linux高性能服务器编程——多线程编程(上)
- Linux高性能服务器编程——多线程编程(下)
- Linux的多进程与多线程编程
- Perl 多进程与多线程编程
- 多线程与多进程编程学习整理
- linux网络编程/多线程多进程服务器与进程线程池
- Qt退出码255
- vim计算器
- nmcli命令集
- poj2109 Power of Cryptography【坑~泪目】【水过~】【刷题计划】
- request.getServletContext()只能在jdk6以上
- 高性能服务器编程-多进程编程与多线程编程
- NVIDIA新作解读:用GAN生成前所未有的高清图像(附PyTorch复现) | PaperDaily #15
- Java面试的一些总结
- Mybatis返回Map时,如果值为空的话,那么key也不会被加入到map中的解决办法
- [Eclipse]svn: E200007: Runner for 'org.tmatesoft.svn.core.wc2.SvnMerge' command have not been found;
- SpringMVC(一)初步认识
- 洗牌算法
- 记一次网站运行速度变慢的诊断修复过程
- JAVA三种常量池的区别