欢迎来到天天文库
浏览记录
ID:5299140
大小:816.28 KB
页数:24页
时间:2017-12-07
《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
此文档下载收益归作者所有