【Linux】Linux 操作系统 - 11 , 进程状态 - 详谈《僵尸进程和孤儿进程》让你彻底明白 !
文章目录
- 前言
- 一、什么是进程的状态 ?
- 二、简单认识调度队列
- 三、操作系统学科中的运行 , 阻塞 , 挂起状态
- 1. 运行状态
- 2. 阻塞 , 挂起状态
- 四、Linux 系统中的进程状态(重点)
- 1. 都有什么状态 ?
- 2. 运行状态
- 3. 睡眠状态
- 4. 暂停状态
- 基本状态总结
- 五、僵尸进程(面试重点)
- 1 . 什么是僵尸进程 ?
- 2 . 为什么父进程要获取子进程信息 ? 获取什么信息 ?
- 3 . 父进程要回收子进程的信息 , 信息在哪里 ?
- 4 . 僵尸状态
- 5 . 僵尸进程的危害
- 六、补充有关内存泄漏(了解)
- 1 . 进程一旦退出 , 这个泄漏问题还在吗 ?
- 2 . 什么进程内存泄漏比较麻烦 ?
- 七、孤儿进程(面试重点)
- 1. 是什么 ?
- 2. 孤儿进程是被谁领养 ?
- 1 号进程是谁 ?
- 3. 孤儿进程为什么要被系统领养 ?
- 4. 孤儿进程是后台进程
- 后台进程
- 总结
前言
本篇将会对进程的状态进行详细的介绍 , 其中包括僵尸进程 , 孤儿进程 , 等状态 !
一、什么是进程的状态 ?
● 介绍
进程状态主要用于描述进程的运行情况,帮助操作系统进行资源分配和调度 。
其实进程的状态在 Linux 中就是 struct_task 这个数据结构里面的一个整数 , 用整数来描述状态 !
所以 , 理解状态 , 就是一个整数在记录 !
二、简单认识调度队列
在操作系统中会有不同队列的存在 , 其中调度队列也属其中 !
三、操作系统学科中的运行 , 阻塞 , 挂起状态
1. 运行状态
2. 阻塞 , 挂起状态
四、Linux 系统中的进程状态(重点)
1. 都有什么状态 ?
2. 运行状态
一旦我们运行一个程序 , 指令等 , 只要运行起来 , 就会进行调度 , 就会加入调度队列 , 一旦加入了 , 就是运行状态了 .
3. 睡眠状态
睡眠状态分为浅睡眠和深睡眠 , 浅睡眠的意思就是 : 处于浅睡眠的进程可以被中断 , 即 : ctrl + c 可以中断 !
若给了一下程序 :
3 #include <stdio.h>4 #include <unistd.h>5 #include <sys/types.h>6 int main()7 {8 9 while(1)10 {11 int n = 1;12 //这里就会阻塞 ! 因为会等待键盘就绪 !13 scanf("%d",&n);14 printf("我是一个进程 , 我开始运行了, pid = %d , ppid = %d\n", getpid(), getppid());15 sleep(1);16 17 }18 return 0;
4. 暂停状态
#include <stdio.h>int main()
{printf("hello\n");//在此处打断点printf("hello\n");printf("hello\n");printf("hello\n");printf("hello\n");printf("hello\n");//在此处打断点printf("hello\n");printf("hello\n");printf("hello\n");printf("hello\n");printf("hello\n");return 0;
}
cgdb 调试代码 !!!
基本状态总结
五、僵尸进程(面试重点)
1 . 什么是僵尸进程 ?
抓住没有及时回收 , PCB 还在被维护 !
2 . 为什么父进程要获取子进程信息 ? 获取什么信息 ?
3 . 父进程要回收子进程的信息 , 信息在哪里 ?
这些信息就在 PCB 中 , Linux 中就是在 task_struct 这个数据结构里 , 所以即使子进程退出了 , 这个 PCB 还是在系统里 !
4 . 僵尸状态
&emps; 处于僵尸进程的进程状态就是僵尸状态 , 在 Linux 中 Z 表示 “僵尸状态 !”
● 给出以下代码 , 模拟一下僵尸进程 !
int main()
{printf("我是父进程 , pid = %d, ppid = %d\n", getpid() , getppid());//创建子进程pid_t id = fork();if(id < 0){printf("fork err!\n");return 1; }else if(id == 0){// childint n = 5;while(n){printf("我是子进程 , pid = %d , ppid = %d\n",getpid(),getppid());sleep(1);n--;} }else{// parent 父进程 , 什么都不做while(1){}} return 0;
}
5 . 僵尸进程的危害
六、补充有关内存泄漏(了解)
1 . 进程一旦退出 , 这个泄漏问题还在吗 ?
进程一旦退出了 , 这个泄漏问题就不存在了 !
2 . 什么进程内存泄漏比较麻烦 ?
常驻内存进程一旦内存泄漏 , 会很麻烦 !
七、孤儿进程(面试重点)
1. 是什么 ?
2. 孤儿进程是被谁领养 ?
答 : 被系统领养 !
观察一个代码 :
int main()
{printf("我是父进程 , pid = %d, ppid = %d\n", getpid() , getppid());//创建子进程pid_t id = fork();if(id < 0){printf("fork err!\n");return 1; }else if(id == 0){// child// 子进程一直不退出 while(1){printf("我是子进程 , pid = %d , ppid = %d\n",getpid(),getppid());sleep(1);} }else{// parent 父进程 , 什么都不做//父进程运行 5 次退出int n = 5;while(n){printf("我是父进程 , pid = %d , ppid = %dn", getpid() , getppid());sleep(1);n--;}} return 0;
}
1 号进程是谁 ?
3. 孤儿进程为什么要被系统领养 ?
4. 孤儿进程是后台进程
一旦一个进程成了孤儿进程后 , 其是后台进程 , 意思是必须用 kill 来杀死进程 !
后台进程
总结
以上就是本节内容 ! 思维导图中已经规划出了重点 !