进程管理子系统==Linux操作系统3

一、常见操作系统调度策略

1、先来先服务(FCFS)

  • (1)是最简单的调度算法,按照按照作业提交或进程变为就绪态的先后次序,分配 CPU。
  • (2)优点:有利于长作业、CPU 繁忙的作。
  • (3)缺点:不利于短作业、I/O 繁忙的作业。

2、短作业(进程)优先(SJ(P)F)

  • (1)对预计执行之间短的作业(进程)优先分配 CPU,并且通常后来的短作业不抢占正在 执行的作业。
  • (2)优点:比先来先服务改善平均周转时间和平均带权周转时间,缩短作业等待时间,提 高系统吞吐量。
  • (3)缺点:对长作业非常不利;未能依据作业的紧迫程度来划分执行的优先级;难以准确 预估作业/进程的执行时间,影响调度性能

3、高响应比优先(HRN)

  • (1)克服短作业优先缺点,响应比 R = 1 + W/T,其中 W 为等待时间,T 为执行时间,也就 是短作业优先中,优先级随着等待时间而增加。
  • (2)优点:同时考虑每个作业执行时间的长短和等待时间的长短。
  • (3)缺点:在同一时间段内处理的作业数少于短作业优先,因此吞吐量将小于短作业优先; 由于每次调度前都要计算响应比,系统开销也要增加。

4.时间片轮转法(RR)

  • (1)将系统中所有就绪进程按先来先服务原则,排成一个队列,每次调度时将 CPU 时间片 (几 ms~几百 ms)分配给队首进程,时间片结束时将其送到队尾,如此循环。
  • (2)优点:克服先来先服务不利于短作业的缺点,使短作业也能得到运行。
  • (3)缺点:应当使用户输入通常在一个时间片内能处理完,否则响应时间、平均周转时间、 平均带权周转时间都会延长。

5、多级反馈队列(RRWMF)

  • (1)设置多个就绪队列,分别赋予不同优先级,如逐级降低,队列 1 的优先级最高,每个 队列执行时间片的长度也不同,规定优先级越低则时间片越长,如逐级加倍。
  • (2)新进程进入内存后,先投入队列 1 的末尾,按先来先服务算法调度;若按队列 1 的时 间片未能执行完,则投入到队列 2 的末尾。当较高优先级队列为空,才调度较低优先级队列。
  • (3)如果进程执行时有新进程进入优先级较高队列,则抢先执行新进程,并把被强先的进程投入原队列的末尾。、
  • (4)优点:为提高系统吞吐量和缩短平均周转时间而进一步照顾短进程;为获得较好的 I/O 设备利用率和缩短响应时间而照顾 I/O 型进程;不必估计进程的执行时间,可以满足各种类 型进程的需要,被公认为是一种较好的进程调度算法。
  • (5)缺点:需要维护多个队列以及频繁调度,系统开销较大

6、最高优先权优先(FPF)

  • (1)当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入 内存中;当用于进程调度时,把 CPU 分配给就绪队列中优先权最高的进程,这时又可分 为非抢占式优先权算法、抢占式优先权算法。
  • (2)抢占式优先权算法容易出现优先级反转现象:一个低优先级任务持有一个高优先级任 务所需的共享资源,高优先级由于资源缺乏而处于受阻状态,而低优先级获得的 CPU 时 间少,如果此时有优先级处于两者之间的任务,并且不需要那个共享资源,则该中优先级 的任务反而超过这两个任务而获得 CPU 时间,造成高优先级任务无法获得资源而继续推进。
  • (3)优先级反转解决方案:
    • ①设置优先级上限并给临界区一个高优先级,进入临界区的进程都将获得这个高优先级,如果有其他试图进入临界区的优先级都低于这个高优先级,那么优先级反转就不会发生。
    • ②优先级继承:当一个高优先级进程等待一个低优先级进程持有的资源时,低优先级进程将 暂时获得高优先级进程的优先级,在释放共享资源后,低优先级进程回到原来的优先级。 嵌入式系统 VxWorks 就是采用这个策略。
    • ③临界区禁止中断:通过禁止中断来保护临界区,采用此种策略的系统只有两种优先级:可抢占优先级和中断禁止优先级。前者为一般进程运行时的优先级,后者为运行于临界区的 优先级。

7、三个概念

  • (1)周转时间 = 完成时间 – 到达时间。
  • (2)平均周转时间 = 周转时间 / 进程个数
  • (3)平均带权周转时间 = (周转时间 / 服务时间)/ 进程个数。
二、Linux内核的三种调度策略

1、SCHED_OTHER 分时调度策略(默认)

  • (1)创建任务指定分时调度策略,并指定 nice 值(-20~19)
  • (2)调度程序将根据每个任务的 nice 值确定在 CPU 上的执行时间 counter。
  • (3)如果没有等待,则将该任务加入就绪队列。
  • (4)调度程序遍历就绪队列中的任务,对每个任务的动态优先级进行计算(counter + 20 - nice),选择计算结果最大的一个去运行,当这个时间片用完后(counter 减至 0)或主动 放弃 CPU 时,该任务将被放在就绪队列末尾或等待队列。
  • (5)跳转到第(4)。
  • (6)当调度程序发现所有就绪任务计算所得的权值都不大于 0 时,跳转到第(2)。

2、SCHED_FIFO 实时调度策略,先到先服务

  • (1)创建进程时指定采用 FIFO,并设置实时优先级 rt_priority(1~99)。
  • (2)如果没有等待资源,则将该任务加入就绪队列。
  • (3)调度程序遍历就绪队列,根据实时优先级计算调度权值,选择权值最高的任务使用 CPU, 该 FIFO 任务将一直占用 CPU 直到有优先级更高的任务就绪获得主动放弃(等待资源)。

3、SCHED_RR 实时调度策略,时间片轮转

  • (1)创建任务时指定调度参数为 RR,并设置任务的实时优先级和 nice 值(将会替换为该任务的时间片长度)。
  • (2)如果没有等待资源,则将该任务加入就绪队列。
  • (3)调度程序遍历就绪队列,根据实时优先级计算调度权值,选择权值最高的任务使用 CPU。
  • (4)如果就绪队列中的 RR 任务时间片为 0,则会根据 nice 值设置该任务的时间片,同时将 该任务放入就绪队列的末尾。重复(3)。

4、系统中既有分时调度,又有先到先服务调度和时间片轮转调度

  • (1)选择分时调度的进程是非实时进程,选择先到先服务调度和时间片轮转调度的进程是 实时进程。
  • (2)实时进程会抢占非实时进程。
  • (3)时间片轮准调度和先到先服务调度都实时优先级作为调度权值标准,时间片轮转是先 到先服务的延伸。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目录 1 进程的组织 5 1.1 进程相关数据结构 5 1.1.1 进程的基本信息 6 1.1.2 进程状态 10 1.1.3 TASK_RUNNING状态的进程链表 11 1.1.4 进程间关系 12 1.2 Linux的线程——轻量级进程 15 1.3 进程的创建——do_fork()函数详解 19 1.4 执行进程间切换 33 1.4.1 进程切换之前的工作 33 1.4.2 进程切换实务 —— switch_to宏 37 1.4.3 __switch_to函数 39 1.5 fork与vfock系统调用的区别 42 1.6 内核线程 46 1.7 挂起状态进程的组织 49 1.7.1 等待队列头 49 1.7.2 等待队列的操作 50 1.7.3 进程资源限制 55 1.8 系统调用execve() 56 1.8.1 拷贝用户态参数 57 1.8.2 重要的数据结构 61 1.8.3 search_binary_handler函数 66 1.8.4 目标文件的装载和投入运行 69 1.8.5 库函数 92 2 中断控制 94 2.1 中断的分类 94 2.2 中断的硬件环境 95 2.2.1 外部中断请求IRQ 95 2.2.2 中断描述符表 96 2.2.3 中断和异常的硬件处理 97 2.3 中断描述符表 99 2.3.1 中断门、陷阱门及系统门 99 2.3.2 IDT的初步初始化 100 2.4 异常处理 101 2.5 中断处理 106 2.5.1 中断向量 107 2.5.2 IRQ数据结构 108 2.5.3 do_IRQ()函数 113 2.5.4 中断服务例程 115 2.5.5 IRQ线的动态分配 116 2.6 下半部分 117 2.6.1 软中断 118 2.6.2 tasklet 121 2.6.3 工作队列 122 2.7定时器中断 124 2.7.1 时钟与定时器 124 2.7.2 定时器中断相关的数据结构 127 2.7.3 定时器中断的上半部分 129 3 进程调度 138 3.1 进程调度的概念 138 3.2 进程调度的数据结构和优先级 141 3.2.1 进程的优先级 141 3.2.2 数据结构 145 3.3 调度程序所使用的函数 151 3.3.1 scheduler_tick函数 151 3.3.2 try_to_wake_up函数 156 3.3.3 recalc_task_prio函数 160 3.4 schedule()函数 163 3.4.1 直接调用 163 3.4.2 延迟调用 164 3.4.3 进程切换之前所做的工作 168 3.4.4 完成进程切换时所执行的操作 171 3.4.5 进程切换后所执行的操作 173 3.5 多处理器运行队列的平衡 175 3.5.1 调度域 176 3.5.2 rebalance_tick()函数 178 3.5.3 load_balance()函数 180 3.5.4 move_tasks()函数 183 3.6 进程退出 187 3.6.1 进程终止 187 3.6.2 进程删除 189 4 进程的并发性体现 191 4.1 内核抢占 193 4.1.1 内核抢占概念 193 4.1.2 同步技术总揽 196 4.2 每CPU变量 197 4.3 原子操作 199 4.4 优化屏障和内存壁垒 203 4.4.1 优化屏障 204 4.4.2 内存壁垒 204 4.5 自旋锁 206 4.6 读写自旋锁 211 4.6.1 为读获取和释放一个锁 213 4.6.2 为写获取或释放一个锁 214 4.7 顺序锁 215 4.8 RCU机制 217 4.9 信号量 219 4.9.1 获取和释放信号量 221 4.9.2 读/写信号量 224 4.9.3 补充信号量 225 4.10 禁止本地中断 226 4.10.1 禁止本地中断 227 4.10.2 禁止下半部(可延迟函数) 229 4.11 一些避免竞争条件的实例 231 4.11.1 引用计数器 231 4.11.2 大内核锁 231 4.11.3 内存描述符读/写信号量 232 4.11.4 slab高速缓存链表的信号量 233 4.11.5 索引节点的信号量 233 4.12 内核同步与互斥的总结 233

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栋哥爱做饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值