SMP CPU调度   用于多道程序

SMP(Symmetric Multi-Processor) :对称多处理器
SMP 服务器的主要特征是共享,系统中所有资源 (CPU 、内存、 I/O 等 ) 都是共享的。也正是由于这种特征,导致了 SMP 服务器的主要问题,那就是它的扩展能力非常有限。对于 SMP 服务器而言,
每一个共享的环节都可能造成 SMP 服务器扩展时的瓶颈,而最受限制的则是内存。由于每个 CPU 必须通过相同的内存总线访问相同的内存资源,因此随着 CPU 数量的增加,内存访问冲突将迅速增加,
最终会造成 CPU 资源的浪费,使 CPU 性能的有效性大大降低。实验证明, SMP 服务器 CPU 利用率最好的情况是 2 至 4 个 CPU 。NUMA(Non-Uniform Memory Access):非一致性内存访问
 NUMA 服务器的基本特征是具有多个 CPU 模块,每个 CPU 模块由多个 CPU( 如 4 个 ) 组成,并且具有独立的本地内存、 I/O 槽口等。由于其节点之间可以通过互联模块 ( 如称为 Crossbar Switch) 进行连接和信息交互,
因此每个 CPU 可以访问整个系统的内存 ( 这是 NUMA 系统与 MPP 系统的重要差别 ) 。显然,访问本地内存的速度将远远高于访问远地内存 ( 系统内其它节点的内存 ) 的速度,这也是非一致存储访问 NUMA 的由来。由于这个特点,
为了更好地发挥系统性能,开发应用程序时需要尽量减少不同 CPU 模块之间的信息交互。


SMP CPU调度   用于多道程序_Memory
SMP应用

目前的SMP技术主要用在RISC服务器阵营的多路小型机、X86服务器阵营的多路处理系统以及采用部分采用虚拟CPU技术实现单CPU(或多CPU)虚拟多路中。

我们平时见到的双路CPU系统,属于对称多处理系统中最常见的一种,通常称为"2路对称多处理",它在普通的商业、家庭应用之中并没有太多实际用途,但在专业制作,如3DMax Studio、Photoshop等软件应用中获得了非常良好的性能表现,
是组建廉价工作站的良好伙伴。随着用户应用水平的提高,只使用单个的处理器确实已经很难满足实际应用的需求,因而各服务器厂商纷纷通过采用对称多处理系统来解决这一矛盾。在国内市场上这类机型的处理器一般以4个或8个为主,
有少数是16个处理器。但是一般来讲,SMP结构的机器可扩展性较差,很难做到100个以上多处理器,常规的一般是8个到16个,不过这对于多数的用户来说已经够用了。这种机器的好处在于它的使用方式和微机或工作站的区别不大,
编程的变化相对来说比较小,原来用微机工作站编写的程序如果要移植到SMP机器上使用,改动起来也相对比较容易。SMP结构的机型可用性比较差。因为4个或8个处理器共享一个操作系统和一个存储器,一旦操作系统出现了问题,
整个机器就完全瘫痪掉了。而且由于这个机器的可扩展性较差,不容易保护用户的投资。但是这类机型技术比较成熟,相应的软件也比较多,因此现在国内市场上推出的并行机大量都是这一种。PC服务器中最常见的对称多处理系统通常采用2路、
4路、6路或8路处理器。目前UNIX服务器可支持最多64个CPU的系统,如SUN公司的产品Enterprise 10000。SMP系统中最关键的技术是如何更好地解决多个处理器的相互通讯和协调问题。


SMP组建条件

要组建SMP系统,首先最关键的一点就是需要合适的CPU相配合。我们平时看到的CPU都是单颗使用,所以看不出来它们有什么区别,但是,实际上,支持SMP功能并不是没有条件的,随意拿几块CPU来就可以建立多处理系统那简直是天方夜谈。
要实现SMP功能,我们使用的CPU必须具备以下要求:

1、CPU内部必须内置APIC(Advanced Programmable Interrupt Controllers)单元。Intel 多处理规范的核心就是高级可编程中断控制器(Advanced Programmable Interrupt Controllers--APICs)的使用。CPU通过彼此发送中断来完成它们之
间的通信。通过给中断附加动作(actions),不同的CPU可以在某种程度上彼此进行控制。每个CPU有自己的APIC(成为那个CPU的本地APIC),并且还有一个I/O APIC来处理由I/O设备引起的中断,这个I/O APIC是安装在主板上的,但每个CPU上
 的APIC则不可或缺,否则将无法处理多CPU之间的中断协调。

2、相同的产品型号,同样类型的CPU核心。例如,虽然至强和皓龙各自都内置有APIC单元,想要让它们一起建立SMP系统是不可能的,同时,即使同属于至强系列或者皓龙系列的CPU核心,而且属于同一开发平台,也不能建立SMP系统--这是因为他
们的运行指令不完全相同,APIC中断协调差异也很大。

3、完全相同的运行频率。如果要建立双至强或双皓龙系统,必须两颗2.8GHz或者两颗3.0GHz处理器,不可以用一颗2.8GHz,另一颗3.0GHz来组建,否则系统将无法正常点亮。

4、尽可能保持相同的产品序列编号。即使是同样核心的相同频率处理器,由于生产批次不同也会造成不可思议的问题。两个生产批次的CPU作为双处理器运行的时候,有可能会发生一颗CPU负担过高,而另一颗负担很少的情况,无法发挥最大性能,
  更糟糕的是可能导致死机,因此,应该尽可能选择同一批生产的处理器来组建SMP系统。




以下讨论对于单CPU的调度问题。

回顾多道程序,同时把多个进程导入内存,使得一个进程在CPU中执行I/O时,一个进程用来填补CPU的时间。

通常进程都是在CPU区间和I/O区间之间转换。

CPU调度程序称为短期调度程序,从内存调度到CPU。

在内存中等待的就绪队列的节点是PCB。有许多不同的队列实现方法。

抢占调度和非抢占调度(协作):前者为一个进程还没结束之前就被夺取CPU的拥有权,而后者则要一个进程结束或等待I/O才给予其他进程CPU的拥有权。

虽然现代操作系统都是用抢占调度,但是对于同时访问一个数据来说就会有风险,比如一个进程在试图更新一个数据,但是另一个进程抢占,并且读取这个数据,使得数据不一致。这时就要用到进程同步的内容。lock

对于中断随时可能发生的情况,我们可以在执行某个代码段时,禁止中断。

分派程序用来把CPU的拥有权交给短期调度程序选定的进程。每次切换进程时都要使用。

分派延迟:分派程序所花的时间。

CPU调度需要考虑的因素:

1.CPU使用率。

2.吞吐量:单位时间完成进程的数量。

3.周转时间:进程提交到进程完成。即从磁盘等待进入内存+就绪队列等待时间+CPU执行时间+I/O执行时间。但是CPU调度算法只是里面的一块。

4.等待时间:在就绪队列等待的时间之和。

5.响应时间:用于交互系统。

CPU调度算法:     Gantt图考点求等待时间

此算法应用于内存就绪队列到CPU的过程。

1.FCFS 先到先服务

一旦选定进程,那么在结束之前就不能再切换到另一个进程。

2.SJF 最短优先  精确的讲是最短下一个CPU区间的算法

前面提到,一个进程是由CPU区间和I/O区间交替组成的。而SJF是看哪个进程的CPU区间最短。

(1)SRTF抢占式:又称最短剩余优先,当新进来的进程的CPU区间比当前执行的进程所剩的CPU区间短,则抢占。

(2)非抢占:称为下一个最短优先,因为在就绪队列中选择最短CPU区间的进程放在队头。

SJF用于长期调度而不能用短期调度,因为进程是一个整体,CPU没法知道进程中第一个CPU区间长度。

SJF需要确定下一个CPU区间的时间长度,可以通过近似估算出下一个CPU区间的长度,比如tn+1=atn+(1-a)rn  tn为最近最近一次的CPU时间,rn为历史记录。a是给定的权重。

3.优先级调度算法  pintos的优先级是0-63  0为最低优先级,63为最高优先级

SJF是特殊的优先级调度算法,以CPU区间长度的倒数为优先级。

(1)内部优先级:通过内部数据比如内存要求等。

(2)外部优先级:用户自己设定。set_priority

分为抢占式和非抢占式,前者为如果进来的进程优先级高于运行的进程,则替换;后者只是在就绪队列中按优先级排队。

缺点:无线阻塞或饥饿。前者为一个优先级高且运行时间长的进程一直阻塞,后者为优先级低的进程永远都得不到执行。

解决饥饿的方法是老化。通过每个时间间隔后将等待的进程优先级降低。

4.转轮法 RR算法 抢占式

用于分时系统。每个进程都占用一个时间片的时间。就绪队列为FIFO循环队列。如果一个进程的CPU区间长度小于时间片,则继续下面的进程;如果大于时间片,则中断切换到下一个进程执行。

通常时间片长度为10ms-100ms,由此需要确定时间片大小使得上下文切换次数适当少。

5.多级队列调度

根据某种性质将一个就绪队列分成不同的独立队列,如系统进程,交互进程(前台进程),交互编辑进程,批处理进程,学生进程。

每个队列都有不同的调度算法。

每个队列都有优先级,比如前台队列就比后台队列要有绝对的优先级,因此队列间的分配方法:

(1)只有优先级高的队列为空,才能执行低优先级队列。

(2)为队列分配不同权重的CPU时间,优先级高的分配时间多。

6.多级反馈队列   抢占式

动态调整进程,进程在不同队列之间移动,虽然在队列间移动需要耗费资源,但是更合理。

按照CPU区间的大小分队列。

进程之间的划分是按照所花CPU时间划分,比如队列0是就绪队列,且规定一个时间上界,如果一个进程没能规定时间完成,则被放入队列1中。CPU区间越大的进程就被放入低优先级中。每个进程一开始都进入就绪队列。

多级反馈队列的参数:

1.队列的数量。

2.每个队列的调度算法。

3.怎样升级到优先级更高的队列。

4.确定怎样降级到优先级更低的队列。

5.进程需要确定进入哪个队列。

接下来讲多个CPU的负载均衡问题。

假设多个CPU是同构的,但是可能也会有特殊的限制比如只有某个CPU与I/O设备连接。

(1)非对称多处理:一个处理器专门用于CPU调度决定等,其他用于执行用户代码。

(2)对称多处理(SMP):为每个处理器自我调度,可能会造成多个处理器同时访问同一个数据结构则会造成冲突。

处理器亲和性:一个进程只需要在一个处理器上执行即可,不会转到另一个处理器上执行,因为如果转移的话,处理器缓存的资源全部无效,浪费。缓存存储的是进程的连续访问的数据。

软亲和性:占时的不会转移。

硬亲和性:操作系统不允许进程在多处理器间游走。

负载平衡条件:每个处理器都有私有的就绪队列。

负载平衡方法:push和pull。即从负载高的处理器push到低负载的处理器上,从负载低的处理器pull到负载高的处理器,但是这样就缺失了处理器亲和性。

一个物理处理器可以划分为逻辑处理器,SMT(对称多线程)使得在一个物理处理器上同时运行多个线程。

逻辑处理器对于物理处理器就像线程对进程。多个逻辑处理器共享物理处理器的资源,如缓存和总线。

举个例子,就像分区一样,硬盘分为C盘,D盘等,但事实上不是真的分硬盘。更理论的讲,像数据库的逻辑和物理关系。

系统调度的是内核线程,用户线程由线程库管理。如果线程要在CPU上运行,需要与某个内核线程相连。

用户线程需要连接到LWP(进程竞争范围PCS)。

内核线程连接到物理CPU(系统竞争范围SCS)。

linux采用抢占、优先级的调度算法,较高优先级的进程被分配较多的CPU时间片。每个处理器都维护一个运行队列。运行队列分为活动和到期的,前者是进程所耗时间小于时间片的,后者是所花时间大于时间片的任务。

当活动队列为空,则互换两队列。

调度算法的评估:

1.分析评估法。事先确定负荷和算法,即一些本来可以自己设定的数据,比如确定特定算法FCFS,确定进程到来的时间和数量;根据不同的模型来比较性能。缺点是只适用于特定的情况。

2.排队模型。数学公式以分析CPU和I/O的区间分布,给定进程到达系统的时间分布,排队网络分析。LITTLE公式:进入队列的进程和离开队列的进程要相等。

3.模拟。建模计算机系统,模拟程序,根据概率分布随机生成数据,不能对于前后事件进行预测。但是通过跟踪磁带来记录真实系统的运作,再来按照这种顺序来模拟即可。

4.实现。编程后放入操作系统,观测。