关注、星标公众号,直达精彩内容
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界面框架(设计思想篇)
☞【典藏】大佬们都在用的结构体进阶小技巧