11.cpu调度策略与schedule调度函数

【README】

1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;

2.cpu调度: 指的是 cpu从就绪队列中选择一个进程来执行;选择哪一个进程是调度算法的执行结果;

3. 相关定义:

  • 响应时间:从用户操作发生到程序响应的等待时间;
  • 吞吐量:cpu在单位时间内完成的任务量;
  • 周转时间: 从进程提交到进程完成的时间间隔;

4.4种调度算法列表(非常重要*):

  • 先来先服务 FCFS;
  • 短作业优先 SJF;
  • 时间片轮转调度 RR-RoundRobin算法;
  • 优先级调度;

【1】cpu调度策略

【1.1】多进程图像与cpu调度

1)问题: 进程pid1执行阻塞,应该切换到 pid2 还是pid3执行,这就需要调度算法来决定了;


【1.2】调度策略

1)调度策略:FIFO,优先级 ;
2)调度算法应该满足进程正常运行条件

  • 尽快结束任务: 周转时间(从任务进入到任务结束)短;
  • 用户操作尽快响应: 响应时间(从操作发生到响应)短;
  • 系统内耗时间少:吞吐量(cpu单位时间完成的任务量)

3)总原则:系统专注于任务执行, 又能合理调配任务;
4)如何做到合理? 需要折中,综合考虑

吞吐量与响应时间之间的矛盾

  • 响应时间小 =》 切换次数多  =》 系统内耗大 =》 吞吐量小 ;即响应时间短与吞吐量大两者不可兼得;
  • 响应时间,指的是 用户敲键盘到键盘响应的时间;

【例】敲键盘

  • 用户在程序1中敲键盘那个时刻,cpu刚好切换到其他程序2执行,程序2执行若干时间片又切回程序1,这时程序1才响应键盘中断,从切出来到切回来这段时间叫做响应时间(或指的是从操作发生到程序响应的用户等待时间);
  • 要想响应时间小,即程序的cpu时间片减少(下图程序2的执行时间要少),那切换次数就要多;
  • 切换次数越多, 切换成本越高(如栈切换,tss切换),即系统内耗大,进而导致吞吐量小;

 

                                     图 敲键盘的响应时间


5)任务类型

  • 5.1)IO密集型任务: 程序需要执行计算与IO工作;
  • 5.2)CPU密集型任务:仅执行计算工作; 

【1.3】cpu调度算法*

4种调度算法列表(非常重要*):

  • 先来先服务 FCFS;
  • 短作业优先 SJF;
  • 时间片轮转调度 RR-RoundRobin算法;
  • 优先级调度;

【1.3.1】调度算法1:先来先服务-FCFS

 first come, first served

图解:

  • 调度策略1: P1, P2, P3, P4, P5;平均周转时间为 (10+39+42+49+61) / 5 = 40.2
  • 调度策略2: P1, P3, P2, P4, P5;平均周转时间为 (10+13+42+49+61)/5= 35

策略1与策略2的区别在于:

  •  策略2把短作业 P3 放在了P2的前面,可以理解为 短作业优先;

先来先服务的调度算法比较基础; 


【1.3.2】调度算法2-短作业优先SJF

1.短作业优先,SJF,short job first ,减少周转时间(最小化平均周转时间);

P1+(p1+p2) + (p1+p2+p3) + … = ∑(n+1-i)Pi = n*p1 + (n-1)p2 + ……
为了使结果越小,又n最大,所以p1应该取最小,p2次之,......
2)短作业优先的问题:

  • 短作业优先调度算法,把耗时短的作业提前,耗时长的作业放后面,会导致耗时长的作业的响应时间过长,用户体验不好; 

【1.3.3】调度算法3-时间片轮转调度(RR)

1)时间片轮转调度:按照时间片轮转调度(Round-Robin轮转调度算法);


【1.3.4】 调度算法4-优先级调度

1)响应时间和周转时间同时需要考虑,怎么办 ?

  • 如 word关心响应时间, gcc编译器关心周转时间,两类任务同时存在,应该怎么办?

2)任务类型

  • 前台任务: IO密集型任务,如word;
  • 后台任务: 计算密集型任务,如gcc编译器;

3)把前台任务链接到队列1,后台任务链接到队列2;
4)优先级调度细节:

  • 前台任务队列(队列1)采用短作业优先策略,优先级高;
  • 后台任务采用轮转调度,优先级低;

 5)优先级调度算法的问题

  • 如果前台任务一直存在的话,后台任务可能一直都没有机会被cpu执行,后台任务饥饿;
  • 如果后台任务优先级被动态升高,则会影响前台任务的执行,前台任务响应时间又会增加;
  • 此外,操作系统如何知道 哪些是前台任务(io密集型任务),哪些是后台任务(计算密集型任务)? 

6)解决方法

  • 以轮转调度为核心,短作业优先级高于长作业; 

【2】一个实际的 schedule函数 (调度算法)

【2.1】linux0.11的调度函数 schedule()

1)schedule()函数源码

// 操作系统进程调度函数源码  
void schedule() 
{while(1) {c = -1;next = 0; i = NR_TASKS;p = &task[NR_TASKS];while(--i) {// TASK_RUNNING 就是 就绪 if (*p->state == TASK_RUNNING && (*p)->counter > c)c = (*p) -> counter, next = i; }// 若c不等于0,则找到了最大的counter,结束循环,跑去 switch_to 执行  // 基于 counter实现了优先级调度,且counter作为时间片,进行了轮转调度  if (c) break; // counter等于0 ,执行到这里,表示所有就绪态进程的时间片都用完了 // 遍历所有进程 for ( p = &LAST_TASK; p > &FIRST_TASK; --p ) // 就绪态进程的 时间片恢复到初值(优先级);// 阻塞态进程的 时间片设置为 时间片一半,加上初值(优先级),这个值在增加; (*p)->counter =  ( (*p)->counter >> 1 ) + (*p)->priority; } // 切换到next进程 switch_to(next); 
}


2)counter的作用
作用1:时间片;

  • 每次时钟中断发生时,counter都会自减1(时钟中断时,当前进程的counter时间片减去1,然后再切换出去;因为当前counter减1,所以它不是最大的,所以下一次轮转调度不会选择上一个同样的进程);
    1. 当 counter 不等于0,则调度到其他进程;典型的时间片轮转算法
    2. 当 counter 等于0,则表明所有就绪进程时间片用完(注意是就绪态进程,不是所有进程的时间片都用完),需要重新初始化时间片(包括初始化就绪进程时间片,增大阻塞进程时间片);

作用2: 优先级;

  • 参见上文中 schedule()函数源码中的以下代码: 
(*p)->counter =  ( (*p)->counter >> 1 ) + (*p)->priority;


counter代表的优先级可以动态调整;
阻塞的进程在就绪后,优先级高于非阻塞进程,因为

// 阻塞进程的counter值在增加 
(*p)->counter =  ( (*p)->counter >> 1 ) + (*p)->priority; 

 所以io密集型进程的优先级会高于计算密集型进程的优先级;其中io密集型是前台进程的特征;


【2.2】counter作用小结

1) Counter保证了响应时间的界,因为按照下面重置counter时间片的算法,其最大值为2p;

// 阻塞进程的counter值在增加
// 下面的算法是一个递增函数,即阻塞时间越长,counter被重置次数越多;
(*p)->counter =  ( (*p)->counter >> 1 ) + (*p)->priority; 

2)经过io后,counter会变大;io时间越长,counter时间片越大,照顾了io进程,或前台进程;
3)后台进程一直按照 counter轮转,近似 SJF 短作业优先调度算法;
4)每个进程只用维护一个 counter变量,简单,高效; 

5)cpu调度:

  • 一个简单的算法折中了大多数任务需求,这就是实际工作的 schedule函数;

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle入门(十二)之SQL的DDL

一、数据类型 Character 数据类型Number 数据类型Date 数据类型Raw 和 Long Raw 数据类型 LOB 数据类型 注:Oracle数据类型详解二、表 (1)创建表 create table emp ( emp_id char (10) primary key, emp_name varchar2 (30), sal number (…

2016微软开发者峰会在京举办 纳德拉要来做演讲

还有不到一个月的时间,2016 微软开发者峰会就要在北京举办了。 在这场开发者的盛会上,微软 CEO、技术牛人,还有来自微软亚洲研究院、亚太研发集团、Xamarin 团队以及微软中国开发体验的专家们将对各平台的开发进行技术探讨。 据了解&#xff…

centos 卸载ffmpeg_Linux下ffmpeg的完整安装

最近在做一个企业项目, 期间需要将用户上传的视频转成flv格式或mp4格式并用flash插件在前端播放, 我决定采用ffmpeg (http://www.ffmpeg.org/ )实现. 当然以前也用过ffmpeg, 但是没有安装额外的库, 只是源代码下简单地 ./configure, 最后发现好多功能都用不了, 比如最流行的x26…

1.概率论-组合分析

【README】 本文总结自《概率论基础教程》 by M.Ross ,墙裂推荐; 【1.3】排列(考虑顺序) 1)例3d: 用6个字母 PEPPER排列,共有多少种不同的排列方式? 2)推理 对于n个元素,如果其中n1个元素相同,其他n2个元素相同,......,nr个元素也相同,一共有 种不同排列方式;…

Oracle入门(十二B)之表创建

一、创建表(1)简单表 Create Table emp (Emp_id char(10) primary key,Emp_name varchar2(30),Sal number(5),Tel varchar2(20) ); (2)带参数的表格创建 create table emp (emp_id char (10) primary key,emp_name varchar2 (30),…

我的创作纪念日:感恩、感谢、感激!

/bin/bash 机缘 感恩、感谢、感激! 第一次进入到csdn,还是当初老师傅叫我们可以借鉴一下这里的文章 所以! 一开始进入到csdn网站,还以为这里也是和某些贴吧一样,一样的灌水呢! 但是正式在这里书写文章之后&#…

python中seaborn画swarm图_Python可视化 | Seaborn5分钟入门(四)——stripplot和swarmplot

微信公众号:「Python读财」如有问题或建议,请公众号留言Seaborn是基于matplotlib的Python可视化库。 它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易&#xf…

第四篇 Entity Framework Plus 之 Batch Operations

用 Entity Framework 进行 增,删,改。都是基于Model进行的,且Model都是有状态追踪的。这样Entity Framework才能正常增,删,改。 有时候,要根据某个字段,批量更新或者删除数据,用Ent…

2.概率论-概率论公理

【README】 本文总结自《概率论基础教程》 by M.Ross ,墙裂推荐; 【2.2】样本空间和事件 1)样本空间 所有可能的结果构成的集合,称为该实验的样本空间,记为S;2)事件(一个集合,或样本空间的子集) 样本空间的任一子集E称为事件;或样本空间中选取若干个结果构成的集合…

Oracle入门(十二C)之表修改

一、列操作 (1)添加列alter table 表名 add (列名 数据类型 [default 表达式], ..);alter table tableName add temp varchar2(30);(2)修改列A.修改列类型和属性alter table 表名 modify (列名 数据类型 [default 表达式], ..)…

在ThoughtWorks工作12年的技术主管,所总结的12条技术人经验

原文: 12 years, 12 lessons working at ThoughtWorks 作者: Patrick,ThoughtWorks的技术主管兼敏捷顾问 编译: 孙薇 本文作者在ThoughtWorks工作了12年之久, 回顾了往昔工作之后,他得出了12条经验心得&…

3.条件概率与独立性

【README】 本文总结自《概率论基础教程》 by M.Ross ,墙裂推荐; 【3.2】条件概率 1)条件概率定义: 【补充】条件概率计算示例 【3.3】贝叶斯公式 1)通过第2个事件发生与否计算第1个事件的概率(非常重要…

python安装运行时提示不是内部或外部命令怎么办_如何解决cmd运行python提示不是内部命令...

python安装完成后,直接运行python.exe能够正常执行python程序。但是进入到cmd命令窗口(同时按下winr组合键后输入cmd进入),输入python命令提示“不是内部或外部命令”,遇到这种现象通常是没有将python的安装路径添加到环境变量中。在桌面上右…

Oracle入门(十二D)之表删除与删除表数据

一、删除表 drop table 表名; drop table t_userinfo;二、删除表数据 (1)DML操作deletedelete from 表名;(2)DDL操作truncatetruncate table 表名;三、恢复 (1)恢复删除的表 Oracle 10g提供恢复操作 flashb…

.NET Core VS Code 环境配置

VSCode .NET环境配置 在此之前我一直是使用notepad配置的C/C#环境来写代码,比起打开"笨重"的VS要方便很多.VSCode出来之后,本来也想折腾了一下,但是当时资料太少,配置没成功,也觉notepad就已经够了. 直到前几天在博客园看到园友LineZero分享的<<使用VS Code开发…

4.随机变量

【README】 本文总结自《概率论基础教程》 by M.Ross &#xff0c;墙裂推荐&#xff1b; 【4.1】随机变量 1&#xff09;随机变量&#xff1a; 定义在样本空间上的实值函数&#xff1b;即随机变量是一个函数&#xff08;或者一个映射&#xff0c;把事件映射到数值&#xff0…

Oracle入门(十二E)之视图操作

转载自 Oracle创建视图(View)视图&#xff1a;是基于一个表或多个表或视图的逻辑表&#xff0c;本身不包含数据&#xff0c;通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表&#xff0c;Oracle的数据库对象分为五种&#xff1a;表&#xff0c;视图&#xff0c;序…

renderthread是什么_Android5.0中 hwui 中 RenderThread 工作流程

前言本篇文章是自己的一个学习笔记&#xff0c;记录了 Android 5.0 中 hwui 中的 RenderThread 的简单工作流程。由于是学习笔记&#xff0c;所以其中一些细节不会太详细&#xff0c;我只是将大概的流程走一遍&#xff0c;将其工作流标注出来&#xff0c;下次遇到问题的时候就可…

官方博客明确了 .NET Core RC2/RTM 时间表

.NET Core 经过了将近2年的开发&#xff0c;去年12月份发布的RC1版本&#xff0c;明确来说那只是一个beta版本&#xff0c;自从RC1发布以来&#xff0c;看到github里的RC2分支&#xff0c;整个工具链都发生了很大的变化&#xff0c;大家都在焦急的等待着微软发布.NET Core RC2,…

12.进程同步与信号量

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 2.进程同步&#xff1a; 让进程间的合作变得合理有序&#xff1b; 3.通过 信号量 来实现进程同步 &#xff1b; 4.操作系统借助信号量实现进程合作…