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状态。
7.Z状态
(1)概念
僵尸状态,即濒死状态。
为什么会有这一状态呢?因为进程死亡之前我们需要了解它是自然退出还是被OS或者其他程序所干掉的。此时会产生进程退出的信息,并将其写入task_struct(PCB)中。
我们知道处于X状态的进程中的资源会被回收,回收者为该进程的父进程。如果还没有对其进行回收的话,那么此时该进程处于Z状态。因此我们可以通过这一点来进行演示Z状态的进程:
(2)Linux下的演示
我们可以先让父进程处于休眠状态的同时干掉子进程,此时子进程没有进行资源回收,处于Z状态。
//测试Z状态
pid\_t id=fork();
if(id==0)
{
while(1)
{
printf("I am a child\n");
sleep(2);
}
}
else
{
printf("father do nothing\n");
sleep(1000);
}
此时由于父进程在休眠中,当我们干掉子进程之后,子进程进入Z状态。并出现了default的单词,表示违规。
如果我们在代码中干掉父进程呢?
else
{
printf("father do nothing\n");
sleep(10);
exit(-1);
}
此时我们会发现,只有子进程在运行,此时的子进程称为孤儿进程。
此时我们发现,子进程还在执行,只不过它的父进程编程了pid为1的进程,那么这个1是谁呢?操作系统。
即操作系统会领养这个孤儿进程。
8.总结
通过上述的描述我们是否对操作系统书中的那张似曾相识的图有了更深的理解了呢?
显然它并没有显示全面。
为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。
本份面试集锦涵盖了
- 174 道运维工程师面试题
- 128道k8s面试题
- 108道shell脚本面试题
- 200道Linux面试题
- 51道docker面试题
- 35道Jenkis面试题
- 78道MongoDB面试题
- 17道ansible面试题
- 60道dubbo面试题
- 53道kafka面试
- 18道mysql面试题
- 40道nginx面试题
- 77道redis面试题
- 28道zookeeper
总计 1000+ 道面试题, 内容 又全含金量又高
- 174道运维工程师面试题
1、什么是运维?
2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
3、现在给你三百台服务器,你怎么对他们进行管理?
4、简述raid0 raid1raid5二种工作模式的工作原理及特点
5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
k?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?