linux ps 进程组,linux进程管理(2)---进程的组织结构

一、目的

linux为了不同的进程管理目的,使用了不同的方法组织进程之间的关系,为了体现父子关系,使用了“树形”图;为了对同一信号量统一处理,使用了进程组;为了快速查找某个进程,使用了哈希表;为了进程调度,创建了运行队列、等待队列,将不同运行状态的进程放入不同的队列中。

本文将讲述进程间的组织方式及特点。

二、父子关系、兄弟关系

系统启动后创建第一个进程0(swapper,也叫idle)和进程1(init),之后进程0进入idle状态,当没有进程可以被调度的时候运行该进程,不做具体的事情;系统其它的进程都是由进程1创建的,所以进程1自然而然就是系统所有进程的父进程,系统进程之间的关系也就呈现出“树形”结构。

进程1还负责处理僵尸进程。由于进程0不具备处理僵尸进程的能力,所以不能为进程1创建兄弟进程,否则当进程1的兄弟进程处于僵尸态时,系统就无法处理这些僵尸进程了。

当一个进程创建新进程时,默认新进程是当前进程的子进程;当前进程是新进程的父进程。当使用CLONE_PARENT参数标志创建新进程时,当前进程和新进程拥有相同的父进程。

当两个进程之间是父子关系时,父进程的children成员连接了所有子进程;子进程的sibling成员连接了该子进程的所有兄弟进程(即父进程的所有子进程),real_parent成员指向实际的父进程,parent成员指向了实际处理子进程SIGCHLD信号的进程。

使用ps命令的-H参数可以显示进程的父子关系。例如,在当前bash下新建子进程bash,并在子进程bash中创建子进程ps,使用ps-H命令显示效果如下:

adda59e4644384f4d8a307c8528a92c1.png

三、进程组

在《linux进程管理(1)---进程描述符》的第三节详述了linux下进程与进程组的概念,为了满足POSIX标准,linux提出了进程组的概念;多个进程合作完成一个功能,那么这些进程可以放到一个进程组中。

每个进程组都会指定一个进程为“组长”;“组员”通过使用group_leader成员指向“组长”;同时,“组长”使用thread_group成员将“组员”组织起来。

使用进程组可以解决系统给一组进程发送同一信号量的场景,在该场景下,系统只需给“组长”发送信号量即可,所以处于同一进程组的进程之间共享信号量资源。

默认情况下,新进程独自组成了一个进程组并且承担“组长”的责任;如果使用CLONE_THREAD参数标志,指定新进程与当前进程处于同一进程组,那么,此时当前进程与新进程之间不存在父子关系(实际上,新进程指向当前进程的父进程),但是这两个进程拥有相同的“组长”,所以,在这种情况下,从进程组的角度才能准确表达进程之间的关系。

使用ps命令的-eLf参数可以查看进程组关系,显示结果中PID表示进程组ID(注意,此时PID的含义是tgid)、PPID表示父进程ID、LWP表示进程ID、NLWP表示进程组中进程的个数。

例如,使用ps

-eLf命令后,可以看到rsyslogd进程组有四个“组员”(即四个线程),“组长”的pid是821,“组员”的pid分别是821、844、895、896;821“组员”也是该组的“组长”。

3c9fe81fdcb86fb1c84791634291c67e.png

默认情况下proc文件系统显示的是进程组“组长”的文件夹,使用ps-eLf命令找到进程组“成员”的pid(对应轻量级进程的pid即LWP),然后直接在proc目录下cd到pid文件夹中即可。

四、哈希表

为了快速查找某个进程,系统将所有进程连接在一个全局的链表中,表头是init进程的tasks成员;当一个进程被创建时,会将该进程的tasks成员链接到init进程的tasks中。

所以,从当前进程出发,向上寻找父进程,一直找到init进程为止;那么就可以从init进程的tasks成员链表找到任意一个进程。

使用ps命令的-AL参数可以显示所有进程,包括轻量级进程。

五、运行队列、等待队列

调度程序使用运行队列和等待队列管理进程的调度,处于运行队列中的进程满足调度条件,随时等待调度程序将其放入cpu运行;处于等待队列中的进程由于缺乏某个资源而睡眠,当条件满足时被放入运行队列中。

运行队列管理的是处于运行态的进程,等待队列管理的是睡眠态的进程(可中断态和不可中断态),其他状态的进程(退出态、停止态等)因为和系统调度无关,所以不会放入队列中管理。因此,只有运行态和睡眠态的进程才会被放入队列中。

处于运行态的进程具有不同优先级,根据优先级又可以把进程放到不同优先级的运行队列中。

等待队列是linux比较常用的数据结构,在很多地方都使用该结构,例如:中断处理、进程同步等场景。处于睡眠态的进程可能因为不同的事件而阻塞,所以根据事件类型又可以把进程放到不同事件的等待队列中。

六、全景视图

为了有个直观的感受,给出一幅进程组织关系的全景视图。

从图中可以看出,内核进程idle有两个孩子kthreadd、init;init进程有三个孩子ksyslogd,并且这三个孩子组成了一个进程组,“组长”是进程826,“组员”是进程845、进程887;此时,有一个等待队列,队列中有两个成员,分别指向了进程845、进程887。

3dfa22489b20cceff4c452e04446d6c8.png

七、总结

为了管理进程的创建、消亡(处理僵尸进程等操作)使用了父子、兄弟关系;为了统一处理同一信号量,使用进程组关系;为了方便全局查找,使用了哈希表关系;为了调度程序,使用了运行队列、等待队列数据结构。

我们不仅要掌握这些进程组织关系的具体含义,更重要的是思考linux精心设计这些组织关系背后的“驱动力”和技巧。当我们以后遇到类似场景时,能够“拿来主义”为我所用。

版权声明:

原创作品,如非商业性转载,请注明出处;如商业性转载出版,请与作者联系。

原文:http://blog.csdn.net/luomoweilan/article/details/21411943

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt】Qt之进程间通信(共享内存)【转】

简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信。但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种跨平台…

python progressbar print_python print 进度条的例子

def progress(width, percent):print "%s %d%%\r" % ((%%-%ds % width) % (width * percent / 100 * ""), percent),if percent > 100:printsys.stdout.flush()首先,先说明一下print的一些用法:和C语言一样,字符串里的匹配使用‘…

linux中常用的shell脚本,Linux常用shell脚本

1. 设置ssh、scp命令的认证运行一次脚本后,以后再使用ssh或scp命令登录远程机器时不再提示输入密码-----------------setkey.sh开始-------------------------OLDDIRpwdif [ -z "$1" ]; thenecho Need userhost info;exit;fi;cd $HOME;if [ -e "./.s…

HDU 2042:不容易系列之二

不容易系列之二 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 5 Accepted Submission(s) : 5 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 你活的不容易,我活…

统计建模与r软件_【统计建模与R软件笔记】008 描述统计量(1)

今天我们开始来学习描述统计量吧!位置的度量位置的度量就是用来描述定量资料的集中趋势的统计量,常用的有均值、众数、中位数、百分位数等。1.均值 mean( )形式:mean(x, trim 0, na.rm FALSE)x 是对象(如向量、矩阵、数组或数据框)trim 是计…

npm环境安装linux,Node.js环境在linux上的部署教程

我们以centOS为例来说说如何部署node.js环境一 打开centos,然后开始下载node.js包curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -yum -y install nodejs二 安装gcc环境yum install gcc-c make安装完成!三 安装nodejs的npm,这是一个包程序工具,类似于…

Nancy跨平台开发总结(三)发布到Jexus Web服务器

在Centos7上安装Mono yum install yum-utils rpm --import "http://keyserver.ubuntu.com/pks/lookup?opget&search0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF" yum-config-manager --add-repo http://download.mono-project.com/repo/centos/ yum install m…

stat函数_数据分析工具入门 掌握这些Excel函数就够了

1.什么是函数可以把函数理解为一个可以控制的黑箱子,输入X到黑箱子中,他就会输出Y,参数就是黑箱子的控制开关,打到不同的档位,黑箱子会输出不同的Y。2.常见函数分类文本清洗函数关联匹配函数逻辑运算函数计算统计函数时…

linux安装nodejs一键脚本,ubuntu16.04部署nodejs+vue框架脚本

#获取和安装nodewget https://nodejs.org/dist/v8.9.2/node-v8.9.2-linux-x64.tar.xzxz -d node-v8.9.2-linux-x64.tar.xztar xf node-v8.9.2-linux-x64.tar -C /usr/local#创建软连接ln -s /usr/local/node-v8.9.2-linux-x64 /usr/local/node#配置环境并生效echo "export…

Linux下jdk配置环境变量

vi /etc/profile在里面添加如下内容JAVA_HOME/usr/local/java/jdk1.6.0_01PATH$JAVA_HOME/bin:$PATHCLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport JAVA_HOMEexport PATHexport CLASSPATH变量生效重新登录即可5.进入 /usr/bin/目录cd /usr/binln -s -f /us…

mysql获取当前时间毫秒_MySQL性能指标及计算方法

是新朋友吗?记得先点蓝字关注我哦~ 今日课程菜单 Java全栈开发 | Web前端+H5 大数据开发 | 数据分析 人工智能+Python | 人工智能+物联网 来源:小职(z_zhizuobiao) 找我:✅ 解锁高薪工作 ✅ 免费获取干货教程 未 完 待 续 绝大多数MySQL性能指标可以通过以下两种方式获取:…

linux时间戳转换不对,转换为unix时间戳不正确

我有我写了一个函数(如果有一个很好的标准替代,请让我知道...)转换为unix时间戳不正确time_t get_unix_time(string time_str) {time_t loctime;time(&loctime);struct tm *given_time;time_str time_str.substr(0, time_str.find_first_of(.));replace(time_s…

什么是REST API?

REST指一组架构约束条件和原则,满足约束条件和原则的应用程序设计。架构,软件体系结构分为三部分:构建,用于描述计算机;连接器,用于描述构建的链接部分;配置将构建和连接器组成有机整体。web基本…

python socket send_python socket 连续send,出现粘包问题

使用网上socket代码实现ssh功能,如下:server.py#服务端Linux系统下:处理命令并返回import socketimport os#声明类型,生成socket链接对象server socket.socket()#监听接收端口元组(本地,端口),绑定要监听的…

linux系统安装佳能打印机驱动,在ubuntu16.04 64-bit上安装佳能打印机驱动Linux_UFRII_PrinterDriver_V320_us_EN...

在ubuntu16.04 64-bit上安装佳能打印机驱动Linux_UFRII_PrinterDriver_V320_us_EN发布时间:2018-04-06 21:46,浏览次数:631, 标签:ubuntubitLinuxUFRIIPrinterDriverusEN1. 安装一些依赖项 (不确定它们是否都需要):sudo apt install libc6-i3…

python重复输入上面指令_stdin stdout python:如何重复使用同一输入文...

我对Python很陌生,对stdin stdout方法甚至更新.不过,我需要使我的脚本可用于UNIX命令,以便例如使用我的脚本一次处理2个输入文件.该脚本与命令行参数完美配合:newlist []def f1()....def f2(input_file):vol_id sys.argv[3]for line in input_file:if ... :line …

linux条件变量cond,Linux 条件变量 pthread_cond_signal及pthread_cond_wait

#include#include#include#includepthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER;/*静态初始化*/pthread_cond_t cond PTHREAD_COND_INITIALIZER; //init condvoid *thread1(void*);void *thread2(void*);int i 1; //globalint main(int argc,char* argv[]){pthread_…

哈希查找

哈希查找之前,我们要弄清楚哈希技术,哈希技术是在记录的存储位置和记录的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值的映射f(key),若查找集合中存在这…

python两人一碰_python运用pygame库实现双人弹球小游戏

使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截失败的一方输掉游戏,规则类似于简化版的乒乓球。因为是第一次用pygame写python小游戏并且只用了两三个小时&…

fedora 安装Linux源码,如何在 Fedora 29/30 上安装 VS Code

Visual Studio Code 简称 VS Code 是微软开发的一款跨平台的源代码编辑器。 它具有内置的调试支持,嵌入式 Git 控件,语法突出显示,代码完成,代码重构和代码片段。Visual Studio Marketplace 提供了许多插件和扩展来扩展VS代码的功…