子进程如果先于父进程退出,且父进程还没有检测到子进程的退出状态代码,此时我们称这个子进程为僵尸进程。那么,如果一个父进程先于子进程退出,很显然这个子进程将没有父进程,也就是说一定会成为僵尸进程,这就出现了严重的逻辑错误。
所以,我们引出孤儿进程这一概念:
当父进程先于子进程退出,那么OS会默认让1号进程Init领养该子进程,1号进程就变成了该子进程的父进程,此时这个子进程就被称为孤儿进程,子进程的检测与回收,都由这个1号进程来执行。
注意一点:
有1号进程Init领养的这个子进程(也就是孤儿进程)会由前台进程变成后台进程
- #include
- #include
-
- int main()
- {
- //手动写一个孤儿进程
- pid_t id = fork();
- if(id == 0)//让子进程循环起来,不退出
- {
- while(1)
- {
- printf("I am a Child Process\n");
- sleep(1);
- }
- }
- else if(id > 0)//让父进程运行一段时间后退出
- {
- int cnt = 5;
- while(cnt--)
- {
- printf("I am a Father Process:%d\n", cnt);
- sleep(1);
- }
- }
- return 0;
- }
概念:由于cpu资源有限,而系统中进程太多,就需要某种方式来竞争cpu资源
本质:优先级就是在进程PCB(task_struct)中的某个属性(数字/数据)
作用:优先级是调度器的主要参考依据,是重要的调度指标
Linux中具体的优先级做法(PRI与NI)
PRI:代表进程的优先级:值越小优先级越高,越早被调度;值越大优先级越低,越晚被调度
NI:nice值,优先级的修正数值,取值范围 -20~19,一共40个级别
优先级 = 老的优先级(每次都是默认值80)+ nice值
ps axj | head -1 && ps axj即可查看到所有进程的一些信息,里面有PRI与NI
如何修改优先级(使用top指令)
方法:
1.输入top回车后,可以查看系统所有进程
2.输入r,根据提示输入要修改的进程pid,回车
3.输入nice值,之后系统会将进程的PRI+nice值得到修改后的PRI
注意:
每次修改PRI默认从80开始,不会从修改后的计数,如果NI超过-20~19这个范围,默认最大范围。
举例:
1.某进程PRI开始默认为80
第一次修改:输入nice值-10,第一次修改后PRI:70;
第二次修改:输入nice值10,第二次修改后PRI:90
2.某进程PRI开始默认为80,修改:输入nice值为-100,修改后PRI:60
某进程PRI开始默认为80,修改:输入nice值为100,修改后PRI:99