第9章linux系统(编辑修改稿)内容摘要:

程唤醒 进程唤醒的主要步骤 ① 当进程状态设置为 TASK_INTERRUPTIBLE,则由信号唤醒进程, 这是所谓的伪唤醒 (不是直接由所等待的事件唤醒 ),因此需要检 查并处理信号。 ② 若检查条件为真 (所等待的事件发生 ),转 ④ ;若条件不为真,转进 程调度 schdule()。 ③ 当进程被唤醒时 (因事件发生 ),检查条件是否为真,若为真转 ④ ; 否则转进程调度 schdule()。 ④ 当条件满足时,进程状态设置为 TASK_RUNNING,并将该进程 移出等待队列。 ⑤ 该函数将进程状态设置为 TASK_RUNNING,再将此进程加入到 可执行队列。 若被唤醒进程的优先级比当前正在运行的进程的优 先级高,设置 need_resched标志。 Linux系统 —— Linux系统的进程管理 Linux系统的 进程调度 Linux系统 —— Linux系统的进程调度 40 1. Linux进程调度目标和特点 进程调度程序是内核的组成部分,负责选择下一个要运 行的进程。 进程调度可看作在可运行态进程之间分配有限的处理器 时间资源的内核子系统。 进程调度程序是如 Linux这样的多任务操作系统的基础。 (1) Linux进程调度策略 ① 基于动态优先级和可变时间的调度 ② 调度方式为可抢占式调度 Linux系统 —— Linux系统的进程调度 41 (2) 调度目标 ① 实现算法复杂度为 O(1)级的调度 ⅰ 进程调度算法保证在恒定的时间内完成 ⅱ 算法执行时间与系统中处于就绪 (可运行 )状态的进程个 数无关 ② 提高交互性能 提高交互性能,保证系统能快速响应 ③ 保证公平 ⅰ 在合理设定的时间范围内,没有进程会出现饥饿状态 ⅱ 也不会有进程获得大量的时间片 ④ 实现 SMP可扩展性 Linux系统 —— Linux系统的进程调度 42 (3) I/O消耗型和处理器消耗型的进程 ① I/O消耗型进程 大部分时间是使用外部设备,交互式进程具有此特征。 ② 处理器消耗型进程 大部分时间是使用 CPU,计算进程具有此特征。 交互式的程序都是 I/O消耗型的。 Linux为了保证交互式应用,优化了进程的响应,更倾向 于优先调度 I/O消耗型进程,但并未忽略处理器消耗型程 序。 Linux系统 —— Linux系统的进程调度 43 (4) 进程调度的特点 ① Linux系统实现了基于进程过去行为的启发式算法; ② Linux系统选择优先级高的进程先运行,相同优先级的进 程按循环方式调度; ③ 动态优先级依进程占有 CPU的情况、休眠时间的长短来 增、减 ; ④ 系统根据进程优先级调整分配给它的时间片; ⑤ 实施可抢占调度方式 Linux系统 —— Linux系统的进程调度 44 2. 可变优先级 (1) 基于优先级的调度 优先级高的进程先运行,低的后运行,相同优先级的进程 按轮转方式进行调度。 (2) 静态优先级 ① 静态优先级的确定 在进程创建时,新创建的进程继承 父进程的静态优先级 ② 静态优先级的取值范围 100 (最高优先级 )  139 (最低 优先级 ),取值越小,优先级越高。 ③ 静态优先级的改变 用户可以通过系统调用改变 nice值, 从而改变自己拥有的静态优先级。 Linux系统 —— Linux系统的进程调度 45 (3) 动态优先级 ① 每个进程有一个动态优先级 它是进程调度程序选择可运 行进程所使用的参数,其取值范围是 100 (最高优先级 )  139 (最低优先级 ) ② 动态优先级的计算 动态优先级 = max(100, min(静态优先级- bonus + 5, 139)) bonus是范围 0 ~ 10的值, 值小于 5表示降低动态优先级以示惩罚 值大于 5表示增加动态优先级以示奖励 进程调度使用的是动态优先级,通过 effective_prio( )函数 来计算一个进程的动态优先级。 Linux系统 —— Linux系统的进程调度 46 (4) 确定 I/O消耗型和处理器消耗型进程的方法 ① 依据 —— 进程睡眠时间的长短 若进程睡眠时间长 —— I/O消耗型 若进程睡眠时间短 —— 处理器消耗型 ② 方法 Linux记录进程睡眠和执行时间 (存放在 task_struct的 sleep_avg域中 ),范围: 0 ~ MAX_SLEEP_AVG,默认值 为 10ms ⅰ 当 进程从开始休眠到要恢复执行这一时间内 sleep_avg 增加,直到达到 MAX_SLEEP_AVG为止; ⅱ 进程每执行一个时钟节拍, sleep_avg递减直到 0为止。 Linux系统 —— Linux系统的进程调度 47 ③ 进程休眠时间与 bonus值的关系 平均休眠时间 bonus值 大于或等于 0, 小于 100ms 0 大于或等于 100,小于 200ms 1 大于或等于 200,小于 300ms 2 大于或等于 300,小于 400ms 3 大于或等于 400,小于 500ms 4 大于或等于 500,小于 600ms 5 大于或等于 600,小于 700ms 6 大于或等于 700,小于 800ms 7 大于或等于 800,小于 900ms 8 大于或等于 900,小于 1000ms 9 大于 1s 10 Linux系统 —— Linux系统的进程调度 48 3. 可变时间片 (1) Linux系统的进程调度的目标 ① 对交互式进程,系统提供较长的时间片 ② 调度程序根据进程的优先级动态调整分配给它的时间片 Linux系统 —— Linux系统的进程调度 (2) 时间片的计算 ① 基本时间片 静态优先级本质上决定了进程的基本时间片 (140 -静态优先级 ) 20 若静态优先级 < 120 (140 -静态优先级 ) 5 若静态优先级 ≥ 120 静态优先级越高 (值越小 ),基本时间片越长。 基本时间片 = 49 表 普通进程的静态优先级和基本时间片的典型值 说明 静态优先级 nice值 基本时间片 最高静态优先级 100 20 800ms 高静态优先级 110 10 600ms 缺省静态优先级 120 0 100ms 低静态优先级 130 +10 50ms 最低静态优先级 139 +19 5ms 初始创建的进程 父进程的值 父进程的值 父进程的一半 Linux系统 —— Linux系统的进程调度 更高的优先级 更高的交互性 更低的优先级 更低的交互性 最小 5ms 默认 100ms 最大 800ms 进程静态优先级与基本时间片的关系图 50 (3) 时间片处理的时机 ① 创建新进程时的处理 新创建的子进程和父进程均分父进程剩余的时间片 ② 进程用完时间片时的处理 ⅰ 当一个进程的时间片用完时,依任务的动态优先级重 新计算时间片; ⅱ task_timeslice()函数为给定任务返回一个新的时间片。 Linux系统 —— Linux系统的进程调度 ② 可变时间片 当一个进程的时间片用完时,根据进程的动态优先级重新 计算时间片。 51 (4) 时间片的使用 ① 一个进程拥有的时间片可分多次使用,放弃 CPU时进 入活动队列 ② 当一个进程的时间片耗尽时,认为是过期进程,进入过 期队列 Linux系统 —— Linux系统的进程调度 52 (5) 活动队列和过期队列 每个处理器维护两个优先级数组 —— 活动数组和过期数组 ① 活动数组上的可执行队列中的进程都有剩余时间片 ② 过期数组上的可执行队列中的进程都已耗尽时间片 当一个进程的时间片耗尽时,被移至过期队列中; 当活动数组上的可执行队列中的所有进程都已耗尽时时间 片,这时,在活动数组和过期数组之间切换指针。 Linux系统 —— Linux系统的进程调度 53 4. Linux进程调度算法中使用的数据结构 (1) 可执行队列 (runqueue结构 ) 可执行队列是给定处理机上的可执行进程链表 runqueue结构 类型 名称 说明 spinlock_t lock 保护进程链表的自旋锁    prio_array_t *active 指向活动进程链表的指针 prio_array_t *expired 指向过期进程链表的指针 prio_array_t[2] arrays 活动进程和过期进程的两个集合    Linux系统 —— Linux系统的进程调度 54 (2) 优先级数组 优先级数组是 prio_array 类型的结构体,该数组描述了可 运行进程的集合,包括 ① 140个双向链表头 (每个链表对应一个优先级队列 ) ② 一个进程优先级位图 ③ 该数组所包含的进程总数 struct prio_array { int nr_active。 /* 任务数目 */ unsigned bitmap[BITMAP_SIZE]。 /* 优先级位图 */ struct list_head queue[MAX_PRIO]。 /*优先级队列 */ } Linux系统 —— Linux系统的进程调度 55 ④ 优先级数组图示  *active *expired arrays[0] arrays[1]   task。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。