Linux 第十三章

2024-04-29 11:12
文章标签 linux 第十三章

本文主要是介绍Linux 第十三章,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」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=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中具体的进程状态

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上的运行队列,设备上的等待队列,进程上的等待队列等

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

这篇关于Linux 第十三章的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/945927

相关文章

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4