【linux】多进程和多线程并发服务器编程模型 linux服务器开发相关视频解析 : 100行代码搞定用户态协议栈 linux多线程之epoll原理剖析与reactor原理及应用 c/c++ linux服务器开发免费学习地址:c/c++ linux后台服务器高级架构师 一、多进程并发服务器 在网络程序里面,一般来说都是许多客户对应一个服务器(多对一),为了处理客户的请求,对服务端的程序就提出了特殊的要求。目前最常用的服务器模型有:迭代服务器:服务器在同一时刻只能响应一个客户端的请求;并发服务器:服务器在同一时刻可以响应多个客户端的请求。 1、多进程并发服务器的概念 在 Linux 环境下多进程的应用很多,其中最主要的就是网络/客户服务器。多进程服务器是当客户有请求时,服务器用一个子进程来处理客户请求。父进程继续等待其它客户的请求。这种方法的优点是当客户有请求时,服务器能及时处理客户,特别是在客户服务器交互系统中。对于一个 TCP 服务器,客户与服务器的连接可能并不马上关闭,可能会等到客户提交某些数据后再关闭,这段时间服务器端的进程会阻塞,所以这时操作系统可能调度其它客户服务进程,这比起迭代服务器大大提高了服务性能。 2、多进程并发服务器的流程 (1)面试题—>为什么要多次关闭文件描述符? 每一个socket描述符都有对应的引用计数,该计数存在文件表中。上面程序中打开了lfd和cfd,引用计数分别为1和1,在fork()以后,子进程复制了父进程的socket描述符,所以引用计数也会增加,即lfd和cfd的引用计数都变成了2。此时在子进程中关闭lfd(close(lfd)),在父进程中关闭close(cfd)。这个就保证了子进程处理与客户的连接,父进程负责在监听套接字lfd再次调用accept来接收客户的下一个连接。
从上面分析和图示可以看出socket描述符是有引用计数的,只有当引用计数为0的时候,close才会发送FIN报文,这就解释了子进程仍然可以用cfd进行数据处理了,子进程处理完后再次调用close,此时引用计数从1变为0,最后发送FIN报文结束cfd连接。而对于lfd,只有在子进程中进行了close,父进程中一直保留着引用计数为1,所以父进程通过for循环可以持续accept新连接。 (2)面试题—>shutdown和close的区别? 通常调用close函数对socket进行关闭,为啥还要选用shutdown来关闭socket,原因有如下两个:在介绍close的时候,已经说明了,close只有在对应socket的引用计数为0时,才会真正发送FIN报文来关闭这个连接,shutdown没有这个限制,直接发送FIN报文。close同时终止了读和写两个方向的数据传输。但是TCP的双工的,我们有时候需要只接受数据,而不发送数据,shutdown可以指定关闭读端或者写端。 3、TCP多进程并发服务器的demo 【文章福利】需要C/C++ Linux服务器架构师学习资料加群(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等)
二、多线程并发服务器 1、多线程并发服务器的概念 多线程服务器是对多进程的服务器的改进,由于多进程服务器在创建进程时要消耗较大的系统资源,所以用线程来取代进程,这样服务处理程序可以较快的创建。据统计,创建线程与创建进程要快 10100 倍,所以又把线程称为“轻量级”进程。线程与进程不同的是:一个进程内的所有线程共享相同的全局内存、全局变量等信息,这种机制又带来了同步问题。 2、多线程并发服务器的流程 pthread_create(&thread_id, NULL, client_process, (void *)&cfd) 在这里我们使用的是按地址传递,所以会有这么一个问题,假如有多个客户端要连接这个服务器,正常的情况下,一个客户端连接对应一个 cfd,相互之间独立不受影响,但是,假如多个客户端同时连接这个服务器,A 客户端的连接套接字为 cfd,服务器正在用这个 cfd 处理数据,还没有处理完,突然来了一个 B 客户端,accept()之后又生成一个 cfd, 因为是地址传递, A 客户端的连接套接字也变成 B 这个了,这样的话,服务器肯定不能再为 A 客户端服务器了,这时候,我们就需要考虑多任务的互斥或同步问题了,这里通过互斥锁来解决这个问题,确保这个cfd值被一个临时变量保存过后,才允许修改。 3、TCP多线程并发服务器的demo
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/73385.html