Linux2.6内核对SMP系统支持研究.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux2.6内核对SMP系统支持研究

Linux2.6内核对SMP系统支持研究   摘要:首先简要介绍了SMP系统的体系结构,接着重点分析了SMP系统中进程调度、同步机制和负载平衡三个方面的实现细节,最后给出Cache一致性问题的解决方案。   关键词:同步机制;负载平衡      引言。SMP系统的并行处理技术,不仅提高处理器的运算能力和处理能力,而且对操作系统实时性改进也提供了一个新的途径。      1Linux内核对SMP系统的支持      2.6内核包含更好的SMP系统支持,关键在于能在可用CPU之间进行负载平衡,同时维持亲合性以提高缓存效率。对称多处理器系统中,每一个CPU都将维护一个自己的就绪队列,并且每个就绪队列都有一个自旋锁,这样允许所有的CPU都可以对任务进行调度,而不会与其他CPU产生竞争[1]。   1.1SMP系统的进程调度   2.6内核中就绪队列定义为复杂得多的数据结构struct runqueue,首先分析一下其结构中关于SMP系统的定义。   (1) prio_array_t *active, *expired, arrays[2]   runqueue中最关键的数据结构。每个CPU的就绪队列按时间片是否用完分为两部分,分别通过active指针和expired指针访问,前者指向时间片没用完、当前可被调度的就绪进程,后者指向时间片已用完的就绪进程。   (2)spinlock_t lock   就绪队列的自旋锁,只影响一个CPU上的就绪队列。   (3) unsigned long nr_uninterruptible   记录本CPU尚处于TASK_UNINTERRUPTIBLE状态的进程数,和负载信息有关。   (4) unsigned long timestamp_last_tick   本就绪队列最近一次发生调度事件的时间,在负载平衡的时候会用到。   还有几个数据项,这里不做介绍了。   我们先来总结一下调度器的结构,每个CPU都有一个运行队列,其中包含了140个优先级列表,它们是按照先进先出的顺序进行服务的。被调度执行的任务都会被添加到各自运行队列优先级列表的末尾。每个任务都有一个时间片,运行队列的前100个优先级列表保留给实时任务使用,后40个用于用户任务。除了CPU的运行队列之外,还有一个过期运行队列。当活动运行队列中的一个任务用光自己的时间片之后,它就被移动到过期运行队列中。在移动过程中,会对其时间片重新进行计算。如果活动运行队列中已经没有某个给定优先级的任务了,那么指向活动运行队列和过期运行队列的指针就会交换,这样就可以让过期优先级列表变成活动优先级的列表。   调度器的工作:在优先级最高的队列中选择一个任务来执行。为使这个过程的效率更高,内核使用了一个位图来定义给定优先级列表上何时存在任务。因此,在大部分体系架构上,会使用一条find-first-bit-set指令在5个32位的字中哪一位的优先级最高。查找一个任务来执行所需要的时间并不依赖于活动任务的个数,而是依赖于优先级的数量,这使得2.6内核的调度器复杂度为O(1)。   1.2 SMP系统中同步机制   只有在MP情况下存在真正的并行,因为线程是同时执行的,其中每个处理器中共享相同数据的线程同时执行。   自旋锁(spinlock)是使用忙等待锁来确保互斥锁的一种特殊方法。如果锁可用,则获取锁,执行互斥锁动作,然后释放锁。如果锁不可用,线程将忙等待该锁,直到其可用为止。在可抢占内核和SMP情况下对共享资源的同步问题,一般地一个任务对共享资源的访问是非常短暂的,如果两个任务竞争一个共享的资源时,没有得到资源的任务将自旋以等待另一个任务使用完该共享资源。与原子操作、信号量、读写、大内核锁、读写锁相比,这种锁机制也是非常高效的。   初始化自旋锁x是通过宏DEFINE_SPINLOCK(x)实现的,自旋锁在真正使用前必须先初始化,该宏用于动态初始化。自旋锁有完全锁和读写锁两种形式。在SMP系统中主要用的是完全锁,这种锁机制的过程:   首先通过一个简单的声明创建一个新的自旋锁。   spinlock_t my_spinlock = SPIN_LOCK_UNLOCKED;   …   DEFINE_SPINLOCK(my_spinlock);   …   spin_lock_init(my_spinlock);   定义了自旋锁之后,就可以使用大量的锁变量了。每个变量用于不同的上下文。spin_lock和spin_unlock变量。这是一个最简单的变量,它不会执行中断禁用,但是包含全部的内存壁垒。这个变量假定中断处理程序和该锁之间没有交互。   spin_lock(my_spinlock);

文档评论(0)

3471161553 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档