Linux 第十三章

发布于:2024-04-29 ⋅ 阅读:(33) ⋅ 点赞:(0)

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数C初学者入门训练题解CC的使用文章「初学」C++linux

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

进程状态

进程状态是什么

运行状态

阻塞状态

挂起(阻塞挂起)

S休眠状态(sleeping)

D磁盘休眠状态(Disk sleep)

T停止状态(stopped)

t (tracing stop)

linux中具体的进程状态

前台进程

后台进程


进程状态

进程状态是什么

进程状态,就是pcb中的一个字段,就是pcb中的一个变量

例如 int status

#define NEW 1
#define RUNNING 2
#define BLOCK 3
…
pcb->status=NEW

if(pcb->status==NEW)pcb放入运行队列之类的
else if(pcb->status==BLOCK)pcb放入阻塞队列等

运行状态

只要在运行队列中的进程,状态都是运行状态(可以随时被调度)

阻塞状态

将进程放在等待队列就是阻塞状态

总结:

1)在操作系统中,会存在非常多的队列,运行队列,等待硬件的等待队列

2)进程状态变化的本质:

   1.更改pcb status整形变量

   2.将pcb链入不同的队列中

3)我们所说的所有的过程,都只和进程的pcb有关,和进程的代码数据没有关系

4)Os最先知道他所管理的设备状态变化的

5)当一个进程阻塞了,我们看到的是什么现象

   现象:进程卡住了

   原因:pcb没有在运行队列中,cpu不再调度该进程

6)所有的进程都在一个双链表中,根据进程的状态,将进程挪到不同队列中(运行队列、等待队列等),但是双链表中始终存在所有的进程

挂起(阻塞挂起)

S休眠状态(sleeping)

【阻塞状态】

浅度睡眠:可以被终止

浅度睡眠会对外部信号做出响应

在Linux进程中,sleep状态指的是程序调用sleep()函数后所处的状态。sleep()函数会让进程暂停一段时间,不再占用CPU资源,直到指定的时间过去才会继续执行。在这段时间内,该进程会被操作系统挂起,处于sleep状态。在该状态下,该进程不会被CPU调度执行,但是它的状态会保留下来,可以在指定时间后被唤醒。该状态通常用于实现延时操作或者等待条件满足后再进行下一步处理。

D磁盘休眠状态(Disk sleep)

【阻塞状态】

深度睡眠:不可被终止掉

专门针对磁盘设计的(针对io读取时,就是防止操作系统将进程pcb杀掉,但是该pcb连接的代码和数据放在磁盘中的)

T停止状态(stopped)

【阻塞状态】

在Linux中,kill是一个用于终止(或发送信号给)进程的命令。

[BCH@hcss-ecs-6176 9_25]$ kill -l
//-l列出全部的信号

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1//9是终止信号
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP//18是继续信号,19是暂停信号
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    


[BCH@hcss-ecs-6176 9_25]$ ./mytest
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux

[1]+  已停止               ./mytest

[BCH@hcss-ecs-6176 9_25]$ kill -19 9849//暂停了pid9849的进程
[BCH@hcss-ecs-6176 9_25]$ ps ajx | head -1 && ps ajx | grep mytest
PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
32303  9849  9849 32187 pts/0    32303 T     1000   0:00 ./mytest//进程状态为T停止状态,而且自动切换为后台进程

我们为什么要暂停?在进程访问软件资源的时候,可能暂时不让进程访问,就将进程设置为T状态

在Linux进程中,stop状态指的是进程被暂停执行,并且不再占用CPU资源的状态。进程可能进入stop状态的原因有多种,其中包括以下几种常见情况:

1. 通过终端发送SIGSTOP信号:可以使用终端命令kill -STOP <PID>或者按下Ctrl+Z来发送SIGSTOP信号,使进程进入stop状态。

2. 收到SIGSTOP信号:进程可能会收到其他进程或系统发送的SIGSTOP信号,例如通过终端命令kill -STOP <PID>或者由于系统资源不足导致暂停执行。

在stop状态下,进程不会被CPU调度执行,但是它的状态和内存内容会保留。进程可以通过发送SIGCONT信号(如kill -CONT <PID>)来解除stop状态,恢复执行。stop状态通常用于进程调试、暂停执行以及与其他进程进行同步等操作。

t (tracing stop)

阻塞状态】
调试程序的时候,追踪,遇到断点,进程暂停了

[BCH@hcss-ecs-6176 9_25]$ ps ajx | head -1 && ps ajx | grep mytest
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
32303 21965 21965 32187 pts/0    21965 S+    1000   0:00 gdb mytest
21965 24315 24315 32187 pts/0    21965 t     1000   0:00 /home/BCH/9_25/mytest

linux中具体的进程状态

linux进程源码:
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):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

前台进程

前台进程:带有+

前台进程只能有一个,无法继续执行其他操作(例如,执行其他命令),可以control c终止掉

[BCH@hcss-ecs-6176 9_25]$ ./mytest
hello linux
hello linux
pwdhello linux//pwd指令无法执行
hello linux
lshello linux//ls指令无法执行
hello linux
^C//control c直接结束进程

[BCH@hcss-ecs-6176 9_25]$ ps ajx | head -1 && ps ajx | grep mytest
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
32303 16837 16837 32187 pts/0    16837 S+    1000   0:00 ./mytest//前台进程带有+

后台进程

后台进程:不带+

后台进程可以不止有一个,可以继续执行其他操作(例如,执行其他命令),不可以control c终止掉

[BCH@hcss-ecs-6176 9_25]$ ./mytest &//这样就在后台执行mytest进程
[1] 5823//pid=5823
[BCH@hcss-ecs-6176 9_25]$ hello linux
ls//执行了ls指令
Makefile  mytest  test.c
[BCH@hcss-ecs-6176 9_25]$ hello linux
phello linux
wd//执行了pwd指令
/home/BCH/9_25
[BCH@hcss-ecs-6176 9_25]$ hello linux
hello linux
hello linux
hello linux
hello linux

[1]+  已杀死               ./mytest

[BCH@hcss-ecs-6176 9_25]$ ps ajx | head -1 && ps ajx | grep mytest
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
32303  5823  5823 32187 pts/0    32303 S     1000   0:00 ./mytest//不带有+
[BCH@hcss-ecs-6176 9_25]$ kill -9 5823//后台进程control c是无法终止的,终止后台进程使用kill命令

pcb内部可以有自己的等待队列,一个进程可以等待另一个进程

总结:os维护的队列有很多,cpu上的运行队列,设备上的等待队列,进程上的等待队列等

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸