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-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo