概述

什么是进程调度

  • 进程调度:在可运行态进程之间分配有限处理器时间资源的内核子系统。

一、调度策略

4.1进程类型

  • I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状态,但运行时间短,等待请求过程时处于阻塞状态。如交互式程序。

  • 处理器消耗型进程:时间大都用在执行代码上,除非被抢占否则一直不停的运行。

  • 综合型:既是I/O消耗型又是处理器消耗型。

  • 调度策略要在:进程响应迅速(响应时间短)和最大系统利用率(高吞吐量)之间寻找平衡。

4.2 调度概念

  • 优先级:基于进程价值和对处理器时间需求进行进程分级的调度。

  • 时间片:表明进程被抢占前所能持续运行的时间,规定一个默认的时间片。时间片过长导致系统交互性的响应不好,

  • 程序并行性效果差;时间片太短增大进程切换带来的处理器耗时。矛盾!

  • 间片耗尽进程运行到期,暂时不可运行状态。直到所有进程时间片都耗尽,重新计算进程时间片。

  • Linux调度程序提高交互式程序优先级,提供较长时间片;实现动态调整优先级和时间片长度机制。

  • 进程抢占:Linux系统是抢占式,始终运行优先级高的进程。

4.3 策略

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

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

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

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

4.3.2 进程优先级

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

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

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.3 调度器入口

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

4.5.4 睡眠和唤醒

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

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

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

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 值。

最新文章

  1. Unity 3D 正交相机(Orthographic)
  2. 详解CSS中clear属性both、left、right值的含义
  3. 强大的修改数据库修改语句ALTER TABLE(一)[20160712]
  4. 【读书笔记《Android游戏编程之从零开始》】7.Android 游戏开发常用的系统控件(Dialog)
  5. JavaScript设计模式的简单理解
  6. jqGrid详解及高级应用(十四)
  7. 【Linux学习】 包含子目录的makefile简单应用
  8. codeforces Codeforces Round #345 (Div. 1) C. Table Compression 排序+并查集
  9. PHP常见报错解析
  10. Javascript 链式运动框架——逐行分析代码,让你轻松了解运动的原理
  11. 201621123062《java程序设计》第13周作业总结
  12. JAVA代理机制
  13. Hibernate对应关系(了解)
  14. swift中Cell的内容定制
  15. 51nod 1130 N的阶乘的长度 V2(斯特林近似)
  16. win 10 安装visual studio 2013
  17. hbase计数器
  18. django通过使用jwt模块实现状态保持
  19. 查看及连接指定 docker container
  20. WPF程序开机速度策略

热门文章

  1. django restframework 教程之Serialization(序列化)
  2. js的声明提前
  3. (分解质因数模板)求 1~r 内与 n 互素的元素个数
  4. Weinre 远程调试移动端手机web页面
  5. angular -- ng-ui-route路由及其传递参数?script标签版
  6. 查询hadoop参数变量
  7. Ext学习系列(1)初识Ext
  8. docker :no such file or directory
  9. nginx 认证访问web
  10. 牛客网多校赛第七场A--Minimum Cost Perfect Matching【位运算】【规律】