【Linux】进程的状态和进程优先级
进程状态
进程状态的名词解析
- 新建:字面意思重新创建一个进程,但是这个进程的test_struct还没有加载到运行队列中此时的状态成为新建。
- 运行:进程的test_struct结构体被加载到可执行队列中。
- 阻塞:等待非CPU资源的就绪时的状态就叫做阻塞。
阻塞具体形式:当代码中存在cin、scanf这种语句,运行程序时我们未进行输入时。 - 挂起:当操作系统中的内存匮乏时(内存无法加载其他进程),此时操作系统会控制内存和硬盘进行资源的置换(置换的只是代码和数据),test_struct并没有参与置换,此时进程的状态称为挂起状态。
对于进程状态的一些补充
补阻塞:
操作系统中是不止可执行队列这一种队列的,还包括一些其他硬件的队列,例如当CPU进行执行进程的代码数据,其中涉及想要进行文件操作往文件中进行写入数据时,此时要到硬盘的那个可执行队列下进行等待,像这样的和CPU没有关系的资源等待的进程的状态就是阻塞状态。
补挂起
当操作系统中内存出现不足时,操作系统会将长时间在存在于内存中但是没有被执行的进程的数据和代码进行置换到硬盘中的swap分区
假如硬盘中的swap分区要是满了怎么办?
硬盘中swap分区一般是不可能出现爆仓的情况的,因为硬盘和内存进行读取数据的速率本来就不是一个量级的,通过前面的学习我们可以知道,量级不同的硬件进行读取是取决于慢的那一个,操作系统是非常聪明的,操作系统本身也是不倾向进行频繁的置换的,这也就是swap区一般不会出现饱满的原因,要是swap几乎也满了的时候,这时候操作系统不得不进行频繁的置换,此时操作系统的效率是十分低的,给我们的直观感受也就是操作系统十分卡顿。
阻塞挂起
有时候我们还会看到阻塞挂起这种状态,这种状态其实就是阻塞和挂起两种状态的叠加,当进程正在处于阻塞状态,此时正好遇到了操作操作系统的内存危机,正好此时处于阻塞状态的进程又被置换到硬盘中的swap分区中,此时这个进程的状态就称为阻塞挂起。
Linux内核中的进程状态
进程的分类
-
前台进程
前台进程是进程后面带+,例如R+,S+这种只要进程后面带+号就是属于前台进程,前台进程可以运行时将不在可以进行命令的输入,可以通过ctrl c进行中断,其实前台命令是占用base的对话框使得命令无效。
- 后台进程
后台进程是进程状态后面不带+,进程在执行的过程中也可以使用命令进行操作,但是想要进行终止掉进程ctrl c 无效,必须通过kill 命令进行杀掉进程。
后台进程的执行操作 :./文件名 + &
-
什么是R状态?
-
什么是S状态?
通过上面我们可以观察到有两种状态,分别是R+ 和 S+ ,R状态是运行时状态,表示进程正在运行,S状态是休眠状态,表示进程正在进行非CPU资源的等待。为什么将cout语句注释后状态从S状态转变成了R状态呢?
计算机的组成是冯诺依曼体系结构,printf是输出流将信息打印到我们的屏幕上,但是相对于内存来说输出设备读取数据的速率是远小于内存进行加载数据的效率的,此时完成进程的时间消耗基本都在输出设备的输出上面,因此进程的状态是休眠状态,将cout进行注释后的状态就变成了运行时状态。
可中断休眠状态的理解
主观理解:计算机世界中的可休眠就相当于我们这个世界中的某个人进行休息,旁边立了一块牌子上面写着,“正在休息,有事请叫醒我”,是可以对程序进行中断程序的操作的。
什么是D状态?
D状态和上面的S状态都是睡眠状态,但是D状态是不可唤醒的深度睡眠。
D状态存在的意义是什么?
当内存将数据交于磁盘让磁盘进行写入,此时内存在等待磁盘进行写入,处于S状态,然后操作系统内存出现紧张时,检测到这个正在等待磁盘进行写入的处于休眠状态的进程,此时内存资源紧张,这个进程还在处于休眠状态,直接将其杀掉释放内存空间,但是操作系统不知道的时,这个进程其实是在等磁盘写入的结果,当磁盘进行写入成功后,由于让磁盘进行写入数据的那个进程已将被操作系统杀掉了,没有进程进行接收磁盘写入成功的信号,磁盘只好将已经写好的数据丢掉,然后进行完成其他的认识,但是用户层是不知道数据丢失的,此时就会出现问题。
这时候当进程通过让磁盘进行写入后,自身直接变成D状态,当操作系统在出现内存紧张时,操作系统在想进行杀掉这个等待磁盘写入结果的这个进程是没有办法的,只能通过其他方法进行释放内存,只有进程接到磁盘的写入结果后,磁盘D状态才得以解除。
什么是T状态?
当我们通过gdb进行调试时,此时进程的状态称为T状态。
注:T和t都表示一样的的调试状态。
什么是X状态?
X是进程死亡状态。
- 既然进程已将死亡,操作系统直接将资源进行回收就可以了,为什么还要将进程标为死亡状态呢?
①操作系统中进程是非常多的,同时死亡的进程也是非常多的,操作系统进行资源回收时需要根据进程的状态来看。
②其实当进程已将死亡,操作系统此时还可能在处理其他的一些事,通过将进程标为死亡状态方便后续将死亡的进程的资源进行回收。
什么是Z状态?
Z状态称为僵尸状态,此时进程已经死亡,但是处于被检测的状态。例如当子进程已将死亡,但其父进程尚未读取其退出状态信息的进程。虽然这些进程已经终止,但它们依然存在于进程表中,占用系统资源,直到父进程获取它们的退出状态为止。
进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。
- 僵尸状态存在的意义
等待父进程或者OS进行资源的回收
- 僵尸进程的机制
当一个子进程终止时,操作系统会发送一个 SIGCHLD
信号给父进程。父进程接收到该信号后,应该调用 wait()
或 waitpid()
来读取子进程的退出状态。此时,操作系统会清理掉这个进程,并释放相关资源。如果父进程没有及时调用 wait()
或 waitpid()
,进程会在进程表中以僵尸进程的形式存在,直到父进程最终处理这些退出状态。此时,尽管僵尸进程已经不再占用CPU资源,但它依然占用进程ID,影响系统的进程管理。
- 僵尸进程的危害
当父进程创建出很多子进程,这些子进程意外退出等待父进程进行进程结果的获取,但是父进程并未进行进程退出结果的获取,此时子进程处于僵尸状态,但是操作系统进行维持这种退出状态的本身就需要进行数据维护,这种数据维护的信息就处于PCB(task_struct)中,父进程不进行回收,就一直需要PCB进行维护,PCB就一直占用系统资源进行维护进程的这种退出状态,就造成了资源的泄漏。
状态的总结
R状态:运行时状态,对应上面的运行状态。
S状态:可中断睡眠状态,对应上面的阻塞状态,有资源的等待。
D状态:睡眠状态,磁盘睡眠,深度睡眠,不可唤醒睡眠。
T状态:暂停调试状态,没有资源的等待zhung状态:进程死亡状态
X状态:进程死亡状态,瞬时性非常强。
Z状态:僵尸状态,进程已经对出,资源处于被检测时的状态
孤儿进程
-
孤儿进程的理解
当子进程退出,父进程正在运行且没有对子进程退出信息读取的状态我们称为僵尸进程,与此相对,当子进程正在运行,父进程退出,此时的进程我们称为孤儿进程。
-
孤儿进程的处理机制
当父进程退出后,子进程的父进程会进行重新匹配,1号进程变成子进程的父进程,也就是说一号进程将孤儿进程进行领养。
-
为什么出现孤儿进程要被领养?
当孤儿进程结束时,需要有父进程进行资源的释放。
进程的优先级
-
为什么要有进程的优先级?
CPU的资源是有限的,而进程太多,需要通过某种方式进行争取资源。
-
进程的优先级是什么?
优先级的含义是谁先获取某种资源,进程的优先级是进程获取CPU资源的优先级。优先级是调度器进行调度的主要参考。调度器进行执行优先级的规则是优先级数值小的先被调度器执行,也就是说优先级的数值和实际被调用是成反比的。
-
Linux操作系统是如何进行调整进程的优先级的?
通过一些数据进行表明优先级,优先级存储在PCB结构中,只有调度器在进行调度时优先级才具有意义。
优先级=老的优先级+nice值
-
进行查看优先级的命令
命令 :ps l
带有头信息查看指定程序的优先级: ps l | head -1 && grep 程序名
- PRI:程序老的优先级
- NI:程序的nice值
更改程序优先级
更改程序优先级其实就是通过更改程序的nice值进行实现的。其中nice值的范围为[-20,19],每次进行更改程序的优先级都是从默认的值进行修改的,也就是默认的老优先级+nice值。
nice值的范围为什么这么小呢?
其实一款优秀的操作系统秉持的理念就是可以通过调节进程的优先级来改变进程访问资源的时机,但是不会将调节优先级的跨度设置的太宽,防止恶意进程通过恶意调节nice值进行霸占CPU的资源,使CPU进行的在短时间内能够尽量雨露均沾。
原来程序的优先级是20,通过设置nice值将程序的优先级调节成39,优先级的数值被调大了,但是优先级是变小了的。
步骤
- 首先通过top命令进行查看进程
- 然后输入 r 后进行输入需要调整的程序的PID,默认系统只允许我们将优先级往低了调不允许我们把优先级进行调高,这时候执行sudo top 即可
- 最后输入想要进行调整的nice值的数值
其他概念
竞争性
计算机的CPU资源是有限的,进程的数量是很多的,当多个进行进行都想让CPU进行运行时,进程之间争夺CPU资源的行为称为竞争性。
独立性
父进程创建子进程,但是子进程的中断并不会影响父进程的运行,同理,父进程的中断也是不会影响子进程的运行的,这就体现了进程的独立性。
并行
多个CPU在同一时刻同时进行执行多个进程的现象称为并行。
并发
执行并发的两个重要因素
- 时间片
- 进程的优先级
切换的概念
CPU中有很多寄存器,实际上代码和数据中的临时变量我们都知道是通过拷贝进行返回的,其实这种通过拷贝然后返回的方式拷贝的内容都是存放到寄存器中的,寄存器中存放的进程的信息称为上下文数据,当CPU正在进行运行进程A,由于时间片或者进程优先级的因素,此时虽然进程A还没有执行完,但是此时需要进行执行进程B了,CPU执行的进程由A变成B的过程称为切换。
切换后进程A需要将CPU寄存器中的数据进行打包带走,存储到进程中的PCB结构中,当后续CPU在进行执行进程A时通过PCB中存储的信息,不用从头开始执行,直接从上次被切下来的位置进行执行即可。
并发的实现
- 并发的实现---时间片
CPU通过运行执行队列中的进程不是将一个进程执行完后才取执行另一个进程的,系统当中存在时间片的概念,假如分配给CPU执行进程的总时间有50毫秒,这50毫秒需要进行分配给每个进程,假设分配给第一个进程5毫秒,剩下的进程平均分配剩下的执行时间,当CPU执行第一个进程到达5毫秒后,进程没有执行完,但是不好意思,这时候必须进行切换下一个进程。
- 并发的实现---优先级
当CPU正在执行进程A,此时进程B的优先级比A高此时CPU需要进行执行切换B进程。
原文地址:https://blog.csdn.net/2302_80475369/article/details/144326648
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!