进程状态优先级

目录

1.进程的状态​编辑

接下来解释一下并行和并发:

并发就是多个进程在一个cpu上,在一段时间内,多个进程都可以进行推进,称之为并发。

并行就是多个进程在多个cpu下,同时进行运行,这称之为并行。

接下来解释一下时间片:

进程具有独立性:

其实上面的五型模型其实是有争议的,因为官方上讲就绪也称为运行,实际上要讲的主要内容其实是围绕运行和阻塞的。

等待的本质:

接下来解释一下为什么争议的问题:

“先描述,再组织”

接下来认识一下操作系统是如何管理底层硬件的呢?

有了知识铺垫,这时就可以学一下阻塞状态了:

所以运行和阻塞的本质:是让不同的进程,处在不同的队列中!

接下来了解一下挂起:

了解了进程的状态这种哲学层面的,再来了解一下linux上具体的进程的状态:

R运⾏状态(running):

S休眠状态(sleeping):

D磁盘休眠状态(Disk sleep):

T停⽌状态(stopped):

t追踪停止状态(tracing stop):

X死亡状态(dead):

Z僵尸状态(zombie):

echo $?


1.进程的状态

在众多linux教材中都有如上图所解释的哲学层面的,可以应用于任何操作系统上的进程的状态模型。

只不过在用户层面上感受不到,因为cpu切换和运行的速度非常快。

接下来解释一下并行和并发:

并发就是多个进程在一个cpu上,在一段时间内,多个进程都可以进行推进,称之为并发。

cpu执行进程代码,不是把进程代码执行完毕,才开始执行下一个。

而是给每个进程预分配一个时间片,基于时间片,进行调度轮转(单CPU下),并发。

白话就是多个进程先按照调度器来进行调度,每个进程进入到运行状态只执行一部分,在经过进程的五态模型,轮转进行调度,最后完成所有进程的任务。

并行就是多个进程在多个cpu下,同时进行运行,这称之为并行。

区别在于:单CPU和多CPU,时间段和同时进行。

接下来解释一下时间片:

linux/windows民用级别的操作系统都是分时操作系统,就是给每个进程分配一定的时间片进行轮转执行,当然调度任务是追求公平的每个进程的时间片会有所不同。

实时操作系统:企业级可以使用的到。

进程具有独立性:

父进程和子进程都具有独立性,子进程挂掉了,不影响父进程。

其实上面的五型模型其实是有争议的,因为官方上讲就绪也称为运行,实际上要讲的主要内容其实是围绕运行和阻塞的。

等待的本质:

空出cpu,进入目标外部设备。

在内核级数据结构方面上讲,进程的status(所谓的状态),其实是用的#define RUNNING 1/#define BLOCK 2类似这种来表示的,也就是进程的pcb进程控制块里的属性status是int类型的。

接下来解释一下为什么争议的问题:

首先先明确有cpu、内存和操作系统三个结构,遵循着冯诺依曼体系结构,进程是从硬盘上调入内存在经过cpu再给到外设。

“先描述,再组织”

进程包括代码、数据和PCB进程控制块

通过链表的数据结构来构成对链表的增删查改。

这里需要一个struct runqueue运行队列:包括属性+task_struct* head,来链接所有的在运行态的PCB。

这里要明确知道只要进程在运行队列中,该进程就叫做运行状态。即我已经准备好了,可以被CPU随时调度了。

接下来认识一下操作系统是如何管理底层硬件的呢?

这里依旧是"先描述,再组织"

定义一个struct结构体对象device,里面包含属性+next结构体指针。

通过struct device* devices结构体指针来链接所有的结构体对象,最后就变成了最链表的增删查改。

有了知识铺垫,这时就可以学一下阻塞状态了:

通过最上面的图可知I/O请求时会进入阻塞状态,阻塞状态就是从cpu换出,调入到硬件管理,也就是外设的问题了。

其实device结构体对象里面还有一个变量叫wait_queue即等待队列,从运行态到阻塞态就是将代码和数据+pcb进程控制块从运行队列拿到设备PCB的等待队列中。

所以运行和阻塞的本质:是让不同的进程,处在不同的队列中!

比如说:scanf函数在键盘设备pcb控制块中,此时阻塞,一旦键盘输入数据,进程就从等待队列进入到运行队列

接下来了解一下挂起:

首先了解背景:是在内存资源严重不足的时候,进程会进入到挂起状态。

比如日常当中我们用的安卓操作系统,开了很多的软件,我们知道操作系统是管理软硬件资源的一款软件,在开机时操作系统是先调入到内存中的,再怎么样软件挂掉也不能让操作系统挂掉,一旦内存资源严重不足时,操作系统就意识到危机了就会采取措施。

磁盘当中有一块空间叫做swap分区,操作系统就会将一些进程当中的运行过的数据换出到swap里,为了腾出内存空间,将进程从等待队列调入到运行队列中去,直到到这个进程时,先从运行队列到等待队列,再从磁盘中的swap分区换入到进程当中。

这个过程是在I/O设备上操作的,也就是所谓的“慢”,这种方法叫做:“用时间换空间”。

这种过程叫做"挂起",也就是阻塞挂起状态。

当然也是了解一下,实际上在互联网公司这种挂起状态是不被允许的,因为会大大的影响公司的运作,慢也就是其原因,解决方法也就是搞多台服务器。

了解了进程的状态这种哲学层面的,再来了解一下linux上具体的进程的状态:

static const char *const task_state_array[] = {
"R (running)", /*0 */
"S (sleeping)", /*1 */
"D (disk sleep)", /*2 */
"T (stopped)", /*4 */
"t (tracing stop)", /*8 */
"X (dead)", /*16 */
"Z (zombie)", /*32 */
};

R运⾏状态(running):

并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏
队列⾥。

S休眠状态(sleeping):

意味着进程在等待事件完成(这⾥的睡眠有时候也叫做可中断睡眠
(interruptible sleep),浅睡眠)。阻塞等待的状态,I/O操作时状态会发生改变。

D磁盘休眠状态(Disk sleep):

有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个
状态的进程通常会等待IO的结束。

比如说:存在进程A、操作系统和磁盘,今天模拟一个银行存储的故事,内存中现在已经有了进程A,进程A给磁盘说:磁盘我有100w个银行交易数据你能帮我存一下吗?磁盘回复:可以啊,你拿过来吧。此时磁盘就开始帮忙存数据了,可是磁盘由于容量不足存不下了,想告诉进程A时,进程A被强制杀掉了,此时磁盘按照以往的习惯就取消掉已经存储的一些数据了,可是这就造成了数据丢失了!那这三人就说不清了,互相指责,此时行长也蒙圈了,产生了自我怀疑,难道是我的问题?

此时行长就设定了一种状态D:叫做深度睡眠,不可被杀掉。所以disk(也就是磁盘)也是阻塞等待状态的一种。

T停⽌状态(stopped):

可以通过发送 SIGSTOP 信号给进程来停⽌(T)进程。这个被暂停的
进程可以通过发送 SIGCONT 信号让进程继续运⾏,通过kill -l可以查看到信号19来stop暂停进程,18来continue继续进程,当然我们发现我们ps ajx|head -1 && ps ajx | grep code时发现status状态栏中出现有S+的符号,这里的+表示的是什么呢?
其实有+表示的是前台,没有+表示的是后台。
就好比我们对于某个应用程序使用小窗模式,应用程序依然执行着下载安装某款软件的任务,这就叫做后台运行。
前台运行是不能在可执行程序运行过程中输入其他指令的,而后台可以,因为其不影响前台的指令操作。

t追踪停止状态(tracing stop):

比如我们学的gdb调试工具,gdb运行时也是一个进程,而通过gdb的running了一个进程,通过b n打断点的方式运行,此时这个进程就被跟踪了,所以当进程被跟踪时,断点停下,进程状态就是t。
而大T的意思是进程做了非法但是不致命的操作,被OS暂停了,也就是通过ctrl+c或者kill -9 pid来杀进程。
这里回顾一下+,在后台运行不能通过ctrl+c来终止进程,只能通过新建一个窗口来使用kill的方式杀进程,而前台是可以使用ctrl+c的。

X死亡状态(dead):

这个状态只是⼀个返回状态,你不会在任务列表⾥看到这个状态。

Z僵尸状态(zombie):

这个状态和X状态连起来学习。
比如:你在公园跑步,身边有个大爷,而你的速度是中老年速度,大爷是青年速度,而大爷跑在前面跑着跑着倒下了,此时你需要做什么?
由于我们是个良好市民,拨打了120,120来了发现大爷已经没有生命迹象了,此时又拨打110,110来了后,首先就是封锁现场,然后请来法医来采一些样本回去化验,最后在联系家属来做后续的事情。
这个过程,在中间是僵尸状态,在最后做后续的事情时才是死亡状态。
运用到我们学的高级程序语言的返回值return 0;
自始至终main函数的return 0到底是什么意思呢?
先铺垫一下,在linux下使用ls时,ls就是个进程,ls的父进程是bush,也就是内核。
当我们使用ls时输入一条指令:

echo $?

会显示0
当我们使用ls一个不存在的文件时:
会显示2或者其他数字
为什么呢?
首先echo $?的意思是最近程序退出时的退出信息。
而我们日常使用的main函数return 0,0就表示进程完成了,非0就表示其他信息。
那么进程为什么会被创建?
进程创建出来,是为了完成用户的任务的。
任务完成了吗?
通过进程执行的结果,告知父进程/操作系统,我把任务完成的如何?

<think> 嗯,用户这次明确要求解释静态优先级和动态优先级的定义及确定依据,还提供了详细的引用材料。看来用户正在深入学习操作系统进程调度机制,尤其是Linux的实现细节。 从引用内容看,用户已经掌握了nice值映射关系(-20到+19对应120-139优先级)和动态调整的基本概念,但需要更系统的定义和依据说明。用户可能正在准备考试或研究调度算法优化,问题提得非常精准。 需要特别注意三个技术要点: 1)静态优先级的初始值设定逻辑(120+nice)及其不可变性 2)动态优先级计算中奖励I/O型进程惩罚CPU型进程的机制 3)进程状态(运行/睡眠)如何影响调度权重 用户提供的Linux中断上下文切换流程引用[^3]虽然详细,但和当前问题关联度不高,可以简略带过。重点应放在优先级确定规则上,尤其是counter衰减机制这个关键动态因素。 上次回答调度准则时提到过优先级调度,这次可以延续“公平性vs效率”的框架。用户似乎对技术细节吸收能力很强,可以适当展开O(1)调度器的时间片计算逻辑,但要注意避免偏离核心问题。 最后生成的问题要引导到实际应用场景:如何设置nice值优化性能?实时进程优先级冲突如何处理?这些是系统管理员常遇到的痛点。 </think>### 静态优先级与动态优先级的定义及确定依据 #### **一、静态优先级的定义** 静态优先级进程创建时分配的**固定基准优先级**,通常由用户或系统初始化设定: 1. **定义**: - 在Linux中通过`nice值`映射,范围`-20`(最高)到`+19`(最低) - 计算公式:$静态优先级 = 120 + nice值$,对应优先级范围$100 \sim 139$(普通进程)[^1] - 示例:`nice = -10` → 静态优先级$=120 + (-10)=110$ 2. **确定依据**: - **用户指定**:通过`nice`命令或系统调用(如`setpriority()`)显式设置 - **继承机制**:子进程默认继承父进程的静态优先级 - **系统策略**:实时进程优先级范围$0 \sim 99$)由调度策略(如`SCHED_FIFO`)固定分配[^2] --- #### **二、动态优先级的定义** 动态优先级是调度器**实时计算**的优先级,用于实际调度决策: 1. **定义**: - 基础公式:$动态优先级 = \max(100, \min(静态优先级 - bonus + 5, 139))$ - `bonus`:范围$0 \sim 10$,由进程行为动态调整 - 惩罚CPU密集型进程(`bonus↓`),奖励I/O密集型进程(`bonus↑`) 2. **核心作用**: - 避免进程饥饿:长时间未运行的进程动态优先级提升 - 优化响应:交互式进程(如终端输入)通过`bonus`机制获得更高调度机会[^2] --- #### **三、确定进程优先级的依据 | **因素** | **静态优先级** | **动态优先级** | |-------------------|-------------------------------|-------------------------------| | **用户控制** | `nice`值显式设置[^1] | 不可直接设置 | | **行为反馈** | 无 | 基于CPU/I/O使用历史(`bonus`)| | **公平性保障** | 固定值 | 随时间衰减(防止饥饿) | | **调度触发时机** | 进程创建时 | 每次调度前重新计算[^3] | #### **动态优先级计算流程**(以Linux O(1)调度器为例): ```mermaid graph LR A[进程唤醒/时间片耗尽] --> B{计算bonus} B -->|I/O阻塞率高| C[bonus增加] B -->|CPU占用率高| D[bonus减少] C & D --> E[动态优先级 = 静态优先级 - bonus + 5] E --> F[优先级数值越低 → 调度权重越高] ``` --- #### **四、进程状态优先级的影响** 1. **运行态(TASK_RUNNING)**: - 参与动态优先级计算,`bonus`随CPU使用率衰减 - 示例:CPU密集型进程运行$200ms$后,`bonus`值下降 → 动态优先级升高(调度权重降低)[^3] 2. **阻塞态(TASK_INTERRUPTIBLE等)**: - 唤醒时动态优先级**重置**:$新优先级 = \max(旧优先级, 静态优先级)$ - I/O阻塞进程因高`bonus`获得优先级补偿 3. **实时进程特殊规则**: - 静态优先级固定($0 \sim 99$),**不参与**动态调整 - 调度策略(如`SCHED_FIFO`)直接按静态优先级排序[^2] > **关键总结**:静态优先级提供基准控制,动态优先级实现**响应与公平的平衡**。交互式进程通过I/O阻塞行为提高调度权重,而CPU密集型任务通过优先级衰减避免垄断CPU资源[^3]。 --- ### **相关问题** 1. `nice`值调整对系统吞吐量和响应时间的量化影响如何? 2. 实时进程(如`SCHED_RR`)与普通进程优先级映射机制有何差异? 3. 动态优先级计算中`bonus`参数的具体算法是怎样的? 4. 多核场景下如何保证动态优先级计算的负载均衡
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值