《Linux内核设计与实现》第四章学习笔记

                ——进程调度

姓名:王玮怡  学号:20135116

一、多任务

1、多任务操作系统的含义

  多任务操作系统就是能同时并发地交互执行多个进程的操作系统。

  • 无论在单处理器或者多处理器机器上,多任务操作系统都能使多个进程处于堵塞或者睡眠状态,也就是说,实际上不被投入执行,直到工作确实就绪。
  • 相反,这些进程利用内核阻塞自己,直到某一事件(键盘输入、网络数据、过一段时间等)发生。

2、多任务操作系统的分类

  • 非抢占式多任务
  • 抢占式多任务

3、Linux的抢占式多任务模式

(1)抢占:强制的挂起动作

(2)时间片:分配给每个可运行进程的处理器时间段。有效管理时间片能使调度程序从系统全局的角度做出调度决定,这样做还可以避免个别进程独占系统资源。

(3)让步:进程主动挂起自己的操作

二、Linux的进程调度

1、O(1)调度程序

  缺点:缺少交互进程

2、反转楼梯最后期限调度算法

  优点:吸收了队列理论,引入公平调度的概念,“完全公平调度算法”

三、策略

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

(1)I/O消耗型

  • 指进程的大部分时间用来提交I/O请求或是等待I/O请求。因此,这样的进程经常处于可运行状态,但通常都是运行短短的一会儿。
  • 举例:多数用户图形界面程序(GUI)、Unix系统、Linux

(2)处理器消耗型

  • 处理器耗费型进程把时间大多用在执行代码上。除非被抢占,否则它们通常都一直不停地运行,因为它们没有太多的1/0 需求。
  • 举例:无限循环执行,如sshkeygen 或者MATLAB

(3)特殊情况

  • X Window 服务器既是I/O消耗型,也是处理器消耗型
  • 平衡点:进程响应迅速(响应时间短)和最大系统利用率(高吞吐量)。

2、进程优先级

  • 调度算法中最基本的一类就是基于优先级的调度,这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。
  • 通常做法是是(其并未被Linux 系统完全采用)优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个接一个,重复进行)。

(1)使用nice值的优先级

  • 范围是从-20 到+19,默认值为0 :越大的nice 值意味着更低的优先级
  • Linux 系统中,nice值则代表时间片的比例

(2)实时优先级

  • 其值是可配置的,默认情况下它的变化范围是从0到99(包括0和99)
  • 越高的实时优先级数值意味着进程优先级越高

3、时间片

(1)时间片是一个数值,它表明进程在被抢占前所能持续运行的时间。

(2)在Linux操作系统中

  • Linux 的CFS 调度器并没有直接分配时间片到进程,它是将处理器的使用比划分给了进程。
  • 在Linux中使用新的CFS调度器,其抢占时机取决于新的可运行程序消耗了多少处理器使用比.如果消耗的使用比比当前进程小,则新进程立刻投入运行,抢占当前进程。否则,将推迟其运行。

四、Linux调度算法——完全公平调度(CFS)

1、相关概念

  • 目标延迟:每个进程都按其权重在全部可运行进程中所占比例的“时间片”来运行,为了计算准确的时间片,CFS为完美多任务中的无限小调度周期的近似值设立了一个目标。而这个目标称作“目标延迟”,越小的调度周期将带来越好的交互性,同时也更接近完美的多任务。
  • 最小粒度:当可运行任务数量趋于无限时,它们各自所获得的处理器使用比和时间片都将趋于0,造成了不可接受的切换消耗,CFS 为此引人每个进程获得的时间片底线,这个底线称为最小粒度。默认情况下这个值是lms。

2、决定因素

  任何进程所获得的处理器时间是由它自己和其他所有可运行进程nice值的相对差值决定的。任何nice值对应的绝对时间不再是一个绝对值,而是处理器的使用比。

3、所属类型

  针对普通进程的调度器类——允许多重不同的可动态添加的调度算法并存,调度属于自己范畴的进程

4、组成部分

  • 时间记账
  • 进程选择
  • 调度器入口
  • 睡眠和唤醒

五、Linux调度的实现

1、时间记账

  一个进程的时间片被减少到0时,它就会被另一个尚未减到0的时间片可运行进程抢占。

  • CFS使用调度器实体结构来追踪进程运行记账(定义在文件<linux/sched.h>的struct_sched _entity)
  • CFS使用vruntime变量(虚拟实时)来记录一个程序到底运行了多长时间以及它还应该再运行多久,而且可以知道谁应该是下一个被运行的进程,以ns为单位

2、进程选择

  红黑树是一种以树节点形式存储的数据,这些数据都会对应一个键值。Linux中,红黑树称为rb位时,它是一个自平衡二叉搜索树。

  • 挑选下一个任务:CFS调度器选取所有进程中vruntime最小的那个进程为待运行的下一个进程(CFS调度算法的核心),对应的是树中最左侧的叶子节点,实现函数为__pick_next_entity()
  • 向树中加入进程,发生在进程变为可运行状态(被唤醒)或通过fork()调用第一次创建进程时,由函数enqueue_entity()实现
  • 从树中删除进程的动作发生在进程堵塞(变为不可运行态)或者终止时(结束运行),有辅助函数__dequeue_entity()完成

3、调度器入口

  进程调度的主要入口点是函数schedule(),该函数中唯一重要的事就是调用pick_next_task()

4、睡眠和唤醒

(1)睡眠(被阻塞)——进程处于一个特殊的不可执行状态

  • 常见原因:文件I/O
  • 内核操作:进程把自己标记成休眠状态,从可执行红黑树中移出,放入等待队列,然后调用schedule()选择和执行一个其他进程。
  • 等待队列:由等待某些事件发生的进程组成的简单链表,内核用wake_queue_ head _t 来代表等待队列。可通过DECL成立WAITQUEUE ()静态创建,也可以由init_waitqueue _head()动态创建

(2)唤醒——唤醒指定的等待队列上的所有进程

  • 唤醒操作通过函数wake_up()进行,它调用函数try_to_wake_up(),该函数负责将进程设置为TASK_RUNNING状态,调用enqueue_task()将此进程放入红黑树中
  • 如果被唤醒的进程优先级比当前正在执行的进程的优先级高,还要设置need _resched 标志
  • 注意虚假唤醒

六、抢占和上下文切换

1、抢占

(1)用户抢占

  内核即将返回用户空间的时候,如果need_resched标志被设置,会导致schedule()被调用,此时会发生用户抢占

  • 从系统调用返回用户空间时
  • 从中断处理程序返回用户空间时

(2)内核抢占

  每个进程的thread_info引人preempt_count计数器。该计数器韧始值为0,每当使用锁的时候数值加1,释放锁的时候数值减1。当数值为0的时候,内核就可执行抢占,具体发生在:

  • 中断处理程序正在执行,且返回内核空间之前
  • 内核代码再一次具有抢占性的时候
  • 如果内核中的任务显式地调用schedule()
  • 如果内核中的任务阻塞

2、上下文切换

  • 一个可执行进程切换到另一个可执行进程
  • 当一个新进程被选出来准备投入运行时,schedule()会调用context_switch()函数负责处理

七、实时调度策略

1、SCHED_FIFO

  • 简单、先入先出
  • 不使用时间片
  • 如果SCHED_FIFO级进程处于可执行状态,就会一直执行,直到它自己受阻塞或显式地释放处理器为止

2、SCHED_RR

  • 实时轮流调度算法:带有时间片的SCHED_FIFO
  • 当SCHED_RR任务耗尽它的时间片时,同一优先级的其他实时进程被轮流调度

3、实时优先级范围默认为0-99

八、与调度有关的系统调用

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

  sched_setscheduler()和sched_getscheduler()分别用于设置和获取今后才能的调度策略和实时优先级。

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

  用户可以通过sched_setaffinity()设置不同的一个或几个位组合的位掩码,而调用sched_getaffinity()则返回房钱的cpus_allowed掩码。

3、放弃处理器时间

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

《Linux内核设计与实现》第四章学习笔记的更多相关文章

  1. Linux内核设计与实现 第四章

    1. 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上同时运行的各个任务(也就是进程). 这个管理程序就是调度程序,功能: 决定哪些进 ...

  2. 《Linux内核分析》之第四章读书笔记

    4.1多任务 多任务操作系统:同时并发地交互执行多个进程的操作系统 多任务操作系统会使多个进程处于堵塞或者睡眠状态.这些任务尽管位于内存,但是并不处于可运行状态.这些进程利用内核堵塞自己,直到某一事件 ...

  3. 《Linux内核设计与实现》第四章学习笔记——进程调度

                                                                        <Linux内核设计与实现>第四章学习笔记——进程调 ...

  4. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  5. linux及安全《Linux内核设计与实现》第一章——20135227黄晓妍

    <linux内核设计与实现>第一章 第一章Linux内核简介: 1.3操作系统和内核简介 操作系统:系统包含了操作系统和所有运行在它之上的应用程序.操作系统是指整个在系统中负责完成最基本功 ...

  6. 《Linux内核设计与实现》Chapter 3 读书笔记

    <Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...

  7. 《Linux内核设计与实现》Chapter 1 读书笔记

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  8. 《Linux内核设计与实现》Chapter 2 读书笔记

    <Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...

  9. 《Linux内核设计与实现》Chapter 5 读书笔记

    <Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...

随机推荐

  1. Python作业第一课

    零基础开始学习,最近周边的同学们都在学习,我也来试试,嘿嘿,都写下来,下次不记得了还能来看看~~ Python作业第一课1)登陆,三次输入锁定,下次不允许登陆2)设计一个三级菜单,菜单内容可自行定义, ...

  2. January 23rd, 2018 Week 04th Tuesday

    Remembrance is a form of meeting, forgetfulness is a form of freedom. 记忆是一种相遇,遗忘是一种自由. Cherish those ...

  3. [Jenkins] 如何修改jenkins上的环境变量

    现象 当本地的环境变量发生变化时,在jenkins 构建时里面访问的环境变量仍是之前旧的(未更新的)导致构建出现错误,比如我以我所遇到的问题进行简单写下,下面例子中我是涉及到修改 PYTHONPATH ...

  4. 给JDK提的一个bug(关于AbstractQueuedSynchronizer.ConditionObject)

    1. 背景 之前读JUC的AQS源码,读到Condition部分,我当时也写了一篇源码阅读文章--(AbstractQueuedSynchronizer源码解读--续篇之Condition)[http ...

  5. lij IDEA项目包分层结构显示设置

    使用Intellij IDEA创建项目发现包没有分层,使用不方便. 可以点击右上角的设置,把红框选项的√去掉即可. 就会分层显示了,这就很舒服了.

  6. 注册OCX失败/ 找不到指定的模块

    错误信息:模块“*.OCX”加载失败,请确定二进制保存在指定的路径中,或者调试它以检查该二进制或相关的.dll文件是否有问题 对于电脑新手,关于OCX或DLL缺失是一件令人十分头疼的事,如果不幸遇到此 ...

  7. kafka监控kafka-eagle 容器化配置

    由于kafka.zk 集群已经部署在k8s中,  kafka的服务名 kafka-hs, zk的服务名为:zk-cs ,对kafka进行监控,所以需要把监控部署到k8s中,选择使用kafka-eagl ...

  8. 为什么签名前要加"\x19Ethereum Signed Message:\n"

    在以太坊中,可以找到关于上述破损的解释例子.以太坊有两种消息,交易

  9. Photoshop 基础二 快捷键

    1.取消选区:Ctrl + D 2.反选: Shift + F7 3.复位调板:窗口-工作区-复位调板位置 4.图像的缩放: Ctrl.+.- 5.用前景色填充:Ctrl + Delete 6.用背景 ...

  10. jsp中使用原生js实现异步交互

    Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化.并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做,只有确定需要从服务器读 ...