【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连支持一下博主呢?

目录
相关文章
|
1月前
|
Ubuntu Linux
计算机基础知识:linux系统怎么安装?
在虚拟机软件中创建一个新的虚拟机,并选择相应操作系统类型和硬盘空间大小等参数。将下载的 ISO 镜像文件加载到虚拟机中。启动虚拟机,进入安装界面,并按照步骤进行安装。安装完成后,可以在虚拟机中使用 Linux 系统。
|
1月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
653 10
|
1月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
294 0
|
1月前
|
Ubuntu Linux 开发者
国产 Linux 发行版再添新成员,CutefishOS 系统简单体验
当然,系统生态构建过程并不简单,不过为了帮助国产操作系统优化生态圈,部分企业也开始用国产操作系统替代 Windows,我们相信肯定会有越来越多的精品软件登录 Linux 平台。
101 0
|
1月前
|
Ubuntu 安全 Linux
Linux系统入门指南:从零开始学习Linux
Shell脚本是一种强大的自动化工具,可以帮助您简化重复的任务或创建复杂的脚本程序。了解Shell脚本的基本语法和常用命令,以及编写和运行Shell脚本的步骤,将使您更高效地处理日常任务。
189 0
|
1月前
|
Ubuntu Linux 图形学
Linux学习之Linux桌面系统有哪些?
Cinnamon:与MATE类似,Cinnamon 拥有 GNOME 和 Unity 等其它桌面环境所没有的种种功能,是高度可定制的桌面环境,不需要任何外部插件、窗口组件和调整工具来定制桌面。
109 0
|
1月前
|
Ubuntu 安全 Linux
十款常用Linux系统介绍
本文不是什么大盘点。市面上有好几百款发行版,每款发行版在某个方面都与众不同。不可能在此全部罗列,本文只罗列了十款最常见的Linux发行版(世界上只有两种人,一种是懂二进制的,另一种是不懂二进制的)。请宣传Linux的魅力或威力。
|
1月前
|
Ubuntu 安全 Linux
linux系统|Ubuntu 18.10 如期正式发布,新面孔新技术都来了
微软公司也终于沉不住气要在linux开源系统开疆扩土了。mscode这样的工具的确好用,虽然差第一名那么一点儿,但是最老版的公司出版的软件的确很是让人动心!
|
1月前
|
Ubuntu Linux 数据安全/隐私保护
Win10安装Linux子系统教程!如何在Win10系统中安装Ubuntu!
登录系统后,输入cd /返回上一级,然后再输入“ls”查看一下系统文件目录,看看对不对!
|
1月前
|
Web App开发 安全 Linux
Linux 比起其他系统的5 个优点和 5 个缺点
对Linux系统感兴趣的朋友,可以点击下方书籍进行学习。