多处理器调度

多处理器调度

​ 多核处理器目前应用广泛,不再像以前一样是个奢侈品。这就带来了一个问题,就是多处理器如何进行调度呢。单个CPU对应多级硬件缓存系统,目的是未来让处理器更快的执行程序。缓存很小,但是快,内存比缓存大得多,但是速度相对来说小一点。

​ 程序第一次读取数据的时候,会到内存中读取。当处理器判断有可能会被再次利用的时候,就会把数据放在缓存中,之后只要使用同样的数据,直接到缓存中取就行了。缓存基于局部性概念,分为两种分别是时间局部性与空间局部性。时间局部性是指当一个数据被访问后,它很有可能会在不久的将来被再一访问,比如循 环代码中的数据或指令本身。空间局部性指的是,当程序访问地址为 x 的数据时,很 有可能会紧接着访问 x 周围的数据,比如遍历数组或指令的顺序执行。同时多处理器多个缓存对应一个内存问题就要变得非常复杂。
多CPU

​ 其中就有缓存一致性问题。缓存一致性问题指的是当一个内存中数据存在多个缓存中,由于某个缓存对数据进行修改,但是数据写回内存速度比较慢,导致各个缓存中数据不一致的问题。硬件提供两个方案一个是监控内存访问,一个是总线窥探(基于总线系统内)。

**缓存亲和度:**一个进程在某个 CPU 上运行时,会在该 CPU 的缓存中维护许多状态。下一 该进程在相同 CPU 上运行时,由于缓存中的数据而执行得更快。相反,在不同的 CPU 上执 行,会由于需要重新加载数据而很慢(好在硬件保证的缓存一致性可以保证正确执行)。


多处理器调度策略:

  • 单队列多处理机调度(Single Queue Multiprocessor Scheduling,SQMS)

​ 简单来说就是把调度任务都放到一个队列来,很简单同时不需要太多的修改,这样也有一个问题就是扩展性差。同时为了保证在多个CPU情况下运行正常,采取锁的机制,这就导致性能上要打折扣。假设有5个调度任务,分别是A、B、C、D、E。一段时间后,每个工作一次执行一个时间片,下面是可能的调度序列:

SQMS调度队列

​ 但是这里面有一个问题,就是每一个工作都在不同的CPU之间切换,这与缓存亲和问题背道而驰,一个好的做法是引入亲和度机制。尽可能的让进程在同一个CPU上跑,但是牺牲了其他工作的亲和度来实现的,如图。

优化后的SQMS调度队列

  • 多队列多处理机调度(Multi-Queue Multiprocessor Scheduling,MQMS)

​ 就是有多个队列,每个队列里面有不同的任务,比如队列0有任务A、C,队列1有任务B、D。调度结果可能如下:

多处理机调度队列

​ 但是也存在一个问题就是如果不同队列里面任务不同,这样就导致负载不均衡问题。比如说队列0里面一个任务都没有,而队列1里面有100个任务,这就导致出现一方面CPU空闲,另一方面CPU忙的状态。为了应对负载不均衡的问题,采取了一种策略叫做:迁移(migrantion),就是让工作跨CPU进行迁移。让那些任务多的队列可以占用部分空闲的队列的CPU资源。

​ 如何迁移也是一个问题一个基本方法是工作窃取(work stealing),指的是工作量较少的(源)队列不定期地“偷看”其他(目标)队列是不是比自己的工作多。如果目 标队列比源队列(显著地)更满,就从目标队列“窃取”一个或多个工作,实现负载均衡。

(显著地)更满,就从目标队列“窃取”一个或多个工作,实现负载均衡。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值