任督二脉之进程管理(1)

进程生命周期,进程生命周期创建、退出、停止,以及僵尸进程是什么意思。

一、进程的定义

进程--线程。进程是资源分配单位;搞清楚进程就是搞清楚进程资源情况。进程控制块PCB是OS的通用叫法。task_struct结构体描述进程的资源情况。如下图所属:

1)*mm描述内存资源

2)*fs:文件系统资源

3)文件资源:注意与fs的区别,打开文件的fd数组fd_array记录打开文件的fd

4)*signal:该进程的信号处理函数(用户理解为多态)

5)pid:数量有限

节选自《linux操作系统原理与应用》:

传统上,这样的数据结构(task_struct)叫做进程控制块PCB。linux中PCB是一个相当庞大的结构体,其域多达80多项,它的所有域按其功能可分为以下几类:

  • 状态信息 描述进程的动态变化
  • 链接信息 描述进程的父子关系
  • 各种标识符 用简单数字对进程进行标识
  • 进程间通信信息 描述多个进程在同一任务 上的协作工作
  • 时间和定时器信息 描述进程在生命周期内使用CPU时间的统计、计费等信息
  • 调度信息 描述进程优先级、调度策略等信息
  • 文件系统信息 对进程使用文件情况进行记录
  • 虚拟内存信息 描述每个进程拥有的地址空间
  • 处理器环境信息 描述进程的执行环境(处理器的寄存器及堆栈等)

二、pid

1)pid数量有限,所以不能无限创建进程:32位-32768  64位-131072

2)fork炸弹的原理

改写一下代码

1 :() #函数定义
2 {
3     :|:&  #调用自己,然后|管道,管道里面也递归调用:创建进程,然后&后台执行
4 }
5 ;  #函数结束
6 :  #调用自己

|是管道,&是后台执行。

一直在创建进程,把pid耗尽,kill、killall等命令也要创建一个进程执行,但是pid已经耗尽,无法执行,用户感觉系统死掉。

三、task_struct管理

1)形成链表:最方便,但是进程之间的关系是树型关系,父子进程关系,pstree命令可以查看,所以也可以用树。

[email protected]:~$ pstree
systemd─┬─ModemManager─┬─{gdbus}
        │              └─{gmain}
        ├─NetworkManager─┬─dhclient
        │                ├─dnsmasq
        │                ├─{gdbus}
        │                └─{gmain}
        ├─VGAuthService
        ├─accounts-daemon─┬─{gdbus}
        │                 └─{gmain}
        ├─acpid

2)形成树:这样可以反应进程之间的关系,找父子关系比较简单,但是有时候需要检索一个进程的pid,比如 kill -2 8934,这种情况下树检索比较慢了。使用哈希可以快速查找

3)形成哈希

总结:快速遍历使用链表,想查找父子进程用树,想通过pid快速查找进程用哈希。所以linux里面这三种数据结构都有,使得各种场景快速达到目的,以空间换时间。

四、进程生命周期

1)就绪态:fork出来就是就绪态,linux里面就绪和运行的状态标志是一样的

2)运行态:linux里面就绪和运行的状态标志是一样的,时间片用完或者被抢占进入就绪态

3)睡眠态:等资源就进入睡眠态,等到资源就进入就绪态

4)僵尸态:进程死掉先成为僵尸,用于描述task_struct及成员还没有消失,但是进程占用的资源已经消失;需要父进程wait4(waitpid等)等待僵尸才消失(父进程清理子进程)。所以僵尸状态是很短的。

僵尸态的原因是父进程可以获取子进程的退出码exit_code,即退出原因。

例子:杀死子进程,观察父进程能监控到子进程死亡原因。

 1 #include <stdio.h>
 2 #include <sys/wait.h>
 3 #include <stdlib.h>
 4 #include <unistd.h>
 5
 6 int main()
 7 {
 8     pid_t pid, wait_pid;
 9     int status;
10
11     pid = fork();
12
13     if(pid == -1)
14     {
15         perror("Cannot create new process");
16         exit(1);
17     } else if (pid == 0)
18     {
19         printf("child process id: %ld\n", (long)getpid());
20         pause();
21         _exit(0);
22     } else
23     {
24         #if 0 /* define 1 to make child always a zombie */
25         printf("ppid: %d\n", getpid());
26         while(1);
27         #endif
28         do
29         {
30             wait_pid = waitpid(pid, &status, WUNTRACED | WCONTINUED);
31
32             if(wait_pid == -1)
33             {
34                 perror("cannot using waitpid function");
35                 exit(1);
36             }
37
38             if(WIFEXITED(status))
39             {
40                 printf("child process exits, status = %d\n", WEXITSTATUS(status));
41             }
42
43             if(WIFSIGNALED(status))
44             {
45                 printf("child process is killed by signal %d\n", WTERMSIG(status));
46             }
47
48             if(WIFSTOPPED(status))
49             {
50                 printf("child process is stopped by signal %d\n", WSTOPSIG(status));
51             }
52
53             if(WIFCONTINUED(status))
54             {
55                 printf("child process resume running...\n");
56             }
57
58         }while(!WIFEXITED(status) && !WIFSIGNALED(status));
59
60         exit(0);
61     }
62 }

kill -9 pid是杀不死僵尸进程的,因为僵尸进程已经死掉了。父进程一直不清理僵尸进程,可以通过杀死僵尸进程的父进程来清理。

僵尸进程的资源已经释放,所以不会造成内存泄漏。

工程中观察进程是否内存泄漏:多点连续采样法。震荡收敛没有泄漏,震荡发散(上升)是内存泄漏。

僵尸太多也不好,占用pid。

5)停止态:人为停止进程,发送停止信号:1)ctrl+z,作业控制(JC),发送contine信号继续运行(fg\bg),kill发送信号等;2)GDB调试;

cpulimit工具控制进程的cpu利用率:cpulimit -l 20 -p pid , 20为允许的cpu利用率,实际结果不会那么精

确。

五、 fork

1)先看一个例子,fork叉子

结果为打印6个(1*2+2*2):

2)fork返回值:子进程返回0,父进程返回子进程的pid。

运行结果:

父子进程哪个先跑默认不确定,但是有内核可调试开关/proc,倾向于让子进程先跑。

3)子死父清场:linux里面总是白发人送黑发人

4)深度睡眠:必须等到资源才能醒,不响应信号,所以kill -9也杀不死。why?major page fault,代码段命运命中,还在硬盘,进程就进入深度睡眠,如果响应信号,那么信号处理函数有可能也在硬盘,没有载入内存,再次发生page fault,嵌套。中断响应吗?中断是正在执行被中断,已经睡眠了,怎么中断。

时钟中断也不可以唤醒。

浅度睡眠:资源来了醒,信号来了也可以醒。时钟中断可以唤醒。

睡眠是内核调用进入,驱动也可以。用户态不可以直接调用睡眠。

答疑:getppid()获取父进程的pid。

书籍:operating system three piecies 全英文

课后作业代码地址:

原文地址:https://www.cnblogs.com/shihuvini/p/8413189.html

时间: 2024-07-30 09:44:25

任督二脉之进程管理(1)的相关文章

任督二脉之进程管理(2)

一.第二次课大纲1.fork.vfork.clone2.写时拷贝技术3.Linux线程的实现本质4.进程0和进程15.进程的睡眠和等待队列6.孤儿进程的托孤,SUBREAPER1.fork.vfork.Copy-on-Write例子2.life-period例子,实验体会托孤3.pthread_create例子,strace它4.彻底看懂等待队列的案例 二.fork 1)fork创建一个进程.p1是一个task_struct,p2也是一个task_struct,调度器只通过task_struct

案例干货|用友罗涛:打通产品开发的任督二脉

[精彩预告]用友集团开发管理部总经理罗涛将于5月21日在上海MPD工作坊进行<破解4小时上线传说>的3小时分享.通过一个故事引入互联网+产品开发的迭代思路.价值发掘和发布规划等核心思想和工具,将结组利用小图团队的力量使用影响地图.用户故事地图.无代码验证等演练手段在3个小时的工作坊内快速发布一个产品,带领学员在操作中理解精益和敏捷.文章来源:公众号 :msup(ID:msupclub)关注回复“体验工坊”有惊喜. 导读:在面对需求的变化无常.人员的变动和技术的更新时,对客户价值的识别尤其重要,

打通电商多模式支持的“任督二脉”

你听说过任督二脉吗?像这样~ 咳咳~今天不讲武功,讲电商平台设计的功夫~ 背景 当今的电商可不仅仅是B2C商城,接下来还会有O2O,往后可能还会有商超.奥莱.二手交易...且称之为业务模式~而每个业务模式下还会有预售.竞拍.拼团等不同组合的子模式. 可是我商城的商品列表页不想展示O2O的商品啊,商品列表的数据希望按一定规则相互隔离.其他模块,有的出于操作习惯的考虑不隔离,有的出于用户行为的考虑需要隔离. 各模块数据隔离需求如下   列表页 商详页 商品组 优惠券 活动 订单 ... 原商城 隔离

K2 BPM_当K2遇上医药,用流程打通企业的任督二脉_业务流程管理系统

据调查,如今仍有60%的医药企业,存在合规经营和利润下降的困扰,在“研”.“产”.“供”.“销”的运营过程中,时时伴随着严苛的管理政策和法规.如何加强企业跨部门.跨组织.跨业务线的执行能力,始终是管理层最关注的话题.而流程,则是打通“任督二脉”,提高执行力的最佳解决办法. 当K2遇上医药 K2在医药行业的核心应用 -医疗推广活动管理 -讲者管理 (含讲者资质审核/讲者在线付款流程) -全面费用管理 -经销商管理 -特价及返利管理 -医疗问询及不良反应记录追踪 -招投标管理 -注册证管理 -销售&

天河微信小程序入门《三》:打通任督二脉,前后台互通

原文链接:http://www.wxapp-union.com/forum.php?mod=viewthread&tid=505&extra=page%3D1 天河君在申请到https证书后就第一时间去部署后台环境,但是发现每次访问https都要带上8443端口实在是很坑爹啊,作为一个强迫症晚期,我要做的自然是不带端口直接访问.打开你tomcat下的conf文件夹,编辑里面的server.xml <Connector port="80" protocol=&quo

打通任督二脉---原来这就是计算机(持续更新)

笔者是一个计算机爱好者,还记得当初还是个刚上小学的孩子,那时,我第一次听说世界上还有计算机这种东西(那时都叫电脑),当时是90年代,估计那时全村也没有一个人见过电脑,所以电脑就被传的神乎其神:有了电脑,任何犯人都逃不过警察的追捕,因为电脑能算出来犯人在哪里,电脑能一瞬间算出当时觉得比登天还难的5位数的加减乘除,电视里的天气预报也是电脑算的,什么火箭,卫星,原子弹,氢弹都是电脑算出来的......  能想象出我当时对电脑崇拜的心情吗,当时,在我的眼里,电脑不是机器,而是像神一样的虚幻的存在,甚至都

任督二脉

RMI:https://www.cnblogs.com/xt0810/p/3640167.html 因为真要有技术深度的话,你可能需要花费至少2年的时间,从底层开始研究一些基础性的技术. 在打通你的底层技术任督二脉之后,再去对常见的开源技术进行深入的源码研究,比如说:dubbo.zookeeper.spring cloud.redis.rocketmq.elasticsearch,等等. 有了几年的积累过后,最后你在面试的时候,技术深度的体现,其实都是厚积薄发的. 原文地址:https://ww

二十一、进程管理之一基本概念

  硬件 调用.调用接口.库调用 线性内存地址空间.物理内存地址空间.线性地址.物理地址 交换内存:缺页异常 进程内存结构 常驻内存集.虚拟内存集 进程.进程元数据.结构体.任务结构体.链表 进程类型.状态(read,runing,sleep,stopped,zombie) 可中断睡眠.不可中断睡眠 创建子进程的过程  进程优先级.进程调度.进程队列 过期队列:抢占式多任务.系统调用IO IO模型.系统调用IO等待过程 进程间通信:IPC 硬件 编程接口: syscall(系统调用) libca

打通MySQL架构和业务的任督二脉

目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解决一定的业务问题. DBA作为数据库架构的设计.实施.维护人员,不仅要对各种MySQL架构非常熟悉,还要了解业务,对于不同的业务有一定的划分和认识,并根据业务特点和架构特点,合理选择和使用MySQL,满足业务需求. 本文从MySQL常见架构.业务环境分类.业务与架构结合使用原则三个方面对MySQL数