【Linux】进程状态和进程优先级
秦jh_ 2024-09-04 14:37:01 阅读 52
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html
目录
R状态和S状态
T/t状态
D状态
Z(zombie)-僵尸进程
僵尸进程危害
孤儿进程
进程的阻塞、挂起、运行
阻塞态
挂起态
进程切换话题
进程优先级
基本概念
查看系统进程
PRI and NI
查看进程优先级的命令
用top命令更改已存在进程的nice:
其他概念
前言
💬 hello! 各位铁子们大家好哇。
今日更新了Linux进程状态、优先级的内容
🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝
进程状态
R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列 里。S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的 进程通常会等待IO的结束。T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
R状态和S状态
我们把进程跑起来后,发现进程的状态一直是休眠状态。如果我们把打印一行代码注释掉,重新跑起来,结果如下图:
此时进程的状态一直是运行状态。这是因为打印时,需要显示器显示,也就是需要外设,而cpu的速度非常快,所以大部分时间,cpu都是在等待设备资源是否就绪。而不打印时,只使用cpu资源,此时就都是R状态。
当我们在后面加上&时,这个进程就默认在后台运行了。此时S后面就没有+号了,有+号就是在前台运行。此时不能直接ctrl+c终止进程,得用kill才可以。
T/t状态
kill -l 指令,我们可以查看所有的信号,这里我们需要19号信号。
kill -19 指令,我们可以让进程暂停,就是T状态。如果想让它继续跑起来,就是需要指令
kill -18 ,让它恢复,如下图:
注意:如果一个进程如果曾经是暂停状态,它会自动变成后台,所以S后面的+号不见了。
我们取调试一个进程,我们在中间打了一个断点。开始运行时,是S状态,到了断点处,就是变成t状态,我们再continue,让他继续跑,进程状态又变成了S,跑完后,又变成t。
T和t可以认为是一样的,只是t表示的是进程因为追踪而暂停了。
D状态
D状态是Linux系统比较特有的一种进程状态!
Linux操作系统有权杀掉进程来释放空间。
通过一个例子认识D状态:
开机时,操作系统就会先加载到内存中。假设现在有一个进程,需要向磁盘存入大量数据,需要一段时间来完成。由于内存中的进程越来越多,操作系统就把刚刚那个进程给杀掉了。此时磁盘还没把这个任务完成,又因为又有别的进程需要用到磁盘工作,磁盘就只好把最开始那个进程给的任务给丢了。如果该进程非常重要,后果就不堪设想。
所以就有D状态,使操作系统无法杀掉该状态的进程。
想消除这个状态,有两种情况:
1.该进程的任务完成了,就能自己醒来。
2.重启,不过可能会卡死,此时就只能断电了。
Z(zombie)-僵尸进程
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲) 没有读取到子进程退出的返回代码时就会产生僵死(尸)进程僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
上图可看到,子进程停止后,子进程就变成了Z状态。该进程就是僵尸进程。
僵尸进程:已经运行完毕,但是需要维持自己的退出信息,在自己的进程task_struct会记录自己的退出信息,未来让父进程来读取,如果没有父进程读取,僵尸进程会一直存在!
僵尸进程会保留内核数据结构task_struct,但进程的代码和数据就不存在了。
僵尸进程不能kill掉,因为僵尸进程已经死掉了。
僵尸进程危害
进程的退出状态必须被维持下去,父进程如果一直不读取,那子进程就一直处于Z状态。维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中。 如果一直不回收,就会造成内存泄漏。
孤儿进程
父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?父进程先退出,子进程就称之为“孤儿进程”孤儿进程被1号进程(OS)本身领养,从而保证子进程被正常回收。
运行后,父进程先退出,进程就只剩一个子进程,也就是孤儿进程。
为什么我们平常启动的进程不会有僵尸进程问题呢?
答:因为直接在命令行中启动的进程,它的父进程都是bash,bash会自动回收新进程的Z
进程的阻塞、挂起、运行
上图的操作系统的进程状态图,也就是一张图纸。Linux的各种进程状态就是具体实现。
task_struct会被放进运行队列中。在Linux中,被放进运行队列,对应的就是R状态。但OS会具体区分就绪状态和运行状态。 在运行队列中,就说明可以随时被调度了。一个进程持有cpu,不会一直运行到该进程结束。而是基于时间片进行轮转调度。如果时间结束了,进程也结束了,就没啥事。如果时间到了,但进程还没结束,就会把该进程放到尾部,接着下一个进程进行轮换。这样多个进程以切换的方式进行调度,在一个时间段内同时得以推进代码,就叫并发。如果有两个cpu,在任何时刻,都有多个进程在真的同时跑,就叫做并行。
注意:Linux不是这么调度的。这只是操作系统教材调度算法的一种。
阻塞态
当我们不输入数字时,进程是阻塞的。在Linux当中,相当于S状态。
当我们运行后,没输入数字时,如下图:
系统会等待键盘资源是否就绪。每种设备都有自己的wait_queue等待队列,上方进程的键盘资源还没就绪,就会把对应的task_struct放到对应设备的等待队列中(即键盘),此时就是阻塞进程了,不会被调度。直到键盘资源就绪后,又回到cpu的运行队列中,从scanf开始执行后面的代码。
阻塞和运行的状态变化,往往伴随着pcb被连入不同的队列中。入队列的不是进程的代码和数据,而是进程的task_struct。
挂起态
磁盘中有一个swap分区,大小大概是内存的1到2倍。 当我们的OS内存严重不足的时候,如果有进程处于阻塞态,OS就会把该进程的数据和代码唤出到磁盘的swap分区,从而释放空间,但该进程的task_struct还是保留的。唤出后的状态叫阻塞挂起态。等到调度时,才会把该进程重新唤入内存中。
进程切换话题
假设有上方代码是进程1,当进程1时间片到了,但是进程还没结束时。cpu寄存器就会把此时的临时数据存到task_struct中。然后进行进程2,如果进程2曾经也没跑完,就会把进程2的task_struct里面的上下文数据恢复到cpu中,然后从历史的进度继续执行。这就叫进程的切换。
cpu内部的所有寄存器中的临时数据,叫做进程的上下文。
进程在切换时,最重要的事是:上下文数据的保护和恢复。
cpu寄存器本身是硬件,具有数据的存储能力。cpu的寄存器硬件只有一套。
cpu的内部数据可以有多套,有几个进程,就有几套和该进程对应的上下文数据。
进程优先级
基本概念
cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整 体性能。操作系统关于调度和优先级的原则:分时操作系统,维持基本的公平。
查看系统进程
在linux或者unix系统中,用ps –l命令(只会显示当前终端的进程)则会类似输出以下几个内容:(这里使用ps -al) :
PRI and NI
PRI :进程优先级。其值越小,优先级越高。NI :进程优先级的修正数据,nice值,新的优先级=旧的优先级+nice,调整进程优先级,在Linux下,就是调整进程nice值nice其取值范围是-20至19,一共40个级别。
查看进程优先级的命令
用top命令更改已存在进程的nice:
top进入top后按“r”–>输入进程PID–>输入nice值
我们把nice值改为100。结果如下图:
NI只是变成19,说明NI值是有范围的。
当我们第二次想修改nice值时,提示不能修改。这是因为nice值不能被频繁修改,此时我们需要切换到root用户才能修改。
刚刚我们的PRI是99,为什么现在nice值是-10,但新的PRI变成70了?
因为每次调整优先级,都是从80开始的。
其他概念
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高 效完成任务,更合理竞争相关资源,便具有了优先级独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。