🌈个人主页:秦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):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
我们把进程跑起来后,发现进程的状态一直是休眠状态。如果我们把打印一行代码注释掉,重新跑起来,结果如下图:
此时进程的状态一直是运行状态。这是因为打印时,需要显示器显示,也就是需要外设,而cpu的速度非常快,所以大部分时间,cpu都是在等待设备资源是否就绪。而不打印时,只使用cpu资源,此时就都是R状态。
当我们在后面加上&时,这个进程就默认在后台运行了。此时S后面就没有+号了,有+号就是在前台运行。此时不能直接ctrl+c终止进程,得用kill才可以。
kill -l 指令,我们可以查看所有的信号,这里我们需要19号信号。
kill -19 指令,我们可以让进程暂停,就是T状态。如果想让它继续跑起来,就是需要指令
kill -18 ,让它恢复,如下图:
注意:如果一个进程如果曾经是暂停状态,它会自动变成后台,所以S后面的+号不见了。
我们取调试一个进程,我们在中间打了一个断点。开始运行时,是S状态,到了断点处,就是变成t状态,我们再continue,让他继续跑,进程状态又变成了S,跑完后,又变成t。
T和t可以认为是一样的,只是t表示的是进程因为追踪而暂停了。
D状态是Linux系统比较特有的一种进程状态!
Linux操作系统有权杀掉进程来释放空间。
通过一个例子认识D状态:
开机时,操作系统就会先加载到内存中。假设现在有一个进程,需要向磁盘存入大量数据,需要一段时间来完成。由于内存中的进程越来越多,操作系统就把刚刚那个进程给杀掉了。此时磁盘还没把这个任务完成,又因为又有别的进程需要用到磁盘工作,磁盘就只好把最开始那个进程给的任务给丢了。如果该进程非常重要,后果就不堪设想。
所以就有D状态,使操作系统无法杀掉该状态的进程。
想消除这个状态,有两种情况:
1.该进程的任务完成了,就能自己醒来。
2.重启,不过可能会卡死,此时就只能断电了。
上图可看到,子进程停止后,子进程就变成了Z状态。该进程就是僵尸进程。
僵尸进程:已经运行完毕,但是需要维持自己的退出信息,在自己的进程task_struct会记录自己的退出信息,未来让父进程来读取,如果没有父进程读取,僵尸进程会一直存在!
僵尸进程会保留内核数据结构task_struct,但进程的代码和数据就不存在了。
僵尸进程不能kill掉,因为僵尸进程已经死掉了。
运行后,父进程先退出,进程就只剩一个子进程,也就是孤儿进程。
为什么我们平常启动的进程不会有僵尸进程问题呢?
答:因为直接在命令行中启动的进程,它的父进程都是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的内部数据可以有多套,有几个进程,就有几套和该进程对应的上下文数据。
在linux或者unix系统中,用ps –l命令(只会显示当前终端的进程)则会类似输出以下几个内容:(这里使用ps -al) :
我们把nice值改为100。结果如下图:
NI只是变成19,说明NI值是有范围的。
当我们第二次想修改nice值时,提示不能修改。这是因为nice值不能被频繁修改,此时我们需要切换到root用户才能修改。
刚刚我们的PRI是99,为什么现在nice值是-10,但新的PRI变成70了?
因为每次调整优先级,都是从80开始的。
上一篇:多进程并发服务器