【Linux-进程状态】

发布于:2024-04-25 ⋅ 阅读:(17) ⋅ 点赞:(0)

1.进程状态

想要理解进程状态,我们要先看看课本中的进程有哪些状态。
在这里插入图片描述
进程状态用大白话说,就是pcb中的一个字段,就是pcb中的一个变量:int status;
在这里插入图片描述

所谓的状态变化,本质就是修改整形变量。

1.运行状态

什么叫做运行状态?
每一个cpu在系统层面上都会维护一个运行队列。当我们磁盘中的可执行文件加载到内存中的时候,操作系统会对其产生相应的pcb,当这个程序运行的时候,就会将它的pcb加载到运行队列中。只要在运行队列中的进程,状态都是运行状态,表示我已经准备好了,随时就会被调度。在这里插入图片描述

2.阻塞状态

我们的代码中,一定会或多或少的访问系统中的某些资源,例如:磁盘,键盘,网卡等。当我们调用scanf,cin类似的函数,本质是想要从键盘中获取数据,但是如果不输入,键盘上的数据就没有就绪。我们进程要访问的资源就没有就绪。
那么操作系统要不要知道设备的状态呢?操作系统一定是最先知道它管理的设备的状态变化的。操作系统怎么知道呢?一定是先描述,在组织。每一个设备也会有它对应的pcb,存储着它的状态,所在队列等属性。

在这里插入图片描述
当我们没有输入数据时,设备的数据状态就是没有准备好的,所以这个设备就不具有访问条件,进程代码无法继续向后执行。这时进程就处在阻塞状态,同时,操作系统也会将键盘的pcb放入等待队列中。当我们输入数据时,再将它放入运行队列,进程就可以正常执行了。

在这里插入图片描述
进程的pcb是可以在多个队列中的。
在这里插入图片描述

3.挂起

在这里插入图片描述

2.Linux系统中的进程状态

  • 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。
  • 下面的状态在kernel源代码里定义:
*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
}
  • R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

1.前台进程和后台进程

当我们想循环打印一段代码时,我们发现它的状态是S+,我们正在运行这个代码啊,它不是应该是运行状态吗,为什么是睡眠状态呢?
在这里插入图片描述
在显示器上只是我们肉眼看到了代码在不断打印,打印本质是往显示器上打印,在冯诺依曼体系当中,你的进程是在内存里的,说白了就是将内存里的数据不断向外设进行刷新,当你刷新的时候,你的外设不一定是准备好的。所以在我们运行期间,查出来的状态大部分是S状态。当我们只进行while循环,不进行打印,发现进程状态就都是R+了在这里插入图片描述
我们发现,这两个状态后面都有一个加号,它表示的是什么呢?
它表示当前进程是一个前台进程,当进程运行起来时,我们在想执行其它指令,就无法执行了。系统的一个bash中只能启动一个前台进程
在这里插入图片描述
当我们./运行程序的时候加上一个 & ,就可以让它后台运行了。这时后进程不能ctrl+c删掉了,我们可以用kill-9命令删掉它

深度睡眠

有浅度睡眠就会有深度睡眠。
在这里插入图片描述
当我们的进程要向磁盘写入数据时,在进程等待的过程中,如果操作系统内存紧张,会杀掉进程,节省资源。如果此时进程被杀掉了,磁盘中的写入如果失败了,就会出现BUG。所以为了不让操作系统杀掉写入磁盘的进程,操作系统就设置了一种D深度睡眠状态,谁也不能杀掉它,只能等待它的回应。
在这里插入图片描述

2.停止状态

我们通过kill-l命令可以查看信号指令,这些指令在操作系统中是被#define的
在这里插入图片描述
通过发送19号指令就可以让进程暂停,发送18号指令可以让进程继续。
我们在debug 程序的时候,我们打上断点,程序在运行中就是运行状态,到达断点位置时就变成了停止状态
在这里插入图片描述