南京网站建设耐油橡胶板,网络科技有限公司电话,网站建设 推广就选网沃科技,宁波谷歌seo推广公司Linux操作系统从入门到实战#xff08;十九#xff09;进程状态前言一、什么是进程状态二、状态本质三、最核心的3种状态1. 就绪状态2. 运行状态3. 阻塞状态四、状态变化的核心1/两种资源如何影响状态#xff1f;五、操作系统怎么管理这些状态#xff1f;六、Linux里结构体…
Linux操作系统从入门到实战十九进程状态前言一、什么是进程状态二、状态本质三、最核心的3种状态1. 就绪状态2. 运行状态3. 阻塞状态四、状态变化的核心1/两种资源如何影响状态五、操作系统怎么管理这些状态六、Linux里结构体与状态七、回顾“父进程”和“子进程”八、僵尸进程1. 什么是僵尸进程2. 僵尸进程是怎么产生的3. 看个例子30秒的僵尸进程4. 僵尸进程的危害九、孤儿进程1. 什么是孤儿进程2. 孤儿进程会变成僵尸吗3. 看个例子前言
上一篇博客里我们讲解了Linux里面怎么查看进程这篇博客我们开始讲解进程状态与僵尸和孤儿进程 我的个人主页欢迎来阅读我的其他文章 https://blog.csdn.net/2402_83322742?spm1011.2415.3001.5343 我的Linux知识文章专栏 欢迎来阅读指出不足 https://blog.csdn.net/2402_83322742/category_12879535.html?spm1001.2014.3001.5482 一、什么是进程状态
前面我们讲过可以把“进程”理解成“正在运行的程序”比如你打开的微信、浏览器本质上都是一个或多个进程。 而“进程状态”就是这个“正在运行的程序”当前的“处境”——它现在是在干活还是在等东西还是准备好了就等机会干活 简单说进程状态就是用来描述“这个进程现在能干啥、接下来要干啥”的标记。
二、状态本质
听起来好像很复杂但其实在电脑操作系统内部** 进程状态就是一个简单的数字 **。 比如操作系统可能用“0”表示“准备好了”用“1”表示“正在干活”用“2”表示“在等东西”。不同的操作系统数字可能不一样但核心逻辑都差不多——用数字标记“进程当前的状态”。 三、最核心的3种状态 所有操作系统不管是Windows、Linux还是手机系统管理进程状态的逻辑都差不多最核心的就3种状态** 就绪状态、运行状态、阻塞状态 **。 我们可以用一个生活例子理解把“进程”比作“去食堂打饭的同学”“CPU电脑的核心”比作“打饭窗口”。
1. 就绪状态
比如你到了食堂发现窗口正在有人打饭你就站在队伍里等着——这时候你就是“就绪状态”。
对应到进程
进程已经把所有“准备工作”做好了比如需要的内存、数据都齐了就差“CPU打饭窗口”有空了一旦CPU轮到它它就能立刻开始干活。
2. 运行状态
当窗口空出来轮到你打饭了——这时候你就是“运行状态”。
对应到进程
进程正在被CPU“处理”比如正在执行代码算数学题、处理文字等只要CPU没“轮到下一个”它就一直处于这个状态。
3. 阻塞状态
假设你打饭时发现没勺子得先去旁边取勺子这时候你就暂时离开队伍等拿到勺子再回来排队——这时候你就是“阻塞状态”。
对应到进程
进程暂时没法用CPU干活因为它在等“外设资源”比如等键盘输入、等硬盘读写数据、等网络传输完成必须等外设资源准备好了比如你拿到勺子它才会重新回到“就绪状态”回到队伍再等CPU来处理。
四、状态变化的核心
为什么进程会在这3种状态之间切换本质是因为进程在“抢资源”而资源只有两种
** CPU资源 **就是“打饭窗口”谁抢到谁就能“运行”** 外设资源 **就是“勺子、餐盘”这类比如键盘、鼠标、硬盘、网络等。
1/两种资源如何影响状态
如果你是“计算密集型”任务比如跑复杂的数学公式、处理大数据主要抢CPU资源大部分时间要么在“运行”用CPU要么在“就绪”等CPU。如果你是“IO密集型”任务比如用微信发消息、用浏览器下载文件主要抢外设资源发消息要等网络下载要等硬盘大部分时间可能在“阻塞”等外设偶尔回到“就绪”和“运行”。
五、操作系统怎么管理这些状态
操作系统会给每个CPU建一个“调度队列”就像食堂的队伍
所有“就绪状态”的进程都会排在这个队列里等着CPU来“叫号”一旦CPU“叫到”某个进程这个进程就从“就绪”变成“运行”如果运行中的进程需要等外设比如等你输入文字就会离开队列进入“阻塞”等外设准备好了再重新回到“就绪队列”排队。
六、Linux里结构体与状态
最后简单提一下Linux系统里的实现。
在Linux中每个进程的信息包括状态、占用的资源、位置等都存在一个叫“PCB进程控制块”的结构体里可以理解成“进程的身份证档案”。
结构体就像一个“抽屉”里面有很多“小格子”成员每个格子存不同的信息比如状态、内存地址等。如果你知道某个“小格子”比如状态这个数字的地址就能反推出整个“抽屉”结构体的起始地址就像知道抽屉里某本书的位置就能找到整个抽屉在哪。想访问结构体里的信息比如状态直接用“结构体变量.成员名”就行比如“进程档案.状态”。
七、回顾“父进程”和“子进程”
就像现实中父母会生孩子一个进程比如你打开的浏览器也能“创建”新的进程比如浏览器新开的标签页进程。我们把“创建者”叫** 父进程 “被创建的”叫 子进程 **。
它们的关系就像父进程“管”子进程子进程干完活后要告诉父进程“结果咋样”比如“任务完成”或“出错了”。
八、僵尸进程
1. 什么是僵尸进程
简单说子进程已经退出“死了”但父进程一直没“问”它“死之前干得咋样”这时候子进程就变成了僵尸进程。 用生活例子类比 你子进程帮爸妈父进程做一件事做完后你告诉爸妈“我完事了”但爸妈一直在忙别的没理你。这时候你虽然“任务结束”了但还得等着爸妈回应就像“僵尸”一样没彻底“消失”。 2. 僵尸进程是怎么产生的
子进程退出时会留下一个“退出状态码”比如“0”表示成功“1”表示失败这个码是给父进程看的。
如果父进程及时用wait()可以理解成“询问结果”读取了这个码子进程就会彻底消失但如果父进程没读比如父进程在睡觉、忙别的子进程就会保持“僵尸状态Z状态”留在系统的“进程表”里等着父进程来“处理”。
3. 看个例子30秒的僵尸进程
有一段代码不用看懂细节知道逻辑就行
父进程创建子进程后自己睡30秒期间不处理子进程子进程创建后只睡5秒就退出了。
这时候
子进程5秒后“死了”留下退出状态码父进程还在睡觉30秒没读这个码所以子进程在这25秒30-5里就成了僵尸进程状态是Z。
4. 僵尸进程的危害
僵尸进程虽然“死了”但它的“档案”PCB之前讲过的“进程身份证信息表”还在系统里存着——因为要保留“退出状态码”等信息等着父进程来取。
问题来了
一个僵尸进程的PCB占一点内存看起来不多但如果父进程创建了很多子进程还都不管不读状态码就会有一堆僵尸进程的PCB占内存最后导致“内存泄漏”内存被白白浪费用不了。
九、孤儿进程
1. 什么是孤儿进程
和僵尸进程相反** 父进程先退出“死了”但子进程还在运行这时候子进程就成了孤儿进程 **。
生活例子类比 爸妈父进程提前“离开”了你子进程还没长大还在运行这时候你就成了“孤儿”。
2. 孤儿进程会变成僵尸吗
不会。因为操作系统有“兜底机制” 当父进程先死子进程会被系统的“1号进程”可以理解成“系统大管家”比如Linux里的init进程“领养”。
1号进程会负责“接管”这个孤儿进程等它退出后及时读取它的退出状态码所以孤儿进程退出后不会变成僵尸会被1号进程彻底“清理”掉。
3. 看个例子
一段代码逻辑
父进程创建子进程后自己只睡3秒就退出了子进程会睡10秒才退出比父进程活得久。
这时候
父进程3秒后“死了”子进程还在运行成了孤儿系统的1号进程会“领养”这个孤儿10秒后子进程退出1号进程会及时读取它的状态码子进程正常消失不会变僵尸。
类型产生原因结果/危害系统处理方式僵尸进程子进程先死父进程没读它的退出码留在进程表占内存可能导致内存泄漏父进程用wait()读取状态码即可清除孤儿进程父进程先死子进程还在运行不会变僵尸会被1号进程领养并正常回收1号进程接管负责后续清理以上就是这篇博客的全部内容下一篇我们将继续探索Linux的更多精彩内容。 我的个人主页 欢迎来阅读我的其他文章 https://blog.csdn.net/2402_83322742?spm1011.2415.3001.5343 我的Linux知识文章专栏 欢迎来阅读指出不足 https://blog.csdn.net/2402_83322742/category_12879535.html?spm1001.2014.3001.5482 非常感谢您的阅读喜欢的话记得三连哦