网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
在了解了什么是进程,以及进程的创建之后,我们需要知道进程其实有不同的状态,一个进程可以有几种状态。
1.进程状态的分类
R:运行状态,并不意味着程序在运行中,它表明进程要么是在运行中要么在运行队列里。
S:休眠状态,意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)。
D:磁盘休眠状态,有时候也叫做不可中断睡眠状态,在这个状态中进程通常会等待IO结束。
T:停止状态,可以通过发送SIGSTOP信号来停止进程,这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。
X:死亡状态,这个状态只是一个返回状态,你不会在列表中看到这个状态。
Z:僵尸状态,一种濒临死亡的状态。
2.R状态
(1)概念
R状态即为运行状态,在前面我们观察的进程的状态都是R状态。
只需要记住一点:
CPU在处理run_queue的时候,所有在排队的进程,都是处于R状态的。因为他们是在排队进行,每一次时间片很短。
(2)Linux下演示
#include<stdio.h>
int main()
{
while(1);
}
我们来写一个死循环的程序,保证程序一直在运行。运行它之后,打开另一个界面来查看进程:
此时我们发现它是一个R+状态,+表示在前台运行。
3.S与D状态
(1)概念
当我们完成某个任务的时候,任务条件不具备,需要进程进行某种等待。
在进程需要使用磁盘进行读写的时候,需要磁盘为其分配资源再由CPU对其进行读写,但如果磁盘并没有就绪,那么此时操作系统会将该想要调用磁盘资源的进程放在一个新的队列中,我们称之为等待队列(wait_queue)。处于该队列的进程处于S状态。当磁盘空间就绪后,进程重新加入run_queue进入R状态。
千万不要以为进程只会等待CPU的资源,进程有可能因为运行需要,可能会在不同的队列中,在不同的队列中所处的状态是不同的。
状态的本质是对进程的分类。
R与S之间的转换,产生了几个概念:
挂起等待:我们把运行状态的进程放到等待队列,称为进程的挂起等待(阻塞)。
唤醒进程:我们把等待队列中的进程放入运行队列,称为进程的唤醒。
S状态表示的浅度睡眠,是可以由control+C来终止的。比如我们使用sleep函数让进程睡眠200s,就可以使用control+C来进行终止。
而下面要说的深度睡眠D是不可以终止的。
当我们进程已经加载到CPU且磁盘已经就绪的时候,如果进程需要将信息写到磁盘上,我们知道外设的访问时间都教长,这个过程是需要时间的。因此进程还需要等待,此时操作系统发现这个进程在等待,如果将其干掉,显然是不合适的,因为磁盘需要将读写成功与否的信息返回给该进程。这就是我们所说的深度睡眠,也就是D状态。处于D状态的进程是不能被control+C干掉的。
(2)Linux下演示
//测试S进程
while(1)
{
printf("test S proess\n");
}
运行后我们发现处于S+状态,这是因为printf是对外设–显示器进行打印的,而显示器比较慢,等待其就绪是需要时间的,因此test大部分时间处于S+状态,只有少部分时间处于R状态。
4.T状态
(1)概念
程序处于暂停状态,此时信息没有任何更新,是完全的暂停。处于S状态的进程会有一些数据更新,比如睡眠了多少秒等。
(2)Linux下演示
我们可以使用
kill -l
指令来查看kill的命令:
其中我们第18个为进程的继续,第19个为进程的停止,我们可以拿之前的程序来进行测试:
当我们对test的进程码进行kill -19的操作时,进程停止了。
此时我们再对其进行kill -18操作:
此时我们发现进程继续进行。
但是此时我们发现我们通过control+C不能杀掉该进程了。
再进行进程搜索的时候我们发现:
之前处于S+状态的test现在处于了S状态。
此时程序在后台运行,只能通过kill -9来杀掉进程。
5.t状态
(1)概念
追踪状态,由我们控制程序一步一步执行,比如调试的过程。
(2)Linux下演示
//测试t状态
int a=10;
printf("%d",&a);
我们使用这段简单的代码来测试,并使其进入调试状态,gdb的使用请参考这篇文章:Linux下代码调试器—gdb的使用
此时我们发现gdb test和test分别处于S+和t的状态,gdb test在等待键盘输入,test处于追踪状态。
6.X状态
死亡状态,CPU会进行资源的回收,包括PCB和代码数据等。
X状态已经死亡,没法演示,但是我们可以演示Z状态。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!