Linux下的进程环境
僵尸进程、孤儿进程、守护进程、进程组、会话、前台进程组、后台进程组
1,僵尸进程
子进程结束,父进程没有明确的答复操作系统内核:已收到子进程结束的消息。此时操作系统内核会一直保存该子进程的部分PCB信息,同时将进程的状态置为defunct--->僵尸进程
通过ps -ef | grep "xxx"找到僵尸进程的PID,通过kill -9 PID,也不能强制杀死;即僵尸进程是不能够被直接消除掉的
僵尸进程的危害:占用PCB资源(主要是PID资源),系统将会因为产生大量的僵尸进程,而没有可用的进程号来产生新进程,导致系统资源不足
僵尸进程的三种解决方案:
核心思想:父进程的知道子进程的结束,并且明确的回复操作系统,此时操作系统才能回收PCB资源,避免僵尸进程的产生
此时父进程需要处理子进程的结束,需要调用wait()、waitpid()函数族;wait()会等待子进程的结束,调用wait()的进程会阻塞,直到接收到子进程的消息才被唤醒;子进程结束时,会给父进程发送SIGCHLD(17)信号
(1)、wait()用的场合:只能在父子进程中,父进程等待子进程的结束,一直在阻塞,信号通知父进程,避免了子进程的僵尸状态
wait()方法只能在具有子进程的进程中使用,如果一个进程没有子进程,调用wait()方法会失败
wait()方法是用于处理子进程结束状态的,同时让父进程明确告知操作系统内核已经处理了子进程的结束,从而使得操作系统能够彻底回收子进程的PCB信息
(2)、:将僵尸进程的父进程exit()结束掉,此时僵尸进程被init进程接收;init进程会查看进程状态,发现是僵尸进程,就会通知操作系统将其回收
(3)、:写一个信号处理函数,signal(SIGCHLD, 函数指针),在信号处理函数中调用wait()即可,此时父进程就会知道子进程结束,会明确的回复操作系统(就是当子进程结束时,信号处理函数接收到SIGCHLD信号时,方才调用wait(),此时父进程才阻塞)
以上的解决方案:
方案一:使父进程长时间的阻塞
方案二:使父进程必须的结束掉
方案三:即可解决父进程的阻塞,又可避免僵尸进程的产生
2,孤儿进程
当父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程,由于进程不可能脱离进程树而独立存在,孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程被收养后进行正常的释放,没有危害
3,守护(精灵)进程
守护一个服务,长期驻留在内存中提供服务,不能够受制于终端;
如何让一个进程成为守护进程?
让一个进程脱离前台进程组关系,如下2步:i、创建一个新的会话;ii、构成孤儿进程

进程组:
在Linux下进程除了具有父子关系这样的组织关系以外,还具有分组的组织关系。任何一个进程都需要隶属于某个进程组
每一个进程组都拥有一个独立的进程组编号,可以通过getpgid()方法得到。
每一个进程组都拥有且只拥有一个组长进程。可以通过该组长管理其组内的其他进程的统一行为。(例如:组长进程若获取一个特殊的信号,该信号可以传递给组内所有进程)
进程组ID就是进程组组长的进程ID
进程组内的成员都是组长的子及子孙
创建:setpgid()
会话:
是进程组之间的某种关系,即每一个进程除了要归属于一个进程组以外,还需要归属于一个会话之中,会话的概念主要是从终端登陆到计算机之后得到的
当一个终端登录到计算机之后,为了方便将不同的终端隔离开,同时又能够充分合理的管理一个终端下产生的所有进程,因此而提出了会话的概念。换句不准确描述来说:会话就是用户登录之后从登录服务进程到shell进程所组成的集合
一个会话通常是由多个进程组组成的,分为两部分(前台进程组,后台进程组)。
会话具有一个会话首进程。操作系统通过会话的首进程来管理整个会话中的所有进程组。
创建会话:setsid()方法来创建一个新的会话,从而就会出现新的进程组
前台进程组:
前台进程组是和终端服务进程、bash进程捆绑在一起的,和终端直接相关。那么,终端的任何操作都会影响到所有的前台进程组
在shell交互环境中执行一个命令,就会产生一个新的进程来执行这个命令,不仅如此,还会产生一个新的进程组,该进程组的组长就是被执行命令而形成的新进程
前台进程组的最大问题就在于:由终端控制,终端只需要让进程组的组长停止,其组内的所有进程都会停止
后台进程组:
断开与终端的关系(并非输入、输出、错误输出关系),进程组关系,不再受制于终端而存在,这种进程与进程组被称之为后台的
后台进程存在的理由:需要常驻内存,提供一个服务
创建进程
(1)、创建进程:execv()和fork()
execv():不能使得进程数目增加,只是将外存以进程方式加载一个可执行文件到内存;这就相当于”替换“之术
fork():分身之术
pid = fork()
此时pid > 0,是父进程执行的代码段,但是此时的pid是子进程的PID
pid == 0,是子进程执行的代码段,表示创建子进程成功
pid < 0 创建进程失败,子进程返回-1,父进程返回错误编号
fork()得到的子进程和父进程的数据段、代码段、栈等数据内容是一样的
但是进程是高度独立的,所以其数据并没有共享;
每个进程所能进行的内存操作都是站在虚拟内存基础上的,一个进程在没有特殊手段的前提下,它只能看到自身,而看不到其他进程的存在!!!
因为虚拟内存的存在,进程以为自己所能访问的内存大小是:整个计算机的内存
进程的消亡:exit()
进程的消亡过程:进程通过调用exit告知操作系统内核其要结束。这是因为PCB的管理权是操作系统内核的,操作系统内核需要知道进程的结束,以便:(1)、告知该进程的父进程"你的子进程要结束了" (2)、回收PCB资源
(2)、fork()的优化
子进程并不需要父进程的所有数据,从父进程复制的数据都是无效的
优化:
i、当调用fork()产生子进程时,主要是将PCB先进行复制
ii、得到PCB之后,并为其分配了物理地址映射之后,并不会立即将父进程的内容复制给子进程
iii、而是进行了指向引用技术(子进程的代码段内容直接指向父进程的代码段),子进程的数据段内容一开始也是指向引用,堆段也是如此
iiii、Copy On Write技术:如果子进程或父进程要修改数据段/堆段的内容,则立即将要修改的部分内存拷贝出一份,然后才可以修改;从而在逻辑上保证了进程的逻辑性和封闭性
经过如上4个步骤的调整,fork()之后不会消耗过大的CPU和内存资源
技术的实现关键:进程的虚拟地址与计算机的物理地址映射关系的管理
此时就不会因为fork()而产生巨大的浪费
转自:
https://mp.weixin.qq.com/s/37fvXePIIxZFnklV_t0g5Q
《unix高级环境编程》
Linux下的进程环境的更多相关文章
- linux下监控进程需掌握的四个命令
linux下监控进程需掌握的四个命令 在LInux系统下,最困难的工作之一就是跟踪正在系统中运行的程序,尤其是现在,图形桌面使用很多的程序,只是为了生成一个桌面环境,系统中运行了太多的进程,幸运的 ...
- Django项目部署在Linux下以进程方式启动
Django项目部署在Linux下以进程方式启动 这是一篇关于如何在linux下,以后台进程的方式运行服务,命令改改基本上就通用了. 开发完Django项目后,需要把项目部署到linux环境下.当然, ...
- Linux下php-fpm进程过多导致内存耗尽问题
这篇文章主要介绍了解决Linux下php-fpm进程过多导致内存耗尽问题,需要的朋友可以参考下 最近,发现个人博客的Linux服务器,数据库服务经常挂掉,导致需要重启,才能正常访问,极其恶心,于是 ...
- (转)Linux下java进程CPU占用率高-分析方法
Linux下java进程CPU占用率高-分析方法 原文:http://itindex.net/detail/47420-linux-java-%E8%BF%9B%E7%A8%8B?utm_source ...
- Linux 下搭建 Hadoop 环境
Linux 下搭建 Hadoop 环境 作者:Grey 原文地址: 博客园:Linux 下搭建 Hadoop 环境 CSDN:Linux 下搭建 Hadoop 环境 环境要求 操作系统:CentOS ...
- 嵌入式 Linux下永久生效环境变量bashrc
嵌入式 Linux下永久生效环境变量bashrc 1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到 ...
- Linux下java进程CPU占用率高分析方法
Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...
- linux下对进程按照内存使用情况进行排序
linux下对进程按照内存使用情况进行排序的命令为:ps aux --sort -rss 详细解说参见 http://alvinalexander.com/linux/unix-linux-proce ...
- Linux下搭建PHP环境
转载于: http://www.uxtribe.com/php/405.html 该站下有系列PHP文章. 在Linux下搭建PHP环境比Windows下要复杂得多.除了安装Apache,PHP等软件 ...
随机推荐
- 利用Selenium实现图片文件上传的两种方式介绍
在实现UI自动化测试过程中,有一类需求是实现图片上传,这种需求根据开发的实现方式,UI的实现方式也会不同. 一.直接利用Selenium实现 这种方式是最简单的一种实现方式,但是依赖于开发的实现. 当 ...
- Strtus配置Tomcat出现问题
在使用 eclipse 过程中,如果你加入了某些自定义的框架(比如 struts)后,在启动 services 后, 控制台出现一片红色的字样,表明有问题.这时仔细查看 eclipse 控制台信息, ...
- 纯js编写验证信息提示正则匹配数字,字母,空值
1.显示效果 2,html结构 <div class="border_bg"> <div id="upcCode" style="p ...
- HDU 5372 Segment Game
/** 多校联合2015-muti7-1004 <a target=_blank href="http://acm.hdu.edu.cn/showproblem.php?pid=537 ...
- 【C语言】编写函数实现字符串旋转
//编写函数实现字符串旋转 #include <stdio.h> #include <assert.h> #include <string.h> void reve ...
- 通过Gulp流方式处理流程
http://www.cnblogs.com/gongcheng9990/archive/2014/11/25/4120434.html http://modernweb.com/2014/08/04 ...
- 【翻译自mos文章】11.2.0.4及更高版本号的asm实例中MEMORY_TARGET 和 MEMORY_MAX_TARGET的默认值和最小值
[翻译自mos文章]11.2.0.4及更高版本号的asm实例中MEMORY_TARGET 和 MEMORY_MAX_TARGET的默认值和最小值 来源于: Default and Minimum ME ...
- BZOJ 4027: [HEOI2015]兔子与樱花 贪心
4027: [HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号 ...
- java格式化时间到毫秒
转自:https://blog.csdn.net/iplayvs2008/article/details/41910835 java格式化时间到毫秒: SimpleDateFormat formatt ...
- Centos6.5添加Epel和Remi源安装Lamp环境
想搭建一个Lamp环境,因为编译安装太麻烦,对于我这样的新手来说,太过于复杂.而CentOS自带的Apache.MySql和PHP的版本都太低,不想用.上百度搜了一轮,原来可以通过添加Epel和Rem ...