LINUX内核信号量设计与实现.pdfVIP

  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文档。上传文档
查看更多
LINUX内核信号量设计与实现

Generated by Foxit PDF Creator © Foxit Software For evaluation only. LINUX 内核信号量设计与实现 taoistf just for fun taoistf@ 2008/08/18 一 LINUX 内核信号量简介 为了同步对内核共享资源的访问,内核提供了down 函数和up 函数用于获取和释放 资源。down 和up 所保护的访问资源的内核代码区域,就构成一个临界区。在等待 获取资源进入临界区的过程中,代表进程运行的内核控制路径可以睡眠。 我们从 LINUX 内核信号量最直观的设计/实现出发,通过一步步改进,揭示在x86 平台上完整的信号量设计/实现,然后探讨在不同平台上通用的信号量设计/实现。 二 LINUX 内核信号量的初步设计与实现 1 数据结构 我们首先分析信号量semphore 应具备的数据结构。它需要一个计数count,表示能 进入临界区的进程个数。conut 一般初始化为1,表示信号量是互斥信号量,一次只 允许一个进程进入临界区。它也能被初始化为其他正值,表示可有多个进程同时进 入临界区。 当进程不能进入临界区时,它必须在信号量上睡眠,因此需要一个表示“等待队列头” 的字段wait 。在SMP 中,等待队列需要自旋锁来保护,因此wait 结构中应含有自 旋锁lock ,和指向等待队列链表的指针task_list 。而插入等待队列的“等待元素” ,其 字段中应含有指向进程结构的指针task ,及能够链入等待队列的指针task_list 。 Generated by Foxit PDF Creator © Foxit Software For evaluation only. 具体表示如下: struct wait_queue_t{ struct task_struct * task; struct list_head task_list; }; /* 等待元素结构 */ struct wait_queue_head_t{ spinlock_t lock; struct list_head task_list; }; /* 等待队列头结构 */ struct semphore{ int count; wait_queue_head_t wait; } /* 信号量结构 */ 2 算法 当进程需要获取信号量时,它调用down 函数进入临界区。down将semphore的count 字段减1,若count非负,则可进入临界区;否则,加入睡眠队列。当进程离开临界 区时,它调用up 函数。up将semphore 的count字段加1,若count非正,表示有进程睡 眠,则将进程从wait等待队列中移走并唤醒它。 这里有一个问题:当up 唤醒等待队列中睡眠进程时,是唤醒所有等待进程,还是只 唤醒一个?如果唤醒所有进程,它们醒来后,就会去竞争一个获得信号量的机会, 竞争失败的进程只能再度睡眠,这就使得系统有许多无谓的schedule切换,降低了系 统性能。所以,up 只唤醒一个进程。为了保持FIFO 的唤醒顺序,down会将新进程以 独占方式(表示唤醒时只唤醒一个)加在等待队列尾部,up则去唤醒等待队列头部 的第一个独占进程。 3 实现 由于信号量的实现效率与系统性能息息相关,为了达到高效的信号量实现,不同的 cpu系统根据各自特点,提供了不同版本。我们以x86平台为例,介绍信号量的实现 与优化。 我们要注意一点:由于x86 平台对原子指令有很好的支持,而并发的多个进程可能 Generated by Foxit PDF Creator © Foxit Software For evaluation only. 会同时修改或读取count 值,所以对cou

文档评论(0)

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

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

1亿VIP精品文档

相关文档