【Linux系统】进程概念(二)

简介: 【Linux系统】进程概念(二)

3.5 进程状态

在了解进程状态前我们还得了解下什么是阻塞和挂起?

相信大家在看一些操作系统的书的时候就见过类似于这样的图片:

a8a04fd926db4c2898ae4bafc03baf27.png 阻塞状态是一种等待某种资源就绪,而导致的一种不被推进的过程。这么说有点儿抽象,我们来举一个栗子:

当有大量进程存在时我们是不是要先描述,再组织,前面我们说过组织进程靠的是内核中以某种数据结构来维护进程的PCB。假设你在应用市场要下载一个软件,但是下到一半时网络突然中断了,那么操作系统会一直等到网络资源恢复后再去运行其他进程吗?显然是不会的,假如操作系统这样设计的话那么难道我们电脑上的其他程序就不运行了吗?就只等你一个?所以当网络资源中断时操作系统会将该进程从CPU的运行队列中拿走,放到对应硬件资源的等待队列中,等到网络资源恢复后再将该进程链接到CPU的运行队列中执行,而这种等待某种资源就绪而不被推进的一种状态就叫做阻塞状态。

cd88adafd1d0413cbb818b21a9441824.png

而挂起又是什么意思呢?

由于机器的资源是有限的,在资源不足的情况下操作系统可以暂时将一些在内存中的进程淘汰出局,当条件允许的时候又会被操作系统给调回来,这个比较好理解就不在多做解释了。

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

第一个R状态并不是表示进程在运行中,有可能是在运行队列里面。接下来给出大家一个程序大家猜猜这时一种什么状态?

  1#include<iostream>
  2 #include<unistd.h>
  3 using namespace std;
  4 
  5 int main()
  6 {
  7   while(1)
  8   {
  9     cout<<"我是一个进程 我的pid是:"<<getpid()<<endl;           
 10   }
 11   return 0;
 12 }

我相信第一次大家或许都会想:既然是死循环那么程序肯定在运行状态了,也就是R状态,事实真的是这样吗?我们一起来看看:

b4a245018f9945f1a5889a66a2728e44.png

我们居然惊奇的发现,该进程居然处于S状态,这不合理吧?

其实大家想想,我们使用cout往显示屏中打印字符串,这里的输出设备就是我们的屏幕,但是输入输出设备是很慢的相对于CPU来说,可能当输入输出一个字符时CPU就已经跑了上百万行代码了。所以当我们往显示屏打印字符串时,操作系统并不会直接将该进程直接运行,而是等到当某种资源就绪后会将该进程链接到运行队列中,那这S状态与我们上面讲的阻塞状态有点儿类似呀,其实S状态本质就是阻塞状态。(要想获得R状态就得在资源准备就绪的一瞬间来用命令查看,太难抓了,我就不演示了)

那后面的+号是什么意思呢?

这里+表示该进程是前台运行的,当我们使用ctrl+c的时候能够终止掉该进程,不写+表示的是后台运行的,这时用ctrl+c是无法终止掉该程序的,要用命令杀掉进程来终止,我们接下来会介绍的。

当我们注释掉代码里的打印字符时:

  1 #include<iostream>
  2 #include<unistd.h>
  3 using namespace std;
  4 
  5 int main()
  6 {
  7   while(1)
  8   {
  9    // cout<<"我是一个进程 我的pid是:"<<getpid()<<endl;               
 10   }                     
 11   return 0;             
 12 }               

再来看看:

ae42e3e41cef42eaab8ea254ccbfa71b.png

我们会发现代码进程的状态已经变成了R.

同理,当我们往键盘中输入数据时几乎绝大多数都是S状态,只有刚输入数据那一瞬间才是R状态。

D状态是一种不可中断休眠状态,这时就算是强如操作系统都不能够干掉他,但是这种场景一般很少见,除非机器快宕机了。

T状态是一种停止状态,我们可以通过一个命令来改变当前的状态位T状态,大家可以查看有哪些kill命令:

kill -l

这时就会出现很多与kill相匹配的选项:

1) SIGHUP  2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
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

这里我们使用19号命令来暂停进程:

kill -19 进程的pid

1143f331ff6842bd9e36f74de94fd4a9.png

那如何恢复呢?

可以用kill命令配带的18号选项:

kill -18 进程的pid

f1d02f62814a4478a4b0104396f95d2d.png

但是大家发现没有,这里的S状态是没有加+,也就是该进程是在后台运行的,不可以被ctrl+c终止

79bb221efadb41a08b86565ae11582de.png

这时应该怎么处理呢?

我们可以试试kill带的9号选项:

kill -9 进程的pid

5ec6432b635b4a5abba72fe50a0e990d.png

这时该进程已经被干掉了。

除了T状态还有一个t状态,这里的t表示的一种追踪暂停,类似于我们打断点运行到断点处:

我们可以打开Makefile加入断点信息,然后调试起来

db86f5bf36c14223ae02133b92ca7131.png

不难发现此时的状态已经变成了t.

至于后面的X和Z状态将会放在下一节课来讲解,如果该文对你有帮助的话能不能3连支持一下博主呢?

相关实践学习
CentOS 8迁移Anolis OS 8
Anolis OS 8在做出差异性开发同时,在生态上和依赖管理上保持跟CentOS 8.x兼容,本文为您介绍如何通过AOMS迁移工具实现CentOS 8.x到Anolis OS 8的迁移。
目录
相关文章
|
25天前
|
Linux
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
63 23
Linux系统之whereis命令的基本使用
|
9天前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
22天前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
69 34
|
5天前
|
Linux
Linux:守护进程(进程组、会话和守护进程)
守护进程在 Linux 系统中扮演着重要角色,通过后台执行关键任务和服务,确保系统的稳定运行。理解进程组和会话的概念,是正确创建和管理守护进程的基础。使用现代的 `systemd` 或传统的 `init.d` 方法,可以有效地管理守护进程,提升系统的可靠性和可维护性。希望本文能帮助读者深入理解并掌握 Linux 守护进程的相关知识。
26 7
|
4天前
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
28 5
|
4天前
|
Linux 应用服务中间件 nginx
Linux 进程管理基础
Linux 进程是操作系统中运行程序的实例,彼此隔离以确保安全性和稳定性。常用命令查看和管理进程:`ps` 显示当前终端会话相关进程;`ps aux` 和 `ps -ef` 显示所有进程信息;`ps -u username` 查看特定用户进程;`ps -e | grep &lt;进程名&gt;` 查找特定进程;`ps -p &lt;PID&gt;` 查看指定 PID 的进程详情。终止进程可用 `kill &lt;PID&gt;` 或 `pkill &lt;进程名&gt;`,强制终止加 `-9` 选项。
16 3
|
4天前
|
存储 算法 数据处理
进程基础:概念、状态与生命周期
进程是操作系统进行资源分配和调度的基本单位,由程序段、数据段和进程控制块(PCB)组成。线程是进程中更小的执行单元,能独立运行且共享进程资源,具有轻量级和并发性特点。进程状态包括就绪、运行和阻塞,其生命周期分为创建、就绪、运行、阻塞和终止阶段。
40 2
|
26天前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
61 16
|
2月前
|
缓存 安全 Linux
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
144 23
|
2月前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
179 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新