《Linux内核设计与实现》第八周读书笔记——第四章 进程调度
《Linux内核设计与实现》第八周读书笔记——第四章 进程调度
第4章 进程调度35
- 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统。只有通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发行的效果。
- 调度程序没有太复杂的原理,最大限度地利用处理器时间的原则是只要有可以执行的进程,那么就总会有进程正在执行,但是只要系统中可运行的进程的数目比处理器的个数多,就注定某一给定时刻会有一些进程不能执行,这些进程在等待运行,在一组处于可运行状态的进程中,选择―个来执行,是调度程序所需完成的基本工作。-
4.1 多任务35
- 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这会产生多个进程在同时运行的幻觉,在多处理器机器上,这会使多个进程在不同的处理机上真正同时、并行地运行。无论在单处理器或者多处理器机器上,多任务操作系统都能使多个进程处于堵塞或者睡眠状态,也就是说,实际上不被投入执行,直到工作确实就绪。
- 这些任务尽管位于内存,但并不处于可运行状态。相反,这些进程利用内核阻塞自己,直到某一事件(键盘输入网络数据、过一段时间等)发生。因此,现代Linux系统也许有100个进程在内存,但是只有一个处于可运行状态。
- 多任务系统可以划分为两类:非抢占式多任务和抢占式多任务。像所有unix的变体和许多其他现代操作系统一样,Linux提供了抢占式的多任务。
4.2 Linux 的进程调度36
- 从1991年Linux的第1版到后来的2.4内核系列,Linux的调度程序都相当简陋,设计近乎原始,当然它很容易理解,但是它在众多可运行进程或者多处理器的环境下都难以胜任,正因为如此,在Linux 2.5开发系列的内核中,调度程序做了大手术,开始采用了一种叫做O(1)调度程序的新调度程序——它是因为其算法的行为而得名的。
- 它解决了先前版本Linux调度程序的许多不足,引入了许多强大的新特性和性能特征,这里主要要感谢静态时间片算法和针对每一处理器的运行队列,它们帮助我们摆脱了先前调度程序设计上的限制。
- O(1)调度器虽然在拥有数以十计(不是数以百计)的多处理器的环境下尚能表现出近乎完美的性能和可扩展性,但是时间证明该调度算法对于调度那些响应时间敏感的程序却有一些先天不足,这些程序我们称其为交互进程一它无疑包括了所有需要用户交互的程序,正因为如此,O(1)调度程序虽然对于大服务器的工作负载很理想,但是在有很多交互程序要运行的桌面系统上则表现不佳,因为其缺少交互进程,自2.6内核系统开发初期,开发人员为了提高对交互程序的调度性能引入了新的进程调度算法,其中最为著名的是“反转楼梯最后期限调度算法,该算法吸取了队列理论,将公平调度的概念引入了Linux调度程序。并且最终在2.6.23内核版本中替代了O(1)调度算法,它此刻被称为“完全公平调度算法”,或者简称CFS。
4.3 策略36
4.3.1 I/O消耗型和处理器消耗型的进程36
4.3.2 进程优先级37
- 调度算法中最基本的一类就是基于优先级的调度,这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法,通常做法是优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个接一个,重复进行)。
- 在某些系统中,优先级高的进程使用的时间片也较长,调度程序总是选择时间片未用尽而且优先级最高的进程运行,用户和系统都可以通过设置进程的优先级来影响系统调度。
- Linux采用了两种不同的优先级范围,第一种是用nice值,它的范围是从―20到+19。第二种范围是实时优先级。
4.3.3 时间片38
4.3.4 调度策略的活动38
4.4 Linux调度算法39
4.4.1 调度器类39
- Linux调度器是以模块方式提供的,这样做的目的是允许不同类型的进程可以有针对性地选择调度算法。这种模块化结构被称为调度器类。
- 它允许多种不同的可动态添加的调度算法并存,调度属于自己范畴的进程。
- 每个调度器都有一个优先级,基础的调度器代码定义在sched_fair.c文件中,它会按照优先级顺序遍历调度类,拥有一个可执行进程的最高优先级的调度器类胜出,去选择下面要执行的那一个程序。完全公平调度(CS)是一个针对普通进程的调度类,在Linux中称为SCHED_NORMAL。
4.4.2 Unix 系统中的进程调度40
4.4.3 公平调度41
4.5 Linux调度的实现42
4.5.1 时间记账42
- 1.调度器实体结构
- 2.虚拟实时
4.5.2 进程选择44
- 1.挑选下一个任务
- 2.向树中加入进程
4.5.3 调度器入口48
进程调度的主要入口点是schedule(),它定义在文件kernel/sched.c中。
4.5.4 睡眠和唤醒49
4.6 抢占和上下文切换51
4.6.1 用户抢占53
- 从系统调返回用户空间时。
- 从中断处理程序返回用户空间时。
4.6.2 内核抢占53
4.7 实时调度策略54
4.8 与调度相关的系统调用54
4.8.1 与调度策略和优先级相关的系统调用55
- sched_setscheduler()和 sched_getscheduler()分别用于设置和获取进程的调度策略和实时优先级。与其他的系统调用相似,它们的实现也是由许多参数检查、初始化和清理构成的。其实最重要的工作在于读取或改写进程task_struct的policy和rt_priority的值。
- sched_setscheduler()和 sched_getscheduler()分别用于设置和获取进程的实时优先级。这两个系统调用获取封装在sched_param特殊结构体的rt_priority中。实时调度策略的的最大优先级:是MAX_ USERRT_PRIO减1。最小优先级等于1。
- 对于―个普通的进程,nice函数可以将给定进程的静态优先级增加一个给定的量。只有超级用户才能在调用它时使用负值,从而提高进程的优先级。nice函数会调用内核的set_user_nice函数,这个函数会设置进程的的task_struct的static_prio值。
4.8.2 与处理器绑定有关的系统调用55
4.8.3 放弃处理器时间56
4.9 小结56
《Linux内核设计与实现》第八周读书笔记——第四章 进程调度的更多相关文章
- 《Linux内核设计与实现》 第八周读书笔记 第四章 进程调度
20135307 张嘉琪 第八周读书笔记 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有 ...
- Linux内核设计与实现第八周读书笔记
第四章 进程调度 进程在操作系统看来是程序的运行态表现形式. 4.1多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统. 多任务操作系统会使多个进程处于堵塞或者睡眠状态.这些任务尽管位于 ...
- LINUX内核设计与实现第三周读书笔记
LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...
- 《Linux内核设计与实现》第四周读书笔记——第五章
<Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...
- Linux内核设计与实现第十周读书笔记
第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...
- Linux内核设计与实现第五周读书笔记
第十八章 调试 18.1准备开始 需要的只是: 一个确定的bug.大部分bug通常都不是行为可靠而且定义明确的. 一个藏匿bug的内核版本. 相关的内核代码的知识和运气. 18.2内核中的bug 内核 ...
- Linux内核设计与实现第六周读书笔记
第三章 进程管理 3.1 进程 进程是处于执行期的代码.通常进程还要包含其他资源,像打开的文件.挂起的信号.内核的内部数据.处理器状态.一个或多个具有内存映射的内存地址空间及一个或多个执行线程,当然还 ...
- linux内核设计与实现第七周读书笔记
第七章 链接 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储并执行.链接可以执行于编译时(compile time),也就是在源代 ...
- 《Linux内核设计与实现》Chapter 18 读书笔记
<Linux内核设计与实现>Chapter 18 读书笔记 一.准备开始 一个bug 一个藏匿bug的内核版本 知道这个bug最早出现在哪个内核版本中. 相关内核代码的知识和运气 想要成功 ...
随机推荐
- ELK-elasticsearch-6.3.2插件【head,bigdesk,cerebro[kopf]】安装
参考博客:linux下ElasticSearch.6.2.2集群安装与head.Kibana.X-Pack..插件的配置安装 参考博客:ELK5.5.1 插件安装实践纪要(head/bigdesk/k ...
- Deepin中设置文件或文件夹权限
Deepin中设置文件或文件夹权限 -R 递归进行某项操作,不论是删除文件夹或者修改文件夹下所有文件权限 权限更改,777相当于完全控制权限: 更改一个文件夹或文件的权限:chmod 777 文件 ...
- 什么是Java序列化?如何实现序列化?
一.什么是序列化: 序列化理解成“打碎”是可以的,不过在书本上的名词就是将对象转换成二进制. 二.在java中如何实现序列化: 首先我们要把准备要序列化类,实现 Serializabel接口 例如:我 ...
- python 之 初识面向对象
编程的两种范式 我们知道,程序 = 特定的语法+数据结构+算法 好像这个和我们熟知的小说有类似之处啊,小说 = 人物+背景+情节 写小说呢,都是有模板的,so,写程序也是一样,我们把这个“模板”叫做编 ...
- (9)Python循环结构
- SSM 搭建精美实用的管理系统
课程介绍 SSM 框架即 SpringMVC+Spring+Mybatis,相信各位朋友在投递简历时已直观感受到它的重要性,JavaWeb 相关工作的招聘要求中基本都包括了这三项技术能力. 由于其轻量 ...
- Lock和Condition在JDK中ArrayBlockingQueue的应用
ArrayBlockingQueue的实现思路简单描述,ArrayBlockingQueue的底对于互斥访问使用的一个锁.细节参考源码take和put方法: import java.util.conc ...
- Ubuntu中创建Python虚拟环境
创建虚拟环境对于Python开发来说是非常重要的,那么该如何创建虚拟环境呢? 1.安装virtulenv工具和管理包 sudo apt-get install python3-virtulenv 或 ...
- SSM框架之整合(Maven实例)
有不少朋友在maven中因为pom文件依赖的事导致报错 今天我这个快速搭建ssm框架,确保在jdk7或者jdk8的环境,tomcat没什么要求.但如果要用jdk8的话,最好用run as中的serve ...
- 一键搭建LNMP脚本
还有不足的地方,请谅解 2天时间刚做到安装mysql这里.... # [root@localhost ~]# cat /etc/centos-release # CentOS release 6. ...