主进程退出后子进程还会存在吗?_【干货】Linux进程模型 全解
ID:嵌入式情报局
作者:情报小哥
1进程与程序
01
什么是进程 ?
什么是进程 ? 进程(process)是具有独立功能的程序单次运行,是操作系统进行资源分配的基本单位。
02
进程的特点
动态性 : 是程序的一次执行过程,这也是与程序最大的区别。
并发性 : 多个进程在一段时间内可以同时运行。
独立性 : 各自独立运行、资源独立和调度的基本单位。
03
进程与程序
程序是静态,而进程为动态。
程序是永久,而进程有生命周期。
程序是指令的有序集合,而进程不仅包括指令还包括进程控制状态等信息。
一个程序可对应多个进程即多个进程可执行同一个程序;一个进程可以执行一个或几个程序。
更加通俗的理解 : 程序一般是保留在物理介质(块设备,如硬盘等)的数据,数据加载到内存以后的执行形态就是进程。
2进程三态
01
三态模型图
02
状态解释
执行态(running):进程占有CPU正在执行中。
就绪态(ready) :具备运行条件,等待CPU调度以便运行。
阻塞态(blocked):进程等待或者睡眠都属于此状态,进程不具备运行条件,正在等待某个IO事件的完成。
03
转移过程
通过上面的状态模型图,我们大致可以了解到状态的转移只有4种情况,然而如果其中一个状态能够达到任意其他两个状态应该有6种转移情况,所以有两种情况无法转移:
执行态-->就绪态 : 图上标识的是时间片用完,这个仅仅对于采用时间片调度算法,而对于其他调度算法可能存在高优先级抢占低优先级,从而使得优先级从执行态变成就绪状态等等。
就绪态-->执行态 : 之前进程处于就绪状态, 一旦根据调度算法满足调度条件便会占用CPU运行,从而变成执行状态。
执行态-->阻塞态 : 在执行状态中存在一些请求(IO请求)从而导致当前无法再继续执行,从而进入等待资源的状态。
阻塞态-->就绪态 : 进入等待资源的状态,一旦获得资源,完成请求就顺利进入就绪表,从而等待调度器调度。
以上三态模型的4种状态转移就就介绍完了,那么就存在还有两种状态转移是不支持的 :
阻塞态-->执行态 : 由于调度器大部分调度器算法一般都不会从堵塞任务表中挑选任务进行执行,所以该转换一般不发生。
就绪态-->阻塞态 : 进程都没有得到执行,不会有任何资源需求,所以该转换一般也不会发生。
当然对于Linux系统不仅仅有这三态模型,还有其他更多的状态,基本上都是在三态模型上的演化!
3五态模型
01
模型示意图
02
模型解读
对于进程五态模型仅仅只是在前面的三态模型上加入了新建态与终止态,所以这里小哥只是讲一下新建态和终止态,其他三态与之前的一致。
新建态:
前面说过程序与进程的关系,那么操作系统把程序加载到内存中并且让其变成运行状态还需要有特别多控制管理数据的配置和初始化。比如各种物理和逻辑资源,如内存、文件、I/O设备和CPU时间等分配和建立进程控制块(PCB)表项、建立资源表格(如打开文件表)并分配资源、加载程序并建立地址空间相关的页表与段表等等。
往往在新建态操作系统过程中就可以根据当前的CPU负荷等等限制进程的数量。
终止态:
该状态表示进程已结束,首先操作系统会进行一些善后工作,比如回收除进程控制块之外的其他资源,然后可以让其他进程从进程控制块中收集有关信息(如退出代码用于传递给父进程),最后将任务控制块(PCB)清除,并且把主内存还给操作系统。
4加入挂起与激活
01
模型示意图
02
模型解读
上述模型在五态模型的基础上加入了挂起和激活状态,操作系统一个最大的特点就是对硬件资源的最大化利用,同样对于主内存资源也是通过置换算法达到最大化的虚拟地址空间,特别是主存资源当不能满足所有进程运行时,就必须挂起某些进程,放到磁盘对换区,暂时不参加调度,以平滑系统负荷等处理。
活跃就绪:存于主存中且可被调度。
静止就绪:进程被对换到辅存(磁盘等)形成静止就绪状态,且不参与调度,系统通过一定的策略,会在恰当的时机把挂起就绪态进程调回主存并转换为活跃就绪,从而继续参与系统调度。
活跃阻塞:之前处于执行态,一旦等待事件的产生便进入活跃就绪状态。
静止阻塞:是指活跃态进程对换到辅存时的阻塞状态,一旦等待的事件产生,由于该静止阻塞态进程具有较高的优先级,并且操作系统已经得知导致它阻塞的事件即将结束,便会进入活跃阻塞。
5Linux进程
01
Linux进程状态
前面小哥跟大家聊了一下操作系统的通用进程三状态和五状态模型,同时在五状态转移模型中加入了挂起和超时状态,而实际的操作系统会根据自身特点从而对状态模型图进行扩展或者优化,那么今天看一下Linux实际的进程状态转移。
02
Linux进程状态图
03
状态与转移
1、进程通过系统调用或者中断即可从用户态进入内核态,此时Linux通过进程调度算法调度实现多进程的并发执行,所以处于用户态和内核态的进程一般都统一叫做运行态。
2、就绪态是进程满足运行条件等待被系统调度进入运行态的状态,就绪态其实是满足运行条件的,所以一般也叫运行态。
3、可中断休眠态又叫浅睡眠态,一般进程调用sleep_interruptible()即可进入该状态,该状态主要是等待所需的资源,可以通过接收来自其他进程的信号、wake_up()或者wake_up_interruptible()来进行唤醒,从而进入就绪态。
4、不可中断休眠态也叫深睡眠态,它与不可中断休眠态类似,不过其唤醒条件更加严苛一点,只能通过使用wake_up()明确指明才能转为就绪态。
5、进程处于运行态,当收到暂停信号比如SIGSTOP信号等,即会挂起转为暂停态,且处于暂停态的进程收到SIGCONT信号又可被激活成运行态。
6、僵死态是Linux里面比较有趣的状态,当主动调用do_exit()以后便会进入该状态,表示该进程已经停止运行,不过需要等待父进程确认,其任务控制块还没有释放。
从Linux一个大体的进程状态转移图来看,与前面介绍的状态模型还是比较相似的。
我是情报小哥,一个嵌入式自学玩家!
长按前往图中包含的公众号关注
结束语
好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地。
推荐好文 点击蓝色字体即可跳转
☞【MCU】把"安卓HAL层思想"引到单片机软件开发中
☞【MCU】可怕,别人把我MCU固件给反汇编了!(逆向)
☞ 【典藏】自制小型GUI界面框架(设计思想篇)
☞ 【典藏】大佬们都在用的结构体进阶小技巧
主进程退出后子进程还会存在吗?_【干货】Linux进程模型 全解相关推荐
- 主进程退出后子进程还会存在吗?_[docker]从一个实例,一窥docker进程管理
在Docker中,进程管理的基础是Linux内核的PID命名空间技术.在不同的PID命名空间下,可以有相同的PID. Linux内核为所有的PID命名空间维护了一个树状的数据结构,最顶层是系统初始化时 ...
- linux父进程发出退出信号,为什么prctl没有如小弟我所预期的设置一个父进程退出发给子进程信号...
为什么prctl没有如我所预期的设置一个父进程退出发给子进程信号? 我写了一个小程序,在fork出的子进程中使用prctl,设置父进程退出后自动发送给子进程退出信号. #include #includ ...
- 进程退出后占用的内存都去哪儿了?
本文是<深入理解操作系统>第四章,从本章开始将开启第一个重要的主题:进程,彻底理解进程对程序员来说是极为重要的,本章就从程序员的角度来讲解到底什么是进程.操作系统是如何实现进程的.本文承接 ...
- python主进程退出时子进程也退出_主进程被杀死时,如何保证子进程同时退出,而不变为孤儿进程(三)...
之前两篇文章讨论了进程意外退出时,如何杀死子进程,这节我们研究下在使用进程池multiprocessing.Pool时,如何保证主进程意外退出,进程池中的worker进程同时退出,不产生孤儿进程.如果 ...
- linux进程退出所有tcp数据才发送,深入理解Node.js 进程与线程(8000长文彻底搞懂)...
前言 进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少.本篇文章除了介绍概念,通过Node.js 的角度讲解进 ...
- 苹果id退出后数据还在吗_答疑你的手机连接WiFi后,会关闭移动数据吗?
十万人测评俱乐部Q群:631042704 ZEALER极客交流Q群:414894623 最近几天,深圳的高温天气让人十分抓狂,稍微动一动就大汗淋漓.在这种烧烤天里,最舒服的事,莫过于在空调房里连着Wi ...
- 【ubuntu】GPU进程kill后,显存未释放(杀死僵尸进程)
通过以下命令查看僵尸进程 sudo fuser -v /dev/nvidia* 然后通过以下命令逐一kill僵尸进程 sudo kill -9 进程
- 退出出库复核是什么意思_干货 | 电商仓储与传统仓储有什么不同?
随着在线零售市场日益成熟,电子商务不断蓬勃发展,电商仓储需求也呈现高速增长的态势.在电商供应链中,企业最关心的,是如何把货物更快更准确地送到客户手中,以及如何应对随时变化的订单需求,由此也决定了电商仓 ...
- 父进程退出,保证子进程交由init。
最近写代码遇到父进程fork出的子进程,父进程退出后子进程也退出.而要求的实现机制是,父进程启动子进程后,保证子进程能够继续运行,可以保证另一个进程启动能够和这个子进程进行通讯操作. 规避这个问题的方 ...
最新文章
- python初学者web还是爬虫-还在纠结学爬虫还是数据分析,不如看看这篇文章
- 学习《FreeRTOS源码详解与应用开发》笔记
- node.js 初体验
- linux孟庆昌第六章课后题_第六章课后练习题答案
- js包装类型的装箱拆箱
- html下拉表覆盖透明,css透明元素如何遮挡住fixed元素
- cout输出精确小数点
- 误用检测_如何(不)在创业中误用人工智能
- 攻防世界 web2 write up
- SAI绘制小树基础教程
- 统计相关国际期刊汇总
- 苹果iPad air技巧教程:50个实用小技巧
- VM 中设置 Mac 虚拟机 系统联网与时间
- 【零基础学QT】【052】CLion完美搭建Qt开发环境
- 韦东山第一二期衔接课程内容概要
- 微信小程序转码机器人❤️免费无水印❤️
- 华为鸿蒙手机版要2021开源,鸿蒙系统再起疑云:开源版和手机版完全不同,后者还有安卓彩蛋...
- 简单的会员卡储值积分管理系统
- 皇帝成长计划html文件打不开,皇帝成长计划源代码修改(共6篇).doc
- Vue 引入js文件并使用
热门文章
- SAP 电商云 Spartacus UI 修改代码后,重新构建基于 SSR 版本的程序报错
- 关于 Angular 应用 tsconfig.json 中的 lib 属性
- SAP 电商云 Spartacus UI 有状态 的 url 和 title 属性的赋值代码
- 关于 SAP WebIDE 不支持 ES6 语法的问题
- 基于 OData 模型和 JSON 模型的 SAP UI5 表格控件行项目的添加和删除实现
- 使用 SAP Business Application Studio 搭建 CAP Java 开发环境
- SAP Fiori Elements 公开课第二单元学习笔记:Fiori Elements 架构
- [重要!] SAP Spartacus加载网络请求的entity状态切换,统一在loader.reducer.ts里完成
- 用代码查看SAP Spartacus购物车内的行项目
- 一步步使用SAP CRM Application Enhancement Tool创建扩展字段