首页 / LINUX / Linux多进程的应用
Linux多进程的应用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux多进程的应用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2729字,纯文字阅读大概需要4分钟。
内容图文
![Linux多进程的应用](/upload/InfoBanner/zyjiaocheng/960/acefff97c3074b549966b513902c8135.jpg)
并发的概念
在之前介绍socket通信的时候,socket的服务端在同一时间只能和一个客户端通信,并不是服务端有多忙,而是因为单进程的程序在同一时间只能做一件事情,不可能一边等待客户端的新连接,一边与其它的客户端进行通信。
如果把socket服务端改为多进程,在每次accept到一个客户端的连接后,生成一个子进程,让子进程负责和这个客户端通信,父进程继续accept客户端的连接,socket的服务端在监听新客户端的同时,还可以与多个客户端进行通信。这就是并发,如下图:
并发的应用
修改socket服务端的代码,如下:
首先,在CTcpServer类中增加两个成员函数,如下:
main函数略做修改,如下:
上图中,新增的代码已突出显示。
解析一下:
- 当有客户端连上来的时候,主进程执行fork,这时候会产生两个客户端的socket(m_clientfd被复制了一份),对父进程来说,只负责监听客户端的连接,不需要与客户端通信,所以父进程关闭客户端的socket,即close(m_clientfd)。
- 当有客户端连上来的时候,主进程执行fork,这时候也会产生两个服务端的socket(m_listenfd被复制了一份),对子进程来说,只需要与客户端通信,不需要监听客户端的连接,所以子进程关闭监听的socket,即close(m_listenfd)。
- 子进程执行完任务后,要调用retrun或exit(0)退出,如果没有调用return或exit(0),子进程将一直存在,直到父进程退出才消失。
僵尸进程
1、僵尸进程产生的原因
一个子进程在调用return结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个僵尸进程。
僵尸进程是子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源。如果父进程先退出,子进程被系统接管,子进程退出后系统会回收其占用的相关资源,不会成为僵尸进程。
先启动服务端程序book249,然后多次启动客户端程序book247,查看进程,如下图,被选中的就是僵尸进程,有<defunct>标志。
如果父进程出退出,僵尸进程随之消失。
2、僵尸进程的危害
僵尸进程在消失之前会继续占用系统资源。
3、如何解决僵尸进程
解决僵尸进程的方法有两种。
子进程退出之前,会向父进程发送一个信号,父进程调用waid函数等待这个信号,只要等到了,就不会产生僵尸进程。这话说得容易,因为在并发的服务端程序中这是不可能的,因为父进程要做其它的事,例如等待客户端的新连接,不可能去等待子进程的退出信号。所以这种方法我就不介绍了。
另一种方法就是父进程直接忽略子进程的信号,具体做法很简单,在主程序中增加以下代码:
signal库函数的用法暂时不介绍,以后有详细说明。
应用经验
在学习了多进程的基础知识之后,初学者可能会认为多进程是一个高大上的技术,认为多进程处理数据肯定比单进程快,其实不是。在实际开发中,采用多进程的主要目的是处理多个并发的任务,而不是为了提高程序的效率。
从效率方面来说,多进程的效率比单进程要低,原因很简单,因为在有限的硬件资源中,多进程的内存开销更大,还会产生资源锁和竞争。
就像多个人端着一盆水,不如一个人端着一盆水走得快。
课后作业
本章节的重点是介绍多进程的应用场景,属于概念性的知识,代码其实很简单,只要各位理解了多进程应用的原理就行了。
但是,文章中提到的知识点,各位一定要用程序去测试它。
学习交流
我建了一个QQ群701117364,有决心想学习的人可以加入,群中有学习资源,也欢迎高手加入。
内容总结
以上是互联网集市为您收集整理的Linux多进程的应用全部内容,希望文章能够帮你解决Linux多进程的应用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。