kernel内核锁 完全解析

kernel内核锁 完全解析

ID:5299140

大小:816.28 KB

页数:24页

时间:2017-12-07

kernel内核锁 完全解析_第1页
kernel内核锁 完全解析_第2页
kernel内核锁 完全解析_第3页
kernel内核锁 完全解析_第4页
kernel内核锁 完全解析_第5页
资源描述:

《kernel内核锁 完全解析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、KernelLocking中文版UnreliableGuideToLockingRustyRussell翻译:albcamusCopyright©2003RustyRussellThisdocumentationisfreesoftware;youcanredistributeitand/ormodifyitunderthetermsoftheGNUGeneralPublicLicenseaspublishedbytheFreeSoftwareFoundation;eitherve

2、rsion2oftheLicense,or(atyouroption)anylaterversion.Thisprogramisdistributedinthehopethatitwillbeuseful,butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyofMERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.SeetheGNUGeneralPublicLicenseformoredetails.YoushouldhavereceivedacopyoftheGNUGene

3、ralPublicLicensealongwiththisprogram;ifnot,writetotheFreeSoftwareFoundation,Inc.,59TemplePlace,Suite330,Boston,MA02111-1307USAFormoredetailsseethefileCOPYINGinthesourcedistributionofLinux.第1章.介绍欢迎进入Rusty优秀的《UnreliableGuidetoKernelLocking》细节。本文档描述了Linux2.6内核的锁系统。随着Linux内核引入了超线程与抢占,每一个

4、Hacking内核的人都应该了解并发性与为SMP加锁的基础知识。第2章.并发带来的问题(如果你已知道并发是什么,请略过本章).在一个普通的程序里,你可以这样为一个计数器增加计数:very_important_count++;下面是你期望的结果:Table2-1.期望的结果实例1实例2读very_important_count(5)加1(6)写回very_important_count(6)读very_important_count(6)加1(7)写回very_important_count(7)事情还可能这样发生:Table2-2.可能的结果实例1实例2读ver

5、y_important_count(5)读very_important_count(5)加1(6)加1(6)写回very_important_count(6)写回very_important_count(6)2.1.竞态条件与临界区这种情况,结果依赖于多个任务的相对执行顺序,叫做竞态条件。包含并发问题的代码,叫做临界区。尤其是Linux开始支持SMP机器以来,竞态条件和临界区就成为内核设计与实现的主要问题。抢占具有相同的影响,即使只有一个CPU也是这样的:抢占了正在临界区中执行的任务,我们就重现了上面描述的情况。在这种情况下,抢占了其他代码的线程必须在它的临界区

6、独自运行(排斥其它线程)。解决的方法是:认识到何时会发生同时访问,使用锁来保证在任意时刻只有一个实例能够进入临界区。在Linux内核中有很多友好的原语(primitives)来帮助你做到这点──也有不友好的原语,但我将当作它们并不存在。第3章.在Linux内核中加锁我多么希望能给你一句忠告:不要与比你更不理性的人同眠;而如果是关于锁的忠告,我会这样给出:保持简单。不要试图引入新类型的锁。真是够奇怪的,最后一条竟然恰恰与我的忠告相反──因为这时你已经与不理性的人同眠了,你需要考虑弄只看门狗。(译者案:Watchdog是一种以NMI方式检查CPU死锁的机制)3.1.

7、两种主要类型的锁:自旋锁与信号量内核中主要有两种类型的锁。最基本的类型是自旋锁(include/asm/spinlock.h),它只允许一个持有者;如果你获取自旋锁时不成功,你将一直在自旋中尝试获得它,直到成功。自旋锁又小又快,可以在任何地方使用。第二种类型是信号量(include/asm/spinlock.h),它可以在任何时刻被多个持有者同时持有(允许的持有者的数量是在信号量初试化时规定的),但是在通常情况下信号量只允许一个持有者(这时它也叫互斥锁,mutex)。如果你获取信号量时不成功,任务就会把自身放到一个队列中睡眠,一直到信号量被释放时才被唤醒。这意味

8、着在你等待的时候,CPU

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。