第4章 进程调度

0. 总结

  • 调度:调度是一个平衡的过程。一方面,它要保证各个运行的进程能够最大限度的使用CP;另一方面,保证各个进程能公平的使用CPU。

  • 调度功能:决定哪个进程运行以及进程运行多长时间。

  • 调度实现原理:与进程的优先级有关

  • Linux上调度实现的方法:O(1)的调度算法

  • 调度相关的系统调用

4.1 多任务

  • 能同时并发地交互执行多个进程。

  • 非抢占式多任务:主动停止运行。

  • 抢占式多任务:进程时间片。

4.2 Linux的进程调度

  • O(1)拥有数以十计的多处理器的环境,但缺少交互进程。

4.3 策略

  • 决定调度程序在何时让进程运行。

4.3.1 I/O消耗型和处理器消耗型的进程

  • I/O消耗型:大多时间在提交或等待I/O请求。

  • 处理器消耗型:大多时间在执行代码。不属于I/O驱动类型。

4.3.2 进程优先级

  • 相同优先级按照轮转方式进行调度。

  • 调度程序总是选择时间片未用尽且优先级高的进程运行。

  • Linux两种不同的优先级范围:

nice值:-20~+19,默认0,值越大优先级越低。
实时优先级:可配置,范围0~99,值越大与优先级越大。

4.3.3 时间片

  • nice值作为权重将调整进程所使用的处理器时间使用比。

  • I/O消耗型:不需要长的时间片。

  • 处理器消耗型:需要越长越好的时间片。

4.3.4 调度策略的活动

  • 文字编辑程序显然是 1/0 消耗型的,因为它大部分时间都在等待用户的键盘输入〈无论用户的输入速度有多快,都不可能赶上处理的速度λ 用户总是希望按下键系统就能马上响应。

  • 视频编码程序是处理器消耗型的。

4.4 Linux调度算法

4.4.1 调度器类

  • 以模块方式提供的,这样做的目的是允许不同类型的进程可以有针对性地选

    择调度算哉。

4.4.2 Unix系统中的进程调度

4.4.3 公平调度

  • CFS的做怯是允许每个进程运行一段时间、循环轮转、选择运行最少的进程作为下一个运行进程,而不再采用分配给每个进程时间片的做法了,在所有可运行进程总数基础上计算出一个进程应该运行多久。 - -

  • nice 值在 CFS 中被

    作为进程获得的处理器运行比的权重:越高的nice 值(越低的优先级)进程在得更低的处理器

    使用权重。

  • 可运行进程数量趋于无穷,每个最少也能获得 lms 的运行时间。

  • 任何进程所获得的处理器时间是由它自己和其他所有可运行进程nice 值的相对差值决定的。

4.5 Linux调度的实现

4.5.1 时间记账

  • 所有的调度器都必须对进程运行时间做记账。

  • CFS 使用调度器实体结构(定义在文件<linux/sched.h>的 struct_sched _entity 中)来追踪进程运行记账。

  • CFS 使用 vruntime 变量来记录一个程序到底运行了多长时间以及它还应该再运行多久。

  • 定义在kemeVsched_fair.c 文件中的 update_curr()函数实现了该记账功能。

  • update_ currO 计算了当前进程的执行时间,并且将其存放在变量delta_exec 中,update_ curr()是囱系统定时器周期性调用。

4.5.2 进程选择

  • 红黑树rbtree——自平衡二叉搜索树

1.挑选下一个任务

  • 你从树的根节点沿着左边的子节点向下找,一直找到叶子节点,你便找到了其vruntime 值最小的那个进程。

2.向树中加入进程

  • 发生在进程变为可运行状态(被唤醒〉或者是通过fork()调用第一次创建进程时。

  • 调用_enqueue_entity()进行繁重的插入操作,把数据项真正插入到红黑树中。

3.从树中删除进程

  • 发生在进程堵塞(变为不可运行态〉或者终止时(结束运行〉。

  • 由辅助函数_dequeue_entityO 完成的。

4.5.3 调度器入口

  • 主要入口点是函数schedule(),它定义在文件kemel/sched.c中。

4.5.4 睡眠和唤醒

  • 睡眠:为了等待一些事件。

  • 内核的操作都相同 2 进程把自己标记成休眠状态,从可执行红黑树中移出,放入等待队列,然后调用 schedule()选择和执行一个其他进程。

  • 唤醒的过程刚好相反进程被设置为可执行状态,然后再从等待队列中移到可执行红黑树中。

4.6 抢占和上下文切换

  • 上下文切换,也就是从一个可执行进程切换到另一个可执行进程,由定义在 kernel/ sched.c 中

    的 context_switch()函数负责处理。

  • .每当一个新的进程被选出来准备投入运行的时候, schedule()就会调用该函数。两项基本的工作:

调用声明在 <asm/mmu_ context.h>中的 switch_mm()
调用声明在 <asm/system.h> 中的 switch_to()

4.6.1 用户抢占

  • 用户抢占在以下情况时产生:
从系统调返回用户空间时;
从中断处理程序返回用户空间时;

4.6.2 内核抢占

  • 内核抢占会发生在:
中断处理程序正在执行,且返回内核空间之前
内核代码再一次具有可抢占性
如果内核中的任务显式地调用 schedule()
如果内核中的任务阻塞(这同样也会导敖调用 schedule()

4.7 实时调度策略

两种策略

SCHED_FIFO和 SCHED_RR

SCHED_FIFO 实现了一种简单的、先入先出的调度算怯
SCHED_RR 是带有时闹片的 SCHED_FIFO,一种实时轮流调度算挂.

4.8 与调度相关的系统调用

4.8.1 与调度策略和优先级相关的系统调用

  • sched_setparam()和sched__getparam()分别用于设置和获取进程的实时优先级

  • nice()函数会调用内核的 set_ user_ nice()函数,这个函数会设置进程的 task_struct 的 static_prio 和prio 值。

4.8.2 与处理器绑定有关的系统调用

-强制指定“这个进程无论如何都必须在这些处理器上运行”。

  • 进程只运行在指定处理器上,对处理器的指定是由该进程描述符的 cpus_allowed 域设置的。

4.8.3 放弃处理器时间

  • 通过 sched_yieldO 系统调用,提供了一种让进程显式地将处理器时间让给其他等待执行进程的机制。

  • 先要确定给定进程确实处于可执行状态,然后再调用 sched__yield() o 用户空间的应用程序直接使用 sched__yield()系统调用就可以了。

2013337朱荟潼 Linux第四章读书笔记——进程调度的更多相关文章

  1. 2013337朱荟潼 Linux第五章读书笔记——系统调用

    摘要: [20135337朱荟潼]原创作品转载请注明出处 第五章 系统调用 5.1 与内核通信 中间层 作用三个:1.为用户空间提供一种硬件的抽象接口:2.保证系统稳定和安全:3.除异常和陷入,是内核 ...

  2. 2013337朱荟潼 Linux第三章读书笔记——进程管理

    第三章 进程管理 总结 fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,资源的复制而不是指针的复制. vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的 ...

  3. 2013337朱荟潼 Linux第十八章读书笔记——调试

    第十八章 调试 0.总结 oops 内核的调试配置 用Git进行二分搜索 bug总会有,简洁描述发给LKML 1. 准备开始 在用户级的程序里,bug表现比较直接:在内核中却不清晰. 2. 内核中的b ...

  4. linux第四章读书笔记

    第四章 进程调度 一.多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于可运行状态.多 ...

  5. 2013337朱荟潼 Linux第一章读书笔记——Linux内核简介

    一.Unix历史 二.Linux足迹 类Linux系统.非商业化产品.用途广泛 三.操作系统和Linux内核简介 1.操作系统 (1)是指在整个最基本功能系统中负责完成最基本功能和系统管理的部分. ( ...

  6. 2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接

    第七章--链接 0.总结 链接编译时可以采用静态链接或动态链接. 连接器主要任务:符号解析和重定位. 多个目标文件可定义相同的符号,可以被连接到一个单独的静态库. 链接器可以生成部分链接的可执行文件 ...

  7. 2013337朱荟潼 Linux第二章读书笔记——从内核出发

    1.获取内核源码 1.1Git 分布式的:下载和管理Linux内核源代码: - 获取最新提交到版本树的一个副本 $ git clone git://git.kernel.org/pub/scm/lin ...

  8. 20135320赵瀚青LINUX第四章读书笔记

    概述 什么是进程调度 进程调度:在可运行态进程之间分配有限处理器时间资源的内核子系统. 一.调度策略 4.1进程类型 I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状 ...

  9. Linux内核分析第四章 读书笔记

    Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...

随机推荐

  1. Django商城项目笔记No.5用户部分-注册接口-短信验证码

    Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...

  2. (十九)ArcGIS JS 加载WMS服务(超图示例)

    前言 在工作中,需要在ArcGIS API for JavaScript中加载超图服务,因为超图的rest服务只可以用于Leaflet .openlayers3 (with MVT) .MapboxG ...

  3. 【剑指offer】数值的整数次方

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/25506085 转载请注明出处:http:// ...

  4. Sqoop学习之路 (一)

    一.概述 sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具. 核心的功能有两个: 导入.迁入 导出.迁出 导入数据:MySQL,Oracle 导入数据到 H ...

  5. tomcat 使用 cronolog 切割日志

    1. 下载 cronolog 软件 wget http://cronolog.org/download/cronolog-1.6.2.tar.gz cronolog-.tar.gz tar zxvf ...

  6. 一个web项目web.xml的配置中<context-param>配置作用

    <context-param>的作用: web.xml的配置中<context-param>配置作用 1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件 ...

  7. JS省市区联动效果

    省市区联动下拉效果在WEB中应用非常广泛,尤其在电商网站最为常见.一般使用Ajax实现无刷新下拉联动.利用jQuery,通过读取JSON数据,实现无刷新动态下拉省市二(三)级联动效果. 首先我们可以看 ...

  8. C++之C++的词法单位

    C++的字符集 ASCII码字符集是计算机中的常用字符集.它包括英文字母及阿拉伯数字等128个字符,存储一个ASCII码占用一个字节单元. 由于汉字处理的需要,又出现了汉字国标码等对应于不同语言的字符 ...

  9. handsontable合并项mergeCells应用及扩展

    由于我这个项目主要是配置多表头信息,主要使用了handsontabel合并项功能. 但是,在该功能使用过程中发现了一些问题和一些自己根据需要做的一些扩展 $("#topFieldDiv&qu ...

  10. FFT&NTT

    https://winniechen.cn/?p=377 内容有些多,我就不复制了...