多处理器调度
当有多个CPU可用时,CPU调度更加复杂
多处理器中的同构处理器
非对称多处理(AMP) -
所有调度决策、I/O处理和其他系统活动仅由一个处理器(主服务器)处理。
其他处理器只执行代码。
只有一个处理器访问系统数据结构,减少了数据共享的需求
对称多处理(SMP) -
每个处理器都是自我调度的,
公共就绪队列中的所有进程
每个进程都有自己的私有就绪进程队列
处理器关联性——进程与当前运行的处理器具有关联性
软关联——进程可以在处理器之间迁移
硬关联——一个进程不能迁移到其他处理器
- NUMA和CPU调度
主内存体系结构会影响处理器关联问题。
一种具有非统一内存访问(NUMA)特性的架构,在这种架构中,CPU对主存的某些部分的访问速度要快于对其他部分的访问速度。
多核处理器
在同一物理芯片上放置多个处理器核心的最新趋势
更快,消耗更少的能量
内存暂停——当处理器访问内存时,它将花费大量时间等待数据变得可用。
每个核的多个线程也在增长
当内存检索发生时,利用内存暂停在另一个线程上取得进展
操作系统实例
Solaris调度
Solaris使用基于优先级的线程调度,其中每个线程属于以下六个类中的一个:
时间分享(TS)
互动(IA)
实时(RT)
系统(系统)
公平份额(FSS)
固定优先级(FP)
在每个类中有不同的优先级和不同的调度算法。
进程的默认类是时间共享。
分时类的调度策略使用多个反馈队列动态地改变优先级并分配不同长度的时间片。
优先级和时间片之间是反比关系。
下表显示了分时和交互式线程的调度表。
这两个调度类包括60个优先级。
用于分时和交互式线程的Solaris分派表
优先级:分时类和交互式类的类依赖优先级。数字越大,优先级越高。
时间量程:相关优先级的时间量程。
时间量程过期:已使用其全部量程而没有阻塞的线程的新优先级。这样的线程被认为是cpu密集型的,它们的优先级会降低。
回来睡觉。从睡眠(例如等待I/O)中返回的线程的优先级。当I/O对一个等待的线程可用时,它的优先级将提高到50-59之间——这对于交互进程来说是很好的响应时间。
Windows XP调度
Windows XP使用基于优先级的抢占式调度算法调度线程。
确保始终运行最高优先级的线程。
调度程序:Windows XP内核中处理调度的部分。
选择要运行的线程将一直运行,直到它被高优先级的线程抢占,直到它终止,直到它的时间量程结束,或者直到它调用一个阻塞的系统调用。
32-level优先配屋计划。
分为两类
变量类:优先级为1-15的线程
实时类,16-31
优先级为0的内存管理线程
空闲线程:如果没有找到就绪的线程,则执行空闲线程。
Win32 API标识了进程可以属于的几个优先级类:
REALTIME_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
除了REALTIME_PRIORITY_CLASS之外的所有类中的优先级都是可变的,属于其中一个类的线程的优先级可以改变。
给定优先级类中的线程也有一个相对优先级:
TIME_CRITICAL
最高
ABOVE_NORMAL
正常的
BELOW_NORMAL
最低
闲置
每个线程都有一个基优先级,表示线程所属类的优先级范围内的值。
基本优先级是该类的NORMAL相对优先级的值。
基本优先级:
REALTIME_PRIORITY_CLASS——24
HIGH_PRIORITY_CLASS——13
ABOVE_NORMAL_PRIORITY_CLASS——10
NORMAL_PRIORITY_CLASS——8
BELOW_NORMAL_PRIORITY_CLASS——6
IDLE_PRIORITY_CLASS——4
Linux调度
O(1)阶不变的调度时间,无论系统上的任务数量如何。
Linux调度器是一种抢占式的、基于优先级的算法,具有两个独立的优先级范围:从0到99的实时范围和从100到140的良好值
这两个范围映射为一个全局优先级方案,其中数值较低的值表示较高的优先级。
与Solaris和Windows XP不同,Linux分配的任务优先级更高,时间更长。
- 优先级和时间片长度
- 根据优先级索引的任务列表
调度器选择具有最高优先级的任务
在CPU上执行。
当所有任务都耗尽了它们的时间片(活动数组为空)时,两个优先级数组被交换。
算法评估
标准
在最大响应时间为1秒的约束下最大化CPU利用率
使吞吐量最大化,使周转时间(平均)与总执行时间成线性比例
确定性建模
排队模型
模拟
实现
分析评价是评价方法的一个主要类别。
分析评估使用给定的算法和系统工作负载来产生一个公式或数字,用于评估该工作负载下算法的性能。
确定性建模是一种分析评估——采用特定的预定工作负载,并定义该工作负载下每个算法的性能
例子
确定性模型
最少平均等候时间?
先
SJF
RR (quantum = 10毫秒)
排队模型
在许多系统上,运行的流程每天都不同,因此没有用于确定性建模的静态流程集。
可以确定的是CPU和I/O突发的分布。
这些分布可以被测量,然后近似或简单地估计-一个数学公式描述一个特定的CPU突发的概率。
通常,这种分布是指数分布,用其均值来描述。
类似地,我们可以描述进程到达系统的时间分布(到达时间分布)。
基于这两种分布,可以计算出大多数算法的平均吞吐量、利用率、等待时间等。
排队网络分析:计算机系统被描述为一个服务器网络。每个服务器都有一个等待进程队列
CPU就绪队列
I/O系统——设备队列
知道到达率和服务率,我们就可以计算利用率、平均队列长度、平均等待时间等。
设n为平均队列长度(不包括正在服务的进程)
设W为排队的平均等待时间
λ为队列中新进程的平均到达率(如每秒3个进程)
小公式:n = λ x W
我们预计在进程等待的时间W期间,λ x W新的进程将到达队列。如果系统处于稳定状态,那么离开队列的进程数必须等于到达的进程数。
如果我们知道另外两个变量,利特尔公式可以用来计算三个变量中的一个。
例如,n = 14 λ = 7,那么我们有W = 2
排队分析也有局限性
到达和服务分配通常是用数学上易于处理的方式来定义的——但不现实。
一般需要做一些独立的假设,这可能是不准确的。
排队模型通常只是真实系统的近似。
- CPU调度器的仿真评估