进程的调度概述

进程调度概述

多任务处理机制是需要进行进程调度的本质原因。

cpu的资源是有限的,因此需要使用调度器来为线程分配cpu资源。调度器的主要目的是解决

cpu争用的问题,使得每个进程可以按照一定的规则进行运行。

那么如何来分配CPU的运行时间呢?比较传统和朴素的想法就是给每个进程分配优先级,

根据优先级来分配时间片。优先级高的时间片分配的比较多,优先级低的分配的时间片比较少。

由于现在计算机都是多任务并发处理的,所以CPU需要将时间划分为周期,一个周期也就是一段时间。

将这一段时间按照优先级分配给进程。等到所有的进程执行完所有的时间之后,开启下一个周期。

这也是比较经典的进程调度方法。linux2.4使用的是经典的调度策略,

到linux2.6则使用O(1)调度策略的主要思想都是一致的。

总结上面经典方法涉及到以下关键点:

1 给进程分配优先级别。

2 时间片如何分配

3 将分配好的进程组织起来进行存放。

4 在组织好的进程内部选择最优的进程。

进程优先级

优先级与进程类别有关,进程分为以下几类:

1 硬实时进程,此类进行对时间的要求比较高,必须在规定的时间内进行相应

2 软实时进程,对时间要求也很到,但及时不响应,也不会世界末日。

3 普通进程(IO密集形和计算密集形式)

其中硬实时进程和软实时进程的优先级比较高(0-99)

普通进程的优先级(100-140)

实时进程的优先级要高于普通进程的优先级。

nice值:提供给用户态可以动态修改的值,nice值越大,优先级越低。

nice值越小,优先级越高。

(-20-19)nice值和进程优先级具有一定的对应关系。代码定义如下所示:

#define MAX_USER_RT_PRIO    100
#define MAX_RT_PRIO        MAX_USER_RT_PRIO
#define MAX_PRIO        (MAX_RT_PRIO + 40)
#define USER_PRIO(p)        ((p)-MAX_RT_PRIO)
#define MAX_USER_PRIO        (USER_PRIO(MAX_PRIO))
#define NICE_TO_PRIO(nice)    (MAX_RT_PRIO + (nice) + 20)

时间片的分配

时间片是关键的资源,分配多少时间片意味着一个进程可以在一个周期内执行多长时间。

#define HZ   1000
#define DEF_TIMESLICE  (100 * HZ / 1000)
#define SCALE_PRIO(x, prio) \
    max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO/2), MIN_TIMESLICE)

static unsigned int task_timeslice(task_t *p)
{
    if (p->static_prio < NICE_TO_PRIO(0))
        return SCALE_PRIO(DEF_TIMESLICE*4, p->static_prio);
    else
        return SCALE_PRIO(DEF_TIMESLICE, p->static_prio);
}

上面就是时间计算函数,主要跟nice值有关,因此可以判断,时间片的分配和nice值有很大的关系。nice值越大可以分配的

时间片也就越多。

普通进程有一类交互式进程,交互式进程要求计算机快速反应。这样用户的体验比较好。

对于交互式进程,需要优先执行。方法就是对nice值进行动态调整,调整的依据就是判断进程是不是

sleep的时间比较长,如果时间长,时间片也就用的少,时间片用的少则会提高nice值,来提高优先级。

完全公平调度

经典调度方式以及O(1)调度方式存在一些既有的缺点,导致它的运行并不是很理想。

为了弥补经典调度方式的缺点,完全公平调度算法出现。

完全公平调度算法的核心是:保证所有进程的(运行时间/权重)的值尽可能一致。

完全公平调度算法的核心就是:

vruntime = 实际运行时间 * 1024 / 进程权重                      (公式1)

实际运行时间=调度周期 * 进程权重 / 所有进程总权重(公式2)

将公式2代入到公式1 得到如下结果:

vruntime = 调度周期 * 进程权重 / 所有进程总权重) * 1024 / 进程权重 = 调度周期 * 1024 / 所有进程总权重

vruntime与进程权重无关。1024和所有进程总权重都是常数,唯一的变量是调度周期。

vruntime越小说明进程运行的时间越短,需要给这样的进程更多的运行时间。

在完全公平调度算法中,所有的进程内部都有一个变量sched_entity。所有的sched_entity都是通过红黑树进行组织的,这样可以快速地找到要运行的进程。

参考资料:

调度算法的历史,以及对新的算法的阐述。

https://www.ibm.com/developerworks/cn/linux/l-cn-scheduler/index.html

https://blog.csdn.net/russell_tao/article/details/7094287

看完下面的文章之后了解了完全公平算法。

https://www.cnblogs.com/tianguiyu/articles/6091378.html

原文地址:https://www.cnblogs.com/zhouqi0505/p/11263314.html

时间: 2024-07-31 15:52:14

进程的调度概述的相关文章

实验三 进程模拟调度

1. 目的和要求 实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 实验要求 设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序. 进程调度算法:“时间片轮转法”调度算法对N个进程进行调度. 2. 实验内容 完成两个算法(简单时间片轮转法.多级反馈队列调度算法)的设计.编码和调试工作,完成实验报告. 1) 每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. 2) 每个进

实验二 用C语言表示进程的调度

实验二 一. 实验目的 通过模拟进程的调度,进一步了解进程的调度的具体过程. 二. 实验内容和要求 1.进程PCB的结构体定义 2.定义队列 3.输入进程序列 4.排序(按到位时间) 5.输出进程运行的结果 三.程序 #include<stdio.h>#include<malloc.h>#include<time.h> /*定义一个Course类型的结构体*/typedef struct queue{ int number; int intime; int runnin

RHCA学习笔记:RH442-Unit8进程与调度

UNIT 8  Processes and the Scheduler 进程与调度 学习目标 A. CPU cache 与Service time之间的关系 B. 分析应用程序使用CPU cache时的情况(CPU使用率与CPU cache命中率) C. 抢占 (根据优先级抢占) D 根据进程优先级顺序进行调度与排序 E. 监控内核和进程的性能 8.1    Characterizing prosess states 进程状态  查看进程状态: ps axo pid,comm,stat –sor

Linux进程核心调度器之主调度器--Linux进程的管理与调度(十九)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-30 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 我们前面提到linux有两种方法激活调度器:核心调度器和 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要 因而内核提供了两个调度器主调度器,周期性调度器,分别实现如上工作, 两者合在一起就组成了核心调度器(core sched

Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)【转】

转自:http://blog.csdn.net/gatieme/article/details/51872594 日期 内核版本 架构 作者 GitHub CSDN 2016-06-30 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 我们前面提到linux有两种方法激活调度器:核心调度器和 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要 因而内

Linux进程管理(二)进程的调度与资源限制

1 进程调度就绪进程最重要的特征是该进程是非阻塞的.进行用户交互.大量读写文件.响应I/O和网络事件的进程会花费大量时间来等待资源可用,在相当长的时间内无法转为就绪状态(长是相对于指令运行时间而言),因此就绪进程首先应该是非阻塞的.一个就绪进程还必须至少有部分"时间片"(调度器分配给进程的运行时间).内核用一个就绪队列维护所有的就绪进程,一旦某进程耗光它的时间片,内核就将其移出队列,直到所有就绪进程都耗光时间片才考虑将其放回队列.多任务操作系统分为两大类:协同式和抢占式.Linux实现

我是如何学习写一个操作系统(六):进程的调度

前言 既然引进了多进程,其实也就是在进程之间来回切换,那么就会有进程之间的调度问题.实则是在可运行进程之间分配有限的处理器时间资源的内核子系统. 几个简单的CPU调度算法 First Come, First Served(FCFS) 其实就是一个先进先出队列了,也就是说先申请的进程,先执行.当CPU空闲时,它会分配给位于队列头部的进程,并且这个运行进程从队列中移去.FCFS调度代码编写简单并且理解容易. 但是对于一个需要和用户进行交互的进程,这种调度算法就会造成体验非常不好,因为周转时间需要完成

【UNIX】内核对进程的调度机制

(调度器)            对于一般进程,CPU的使用时间都是系统平均分配给每一个进程的,因此这种公平分享都从进程的角度出发的.   1) 调度时机:什么情况下,什么时候进行调度 2) 调度的策略:根据什么准则选取下一个进程 3) 调度方式:是"可剥夺"还是"不可剥夺",当正在运行的进程并不自愿放弃对从CPU 的使用权时,是否强制性的暂时剥夺其使用权,停止其运行而给其他进程一个机会,若 果是可剥夺,是否在任何情况下都可剥夺? 调度时机: 首先,自愿的调度(主动

Linux系统的中断、系统调用和调度概述【转】

转自:http://blog.csdn.net/yanlinwang/article/details/8169725 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近学习Linux操作系统,关于中断系统调用和进程的级别总是感觉有些模糊的地方,特在此做个小结,整理下思路. 所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序.等这些特殊事情处理完之后再回去执行之前的程序.中断一般分为三类:1.由计算机硬件异常或故障引起的