《LKD3粗读笔记》(4)进程调度

1、多任务

  1. 什么是多任务操作系统?
    能同时并发地交互执行多个进程。注意是并发而不是并行。特别地,在多处理机机器上可以实现真正意义上的并行,因为它长了多个脑子
  2. 多任务操作系统有哪些分类?
    非抢占式多任务(cooperative multitasking)和抢占式多任务(preemptive multitasking)
  3. 什么是抢占式多任务?
    在该模式下,调度程序可以决定哪个进程停止,这个强制的挂起动作称作为抢占(preemption),这么做的目的是把处理机让给更应该被执行的进程。还有一个名词称作为时间片(timeslice),它是分配给每个可运行进程的处理器时间段。Linux内核是抢占式多任务操作系统
  4. 什么是非抢占多任务?
    除非是进程自己停下来,否则它会一直执行,进程主动挂起的操作称作为让步(yielding)。这个不重要,Linux内核不是这样的。

2、Linux的进程调度

  1. Linux的进程调度的算法是什么?
    • Linux 2.4 非常简陋
    • Linux 2.5 O(1)调度程序;适用于大服务器的工作负载,不适用于有很多交互程序需要运行的桌面系统
    • Linux 2.6 反转楼梯最后期限调度算法(Rotating Staircase Deadline scheduler)(RSDL) 解决了Linux 2.5的缺点
    • Linux 2.6.23 更名为:完全公平调度算法(Completely Fair Schduler)(CFS)

3、策略

进程调度策略决定了进程运行的时机

  • I/O消耗型和处理器消耗型的进程
    1. 什么是I/O消耗型进程?
      大部分时间用来提交I/O请求或者是等待I/O请求,例如:多数用户图形界面程序(GUI)
    2. 什么是处理器消耗型进程?
      大部分时间用于执行代码上,除非被抢占,否则会一直不断运行。例如:MATLAB
    3. Linux进程调度策略更倾向于哪种进程?
      更倾向于I/O消耗型程序,以提供更好的程序响应速度。但调度程序也并未忽略处理器消耗型的进程
    4. 调度策略需要解决的矛盾是什么?
      寻找二者的平衡:进程响应速度(响应时间短)& 最大系统利用率(高吞吐量)
  • 进程优先级
    1. 设置进程优先级有什么用?
      用户和系统都可以通过设置进程的优先级来影响系统的调度。具体的调度策略后面会讲。
    2. Linux采用了几种优先级范围?
      两种,分别是nice值和实时优先级。
    3. 什么是nice值?
      在Linux系统中,nice值代表时间片的比例。nice值的范围是[-20,19],数值越低表明进程优先级越高。
    4. 什么是实时优先级?
      实时优先级的范围是[0,99],数值越高表明进程优先级越高。任何实时进程的优先级都高于普通进程,也就是说实时优先级和nice优先级处于两个互不相交的范畴。
    5. 感悟
      很显然,有实时要求的进程肯定比普通进程来更重要。
  • 时间片
    1. 什么是时间片?
      时间片是一个数值,它表明进程在被抢占前所能持续运行的时间。
    2. Linux调度器分配时间片的方式是什么?
      Linux的CFS调度器并没有直接分配时间片到进程,而是将处理器的使用比例划分给了进程。此外,这个比例也会收到进程nice值的影响,进程优先级越高能抢得更多的比例,反之亦反。
    3. 如何判断当前进程是否可以被抢占?
      if(新可运行程序消耗的处理器时间比 < 当前运行的进程) 新进程立刻投入运行,抢占当前进程。
      else 推迟新可运行程序运行。
  • 调度策略的活动
    一句话:CFS要平衡I/O消耗型进程和处理机消耗型进程。CFS总是会毫不犹豫地让I/O消耗型进程在需要时被投入运行,而处理机消耗型进程则只能在剩下的时刻运行。

4、Linux调度算法

  • 调度器类
    1. 什么是调度器类?
      调度器类允许不同类型的进程可以有针对性地选择调度算法。
    2. 为什么要引入上面这个概念?
      完全公平调度(CFS)就是一个针对普通进程的调度类,这个是本节的重点内容。
  • Unix系统中的进程调度
    1. Unix系统中的进程调度是什么样子的?
      在Unix系统上,进程调度与进程优先级(nice值)和时间片这两个概念密切相关,这样会出现一个影响公平性的问题——分配绝对的时间片引发了固定的切换频率。那么就引入了下面关于CFS的讨论。
  • 公平调度(CFS)
    1. CFS的出发点是什么?
      进程调度的效果如同系统具备一个理想中的完美多任务处理器,在这个系统中,每个进程能获得1/n的处理器时间(n为进程数量),并且系统调度给他们无限小的时间周期。
    2. 现实中CFS是什么样的?
      允许每个进程运行一段时间,循环轮转、选择运行最少的进程作为下一个运行进程,不再采用时间片分配方式。
    3. CFS还关心时间片吗?
      当然,为了计算准确的时间片,CFS为完美多任务中的无限小调度周期的近似值设置了一个目标——“时间延迟”。例如:将时间延迟设置为20ms,则如果有4个同样优先级的任务,每个任务运行时间为5ms。
    4. 接着上面的问题,当可运行任务数量趋于无限,则它们各自所获得的处理器比和时间片都将趋于0,这样回导致巨大的进程切换消耗时间。所有,如何解决这个问题?
      CFS引你入每个进程获得的时间片底线——最小粒度,默认为1ms,这样可以确保进程切换的额消耗时间在合理的范围内。
    5. nice值在CFS中的用处是什么,具体的用法?
      作为进程获得处理器运行比的权重。任何进程所获得的处理器时间是由他自己和其他可运行进程nice值的差值决定的,而不是绝对值。例如:时间延迟设置为20ms。P1的nice为0,P2的nice为5,则它们获得15ms和5ms的处理器时间。P1的nice为10,P2的nice为15,则它们还是获得15ms和5ms的处理器时间。

5、Linux调度的实现

  • 时间记账
    • 调度器实体结构(略)
    • 虚拟实时
      1. 什么是vruntime变量
        vruntime变量存放进程的虚拟运行时间,CFS使用vruntime变量记录一个程序到底运行了多长时间以及它还应该再运行多久。
  • 进程选择
    1. 如何选择进程?
      选择具有最小vruntime的任务运行。
    2. 如何找到最小vruntime的进程?
      CFS使用红黑树来组织可运行进程队列,并利用其迅速找到最小vruntime值的进程。
  • 调度器入口
    进程调度的主要入口点函数是schedule(),它的作用是选择哪个进程可以运行,何时将其投入运行。
  • 睡眠和唤醒
    1. 什么是睡眠?
      就是进程阻塞。比如:进程在获取键盘输入时需要等待,此时进程把自己标记为休眠状态。从可执行红黑树中移除,放入等待队列。
    2. 什么是唤醒?
      就是睡眠的逆过程。进程被设置为可执行状态,然后从等待队列移到可执行红黑树中。
    3. 如何形象理解睡眠与唤醒?请添加图片描述

6、抢占和上下文切换

  • 上下文切换
    1. 什么是上下文切换?
      从一个可执行进程切换到另一个可执行进程的过程。由<kernel/sched.c>中的context_switch()函数负责处理。
    2. 什么时候由谁调用context_switch()函数?
      当一个新的进程被选处理准备投入运行的时候,schedule()就会调用该函数。
    3. context_switch()函数具体完成了哪些工作?
      • 调用声明在<asm/mmu_context.h>中的switch_mm(),负责把虚拟内存从上一个进程映射切换到新进程中。
      • 调用声明在<asm/system.h>中的switch_to(),该函数负责从上一个进程的处理器状态切换到新进程的处理器状态。
    4. 内核怎么知道在什么时候调用schedule()
      内核提供了一个重要的标志——need_resched,用于表明是否需要重新执行一次调度。
    5. need_resched标志什么时候会被设置?
      • 当某个进程应该被抢占时,scheduler_tick()就会设置这个标志。
      • 当一个优先级高的进程进入可执行状态的时候,try_to_wake_up()也会设置这个标志
    6. 每个进程都有need_resched标志吗?
      是的,因为访问进程描述符内的数值要比访问全局变量快(current宏速度很快并且进程描述符通常在高速缓存里)
  • 用户抢占
    1. 什么是用户抢占?
      内核即将返回用户空间的时候,如果need_resched标志被设置,就会导致schedule()被调用,此时就会发生用户抢占。
    2. 什么时候产生用户抢占?
    • 从系统调用返回用户空间时
    • 从中断处理程序返回用户空间时
  • 内核抢占
    1. 什么是内核抢占?
      如果没有持有锁,正在执行的代码是可以重新导入的,也就是可以抢占的。具体来讲就是:need_resched被设置并且preempt_count为0(preempt_count表征上锁的次数。上锁+1,解锁-1)
    2. 什么时候产生内核抢占?
    • 中断处理程序正在执行,且返回内核空间之前
    • 内核代码再一次具有可抢占性的时候
    • 内核中的任务显式调用schedule()
    • 内核中的任务阻塞(同样会导致调用了schedule()

7、实时调度策略

  1. Linux提供了那种实时调度策略?它们被CFS调度器管理吗?
    Linux提供了两种实时调度策略:SCHED_FIFOSCHED_RR,它们不被CFS调度器管理,而是被一种特殊的实时调度器管理。
  2. Linux非实时调度策略是什么?
    SCHED_NORMAL
  3. 什么是SCHED_FIFO调度算法?
    • SCHED_FIFO实现了先入先出的调度算法,不使用时间片。
    • SCHED_FIFO级的进程比任何SCHED_NORMAL级的进程优先级高。只要有SCHED_FIFO级进程在执行,其他级别更低的进程只能等待它变成不可运行状态后才有机会执行。
    • 只有更高优先级的SCHED_FIFOSCHED_RR才能抢占SCHED_FIFO任务
    • 如果多个同优先级的 SCHED_FIFO级进程,它们会轮流执行。
    • SCHED_FIFO级进程处于可执行状态,就会一直执行下去,直到自己受到阻塞或者显式地释放处理器为止。
  4. 什么是SCHED_RR调度算法?
    • SCHED_RR调度算法是带有时间片的SCHED_FIFO,即SCHED_RR是一种实时轮转调度算法。
    • 时间片只能用来重新调度同一优先级的进程,当SCHED_RR任务耗尽它的时间片时,在同一优先级的其他实时进程被轮流调度。
    • 对于SCHED_RR进程,高优先级总是立即抢占低优先级,但低优先级决不能抢占高优先级任务,即便时间片耗尽。
  5. 什么是软实时,什么是硬实时,Linux提供的是哪种?
    • Linux的实时调度算法提供了一种软实时的工作方式
    • 软实时:内核调度进程,尽力使进程在它的限定时间到来之前运行,但内核不保证总能满足这些进程的要求。
    • 硬实时:保证在一定条件下,可以满足任何调度的要求。
  6. 实时优先级的调度范围是多少?
    [0,MAX_RT_PRIO-1],默认MAX_RT_PRIO为100,即默认为[0,99]
  7. SCHED_NORMAL级进程的nice值与前一个问题有何关联?
    SCHED_NORMAL级进程的nice值共享了实时优先级的取值空间。它的范围使[MAX_RT_PRIO,MAX_RT_PRIO+40],即默认为实时优先级的[100,139],对应nice值的范围为[-20,19]

8、与调度相关的系统调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3082.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】Kubernetes(k8s)部署 MySQL+Dubbo+Nacos服务

一、说明二、部署 MySQL三、部署 Nacos四、部署 Dubbo 服务4.1. 创建镜像仓库的密钥4.2. 部署 provider 服务4.3. 部署 consumer 服务五、测试一、说明 本文介绍基于 Kubernetes(k8s) 环境集成阿里云 私有镜像仓库 来部署一套 Dubbo Nacos 的微服务系统&#xff0c;并使用 Ku…

7个最好的PDF编辑器,帮你像编辑Word一样编辑PDF

PDF 是具有数字思维的组织的重要交流工具。提供高效的工作流程和更好的安全性&#xff0c;可以创建重要文档并与客户、同事和员工共享。文档的布局已锁定&#xff0c;因此无论在什么设备上查看&#xff0c;格式都保持不变。这是让每个人保持一致的好方法——尤其是那些使用Micr…

C++中的引用

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C】 接下来就要开始进行C的学习路线了&#xff0c;听说这块的内容稍微难一些&#xff0c;不过我相信只要自己好好学习&#xff0c;态度…

java与Spring的循环依赖

java与Spring的循环依赖一、循环依赖是什么有什么危害二、循环依赖在Spring中的体现和类型三、Spirng如何解决循环依赖四、总结一、循环依赖是什么有什么危害 什么是循环依赖 java中循环依赖用一张图来说就是下图&#xff1a;在对象的创建过程中多个对象形成了依赖闭环&#xf…

初识linux之管道

一、进程间通信的概念大家都知道&#xff0c;进程是具有独立性的&#xff0c;因为一个程序运行起来生成进程时&#xff0c;也会生成它的进程结构体&#xff0c;即PCB&#xff0c;然后然后通过进程结构体中的结构体指针找到它的虚拟地址空间&#xff0c;然后再通过它的页表映射到…

C语言——字符函数和字符串函数【详解】(一)

文章目录函数介绍1.strlen2.strcpy3. strcat4. strcmp5. strncpy6. strncat7. strncmp8. strstr函数介绍 求字符串长度 strlen 长度不受限制的字符串函数&#xff08;使用时不安全&#xff09; strcpy strcat strcmp 长度受限制的字符串函数介绍&#xff08;与长度不受限制函数…

【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(9)

目录 写在前面&#xff1a; 题目&#xff1a;P1025 [NOIP2001 提高组] 数的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; 代…

【数据结构】哈希表

目录 1、哈希表 1.1 哈希表的简介 1.2 降低哈希冲突率 1.3 解决哈希冲突 1.3.1 闭散列 1.3.2 开散列&#xff08;哈希桶&#xff09; 1、哈希表 1.1 哈希表的简介 假设我们目前有一组数据&#xff0c;我们要从这组数据中找到指定的 key 值&#xff0c;那么咱们目…

【Java集合面试宝典】HashMap的put流程和特性?HashMap的扩容机制?原理— day08

目录 数组和链表分别适用于什么场景&#xff0c;为什么&#xff1f; 数组 链表 List和Set的区别 List和Map、Set的区别 HashMap 、HashTable 和TreeMap有什么区别&#xff1f; hashmap的特性 HashMap和HashTable有什么区别&#xff1f;&#xff08;必会&#xff09; J…

【数据结构】树的介绍

文章目录前言树的概念及结构树的概念树的表示树在实际中的运用二叉树的概念及结构二叉树的概念现实中的二叉树特殊的二叉树二叉树的性质二叉树的储存结构顺序存储链式存储写在最后前言 &#x1f6a9;本章给大家介绍一下树。树的难度相对于前面的数据结构来说&#xff0c;又高了…

ESP32设备驱动-HDC1080温度湿度传感器驱动

HDC1080温度湿度传感器驱动 文章目录 HDC1080温度湿度传感器驱动1、HDC1080介绍2、硬件准备3、软件准备4、驱动实现1、HDC1080介绍 HDC1080 是一款集成温度传感器的数字湿度传感器,可在极低功耗下提供出色的测量精度。 HDC1080 在很宽的电源范围内工作,是一种低成本、低功耗…

“提效”|教你用ChatGPT玩数据

ChatGPT与数据分析&#xff08;二&#xff09; 上文给简单聊了一下为什么ChatGPT不能取代数据分析师&#xff0c;本文我们来深入感受一下如何让GPT帮助数据分析师“提效”。 场景一&#xff1a;SQL取数 背景&#xff1a;多数数据分析师都要用SQL语言从数据库中提取数据&#x…

ctfshow web入门 命令执行29-33

1.web29eval()函数是把所有字符串当作php代码去执行&#xff0c;这题过滤了flag,使用通配符绕过过滤应该要注意文件中没有重名的文件&#xff0c;或一部分是一样的文件payload:cecho%20nl flag.php; #官方解法&#xff0c;反引号表示执行系统命令&#xff0c;nl为linux系统命令…

springboot智慧外贸平台

053-springboot智慧外贸平台演示录像2022开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff…

干货:浅谈主数据管理项目建设思路

“主数据是数据之源&#xff0c;是数据资产管理的核心&#xff0c;是信息系统互联互通的基石&#xff0c;是信息化和数字化的重要基础。 ——《主数据管理实践白皮书》” 近期&#xff0c;国家印发《数字中国建设整体布局规划》&#xff0c;提出数字中国建设的整体框架…

I2C协议简介 Verilog实现

I2C协议 IIC 协议是三种最常用的串行通信协议&#xff08;I2C&#xff0c;SPI&#xff0c;UART&#xff09;之一&#xff0c;接口包含 SDA&#xff08;串行数据线&#xff09;和 SCL&#xff08;串行时钟线&#xff09;&#xff0c;均为双向端口。I2C 仅使用两根信号线&#xf…

Django 实现瀑布流

需求分析 现在是 "图片为王"的时代&#xff0c;在浏览一些网站时&#xff0c;经常会看到类似于这种满屏都是图片。图片大小不一&#xff0c;却按空间排列&#xff0c;就这是瀑布流布局。 以瀑布流形式布局&#xff0c;从数据库中取出图片每次取出等量&#xff08;7 …

Educational Codeforces Round 145 (Rated for Div. 2) (A~E)

Problem - B - Codeforces 思路&#xff1a; 我们选择长度后&#xff0c;其特定长度会构成一个正方形&#xff0c;因为点与点距离大于1&#xff0c;所以偶数的正方形里面只能包含偶数的正方形&#xff0c;奇数的包含奇数。计算每个长度容纳最大点数&#xff1a; 发现cnt[0]1,…

WPF毛笔字实现过程

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Python中生产者消费者模型

Python生产者消费者模型 一、消费模式 生产者消费者模式 是Controlnet网络中特有的一种传输数据的模式。用于两个CPU之间传输数据&#xff0c;即使是不同类型同一厂家的CPU也可以通过设置来使用。 二、传输原理 类似与点对点传送&#xff0c;又略有不同&#xff0c;一个生产…