操作系统维度下的进程状态详细解析

进程状态

为什么会有进程状态

计算机中每时每刻都会有多个进程在内存中,使用不同的状态表示概念来表达当前进程所处的状态(在干什么),但是在只有一个CPU的情况下,意味着每次只能运行一个进程,即一个进程不是一直在运行的

在这里插入图片描述

此处运行到scanf时将会停止运行下一段代码,当输入数据时才会继续运行,也会有相应的状态来表示此处进程处于什么状态从而决定下一步动作
即状态决定接下来所要做的事,即状态决定后续动作

则需要知道进程状态,从而使得操作系统接下来对进程进行正确的管理操作

进程队列(排队)

了解具体的进程状态所对应的含义前,还需要了解进程队列,因为实质上许多的进程状态的含义即是表示进程在不同的队列中

内存中会有多个进程,并且许多进程可能是处于同一个状态的,例如很多个进程都已经准备好了被CPU调度执行,那么CPU应该调度哪一个进程呢,这个问题则通过进程队列来解决。把进程进行排队,即用队列(数据结构)来管理进程

进程=内核数据结构(PCB…) + 代码和数据 ,这里在队列中进行排队被管理的一定是task_struct(PCB),因为对进程做管理实际上是对进程的信息做管理

当一个进程在排队时,一定是在等待某种软硬件资源

进程可被连入多个数据结构中

操作系统把进程连到链表中来管理进程,但是为什么又能够把进程放到排队的队列中呢?

因为并不是把task_struct连入链表中,而是在task_struct的成员中有一个listnode链表节点,通过该节点连接下一个task_struct,那么在一个task_struct中肯定可以不止有一个listnode来进行连接,不同的连接顺序代表了不同的队列,因为队列是一个容器适配器,完全可以用链表进行一定的封装后来实现队列数据结构的操作

操作系统维度的进程状态

在这里插入图片描述

所谓的状态,在计算机层面上本质就是task_struct中的一个整形变量

#define New 1
#define Ready 2
#define running 3
#define block 4
struct task_struct{
    int status;
    ...
};

runningStatus

一个CPU一个运行队列

在现代操作系统下,当一个进程的PCB进入到CPU的运行队列等待CPU运行该进程当CPU运行该进程时,此进程都处于运行状态,当然在教材上等待被CPU调度运行叫作就绪状态,而进程被CPU执行时为执行状态

时间片

当一个进程处于被CPU调度运行时,如果代码过长或者是死循环时CPU并不会一直执行该进程,而是运行时间积累到某个值,则会被强制换下,这个值就被称为是时间片,时间片为分配给各个程序的执行时间

clogStatus

以硬件设备为例

每一个硬件设备为了被操作系统管理也都和进程一样会被先描述成一个结构体(类),其中有他的各个属性,同时也会有一个该设备的队列,被称为等待队列,用来等待该设备的资源

int main(){
	int a;
    scanf("%d",&a);
    printf("%d\n",a);
    return 0;
}

当程序在CPU上运行到scanf语句时,此时正在等待用户通过键盘设备输入数据,那么此时由于没有数据,程序运行不下去,而且还有其他许多进程正在等待被CPU调度执行,那么当前的进程task_struct将会被操作系统拿下来,放到键盘设备的等待队列中,当键盘输入数据,数据放到内存中的对应的数据输入缓冲区后,数据资源就绪完毕,键盘设备资源准备就绪,操作系统又是怎样知道现在该调度当前task_struct的呢,此时键盘设备会有一个数据准备就绪的信号,操作系统识别到该信号后,将会把当前的task_struct(PCB)又调到CPU的运行队列中,当轮到该进程时程序就会继续运行
在等待键盘设备的数据资源时的状态即为阻塞状态

阻塞状态为

当进程需要相应的软硬件资源时,资源如果没有就绪,我们的进程将会把task_struct中的status设置为阻塞状态,并且会把自己的task_struct(PCB)连入到对应的(软硬件)资源所提供的等待队列中

状态的变迁,引起的是PCB会被OS调配到不同的队列中

suspendStatus

挂起状态的前提是计算机资源已经比较吃紧了,快不够用了

阻塞挂起

当内存紧张时,磁盘中有一个固定的区域被用来存储从内存中唤出的数据,此区域被叫作Swap分区

当进程处于阻塞状态时,并且当前计算机的资源非常紧张很可能崩溃,并且当前也不会调度此进程,那么为了维持操作系统(计算机)的正常运行,会把当前进程的代码和数据唤出到swap分区(磁盘)中,为操作系统留出更多的空间,等到操作系统抗过这波压力后,又会把唤出的代码和数据从磁盘中重新换入到内存中

不仅仅有阻塞挂起,还有许多挂起状态,但是无论哪种挂起状态,都是对数据和代码进行换出和换入使得操作系统能够不崩溃

为什么要有阻塞挂起

当内存中的空间不足资源紧张时,为了向上在用户层能够使得用户正常使用各种软件资源,例如打开一个软件,申请内存能够成功创建进程,从而正常使用该软件,而如果没有阻塞挂起那么在资源不足的情况下,软件将会打开失败,不能够正常的使用软件资源

Swap分区大小设置

如果swap分区比内存大很多,当内存不足时过度依赖swap频繁使用swap空间进行唤出和唤入,导致长时间的磁盘交换操作,会使得I/O交互频繁,由于磁盘的读写速度远不如RAM,因为从swap到RAM的数据交换比RAM本身的操作要慢的多,将会影响系统整体的响应速度,大大降低计算机的效率

如果可以增加内存容量都应该首先选择增加内存容量,而不是设置过大的Swap分区,除非只是为了运行程序,不考虑计算机的响应速度和使用体验

  • 40
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值