Linux 第十三章

server/2024/9/22 18:22:52/

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

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

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

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

目录

进程状态

进程状态是什么

运行状态

阻塞状态

挂起(阻塞挂起)

S休眠状态(sleeping)

D磁盘休眠状态(Disk sleep)

T停止状态(stopped)

t (tracing stop)

linux%E4%B8%AD%E5%85%B7%E4%BD%93%E7%9A%84%E8%BF%9B%E7%A8%8B%E7%8A%B6%E6%80%81-toc" style="margin-left:80px;">linux中具体的进程状态

前台进程

后台进程


进程状态

进程状态是什么

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

例如 int status#define NEW 1
#define RUNNING 2
#define BLOCK 3
…
pcb->status=NEWif(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 mytestPPID   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%E4%B8%AD%E5%85%B7%E4%BD%93%E7%9A%84%E8%BF%9B%E7%A8%8B%E7%8A%B6%E6%80%81">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 mytestPPID   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 mytestPPID   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上的运行队列,设备上的等待队列,进程上的等待队列等

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


http://www.ppmy.cn/server/22589.html

相关文章

你不需要总是在 React 中使用 useState

在我审查的一个拉取请求中&#xff0c;我注意到在许多拉取请求中看到的一种模式。React 组件具有多个 UI 状态&#xff0c;例如 loading、error 和 success。 作者使用了多个 useState 钩子来管理这些状态&#xff0c;这导致代码难以阅读且容易出错&#xff0c;例如&#xff1a…

每日一题-贪心算法

目录 前言 买入股票的最佳时机(1) 买入股票的最好时机(2) 前言 当你踏上贪心算法的旅程&#xff0c;仿佛置身于一场智慧的盛宴&#xff0c;每一步都是对问题解决方案的审慎选择&#xff0c;每一次决策都是对最优解的向往。贪心算法以其简洁高效的特性&#xff0c;被广泛运用于…

Java基础--单元测试

JUnit是Java中最流行的开源单元测试框架&#xff0c;用于编写和运行可重复的、自动化的单元测试。JUnit极大地简化了测试用例的编写和组织&#xff0c;提供了丰富的断言方法、测试运行控制、测试结果报告等功能&#xff0c;是遵循测试驱动开发&#xff08;TDD&#xff09;和持续…

Vue 组件单元测试深度探索:细致解析与实战范例大全

Vue.js作为一款广受欢迎的前端框架&#xff0c;以其声明式的数据绑定、组件化开发和灵活的生态系统赢得了广大开发者的心。然而&#xff0c;随着项目规模的增长&#xff0c;确保组件的稳定性和可靠性变得愈发关键。单元测试作为软件质量的守护神&#xff0c;为Vue组件的开发过程…

基于Flask的岗位就业可视化系统(一)

前言 本项目综合了基本数据分析的流程&#xff0c;包括数据采集&#xff08;爬虫&#xff09;、数据清洗、数据存储、数据前后端可视化等 推荐阅读顺序为&#xff1a;数据采集——>数据清洗——>数据库存储——>基于Flask的前后端交互&#xff0c;有问题的话可以留言…

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time

Android 在attrs.xml添加属性时出现 Found item Attr/****** more than one time 问题描述解决办法方式一方式二 小结 问题描述 在Android应用开发过程中&#xff0c;经常需要自定义控件&#xff0c;并且定义控件的属性&#xff0c;方便灵活的修改控件的显示样式&#xff0c;提…

【数据结构】单链表

单链表 文章目录 单链表定义单链表的优缺点用代码定义单链表初始化单链表不带头结点的单链表带头结点的单链表 单链表的插入按位序插入&#xff08;带头结点&#xff09;指定结点的后插操作指定结点的前插操作 单链表的删除按位序删除&#xff08;带头节点&#xff09;删除指定…

[NeurIPS-23] GOHA: Generalizable One-shot 3D Neural Head Avatar

[pdf | proj | code] 本文提出一种基于单图的可驱动虚拟人像重建框架。基于3DMM给粗重建、驱动结果&#xff0c;基于神经辐射场给细粒度平滑结果。 方法 给定源图片I_s和目标图片I_t&#xff0c;希望生成图片I_o具有源图片ID和目标图片表情位姿。本文提出三个分支&#xff1a;…