1、状态转换
三态:就绪、阻塞、运行
五态:活动就绪、静止就绪、活动阻塞、静止阻塞、运行

活动就绪 变 静止就绪 和活动阻塞 变 静止阻塞
因为:内存不够,调到外存。

执行 变 静止就绪
因为:时间片用完。

参考:
https://blog.csdn.net/leefangsong/article/details/106261349【五态】

2、进程调度算法

在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用。下面介绍几种常用的调度算法。

2.1进程调度算法

算法 特性、优缺点
1.先进先出算法(FIFO) 按照进程进入就绪队列的先后次序来选择。即每当进入进程调度,总是把就绪队列的队首进程投入运行。
2.时间片轮转算法Round Robin(RR) 分时系统的一种调度算法。 轮转的基本思想是,将CPU的处理时间划分成一个个的时间片,就绪队列中的进程轮流运行一个时间片。当时间片结束时,就强迫进程让出CPU,该进程进入就 绪队列,等待下一次调度,同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行。
3.最高优先级算法(HPF) 进程调度每次将处理机分配给具有最高优先级的就绪进程。最高优先级算法可与不同的CPU方式结合形成可抢占式最高优先级算法和不可抢占式最高优先级算法。
4.多级队列反馈法 几种调度算法的结合形式多级队列方式。

2.2 批处理作业调度算法

算法 特性、优缺点
1.先来先服务调度算法First Come,First Served.(FCFS) 就是按照各个作业进入系统的自然次序来调度作业。这种调度算法的优点是实现简单,公平。其缺点是没有考虑到系统中各种资源的综合使用情况,往往使短作业的用户不满意,因为短作业等待处理的时间可能比实际运行时间长得多。
2.短作业优先调度算法shortest job first(SPF) 就是优先调度并处理短作业,所谓短是指作业的运行时间短。而在作业未投入运行时,并不能知道它实际的运行时间的长短,因此需要用户在提交作业时同时提交作业运行时间的估计值。
3.最高响应比优先算法Hightest response-radio next(HRN) FCFS可能造成短作业用户不满,SPF可能使得长作业用户不满,于是提出HRN,选择响应比最高的作业运行。响应比=1+作业等待时间/作业处理时间。
4.最高优先级优先算法Highest Possible Frequency(HPF) 每一个作业规定一个表示该作业优先级别的整数,当需要将新的作业由输入井调入内存处理时,优先选择优先数最高的作业。
5.时间片轮转??
6.均衡调度算法,即多级队列调度算法 多级队列调度算法将就绪队列分成多个单独队列,根据进程属性,如内存大小、进程优先级、进程类型等,一个进程永久分到一个队列,每个队列有自己的调度算法。
基本概念:
   作业周转时间(Ti)=完成时间(Tei)-提交时间(Tsi)
   作业平均周转时间(T)=周转时间/作业个数
   作业带权周转时间(Wi)=周转时间/运行时间
   响应比=(等待时间+运行时间)/运行时间

2.3 Linux进程调度策略

1,SCHED_OTHER 分时调度策略,
2,SCHED_FIFO实时调度策略,先到先服务
3,SCHED_RR实时调度策略,时间片轮转

linux进程分类

进程分为实时进程和非实时进程, 其中非实时进程分为交互式进程和批处理进程
在linux中, 调度算法可以`区分所有实时进程`的身份, 但是`没办法区分交互式程序和批处理`程序, linux2.6的调度程序实现了基于进程过去行为的启发式算法, 以确定进程应该被当做交互式进程还是批处理进程. 当然与批处理进程相比, 调度程序有`偏爱交互式进程的倾向`(容易错认成交互式进程)。
参考:https://www.cnblogs.com/dragonsuc/p/7144265.html

不同类型进程算法不同

系统中既有分时调度,又有时间片轮转调度和先进先出调度

//实时进程 vs 非实时进程
当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则`实时进程立即抢占非实时进程`。
两个`优先级一样`的任务的调度策略`都设为RR`,则保证了这两个任务可以循环执行,保证了公平。

// 实时进程间:FIFO,RR(时间片轮转)
实时进程的调度策略比较简单。
因为实时进程值只要求尽可能快的被响应, 基于优先级, 每个进程根据它重要程度的不同被赋予不同的优先级,调度器在每次调度时, 总选择优先级最高的进程开始执行. 低优先级不可能抢占高优先级, 因此FIFO或者Round Robin的调度策略即可满足实时进程调度的需求.

// 非实时进程间:分时调度算法。为了公平,Linux一直在演化发展。
普通进程(非实时进程)的调度策略就比较麻烦了。
因为普通进程不能简单的只看优先级, 必须公平的占有CPU, 否则很容易出现进程饥饿, 这种情况下用户会感觉操作系统很卡, 响应总是很慢,因此在linux调度器的发展历程中经过了多次重大变动, linux总是希望寻找一个最接近于完美的调度策略来公平快速的调度进程。

具体参考:https://www.cnblogs.com/dragonsuc/p/7144265.html

在每个进程的task_struct结构中有四个字段:policy、priority、counter、rt_priority。

policy是进程的调度策略,用来区分两种进程-实时和普通,实时进程优先于普通进程运行;
priority是进程(实时和普通)的`静态优先级`;
counter 是进程剩余的时间片,它的起始值就是priority的值。可看作是进程的`动态优先级`。
rt_priority是`实时优先级`,这是实时进程所特有的,用于实时进程间的选择。

参考:
https://www.cnblogs.com/smuxiaolei/p/7544086.html
https://www.cnblogs.com/kxdblog/p/4798401.html
https://baike.baidu.com/item/进程调度/10702294

posted on 2022-02-23 08:01  西伯尔  阅读(225)  评论(0编辑  收藏  举报