d_read_lock_const中的原理类似,但有一点不同,就是一旦要试图取得写锁的时候,要先对wlock_waiting这个数行减1,如果得到就要加1,这是为了让同样的读的请求可以知道已经有写的请求在等待获得读写锁了。而这里应用了addl 与subl而不是incl 与decl是因为后两个指令只能保证在24个bits的情况下有效,而前两个指令可以对32个bits情况下有效,而采用先减再加的策略,而不是先加后减,是因为如果一减,那原来是0就变成了0xffffffff,这样所有的位都是1对于硬件的可靠性加强。而对于helper与前面的读者优先的读写锁是相同的。
上面只是给出了在修改读写锁使其是写优先的最主要的内容,其实如果真要实现必须修改十处以上,这里由于篇幅的关系,我把修改好的代码在提供在这里下载:
代码下载这里对linux内核中的读写锁进行了写者优先的修改,这种修改从代码的内容上看比读者优先要增加了进行的成本,特别是如果有一个写请求在临界区外面等待,那可能会有很多的读请求在__read_lock_failed_wlock_wait中进行空转。但如果考虑到写请求与读请求的发生概率可能是1:100甚至更小,而且对系统刷新要求的高标准。那么这一点的损失是值得的,尤其是对路由器,或是实时要求很高的信息发布平台上(如证券)就应该如果。这在代码上是"大巧若拙"。而如果把这个代码在一般的PC机平台上应用,可能这样只会是"弄巧成拙"了。从这当中看出开放源代码的精神之所在,让用户实现自己最佳的配置与功能。
1、 毛德超,胡希明 《linux内核源代码情景分析》(这里面的第四章的"进程与进程调度"中的semaphore 和lock的介绍)
2、汤凯 《linux内核配置系统浅析》(在以下这个网址,因为只有上面的代码方面的介绍还不足以编译出内核,我在代码中作出了相应的改变) http://www-900.ibm.com/developerWorks/cn/linux/kernel/l-kerconf/index.shtml
3、Abraham Silberschatz Peter Baer Galvin Greg Gagne编写的"Operating System Concepts" 中的 Module 6中关于Process Synchronization。
4、David MacKenzie, Paul Eggert, and Richard Stallman 所编写的 "Comparing and Merging Files" 这个文件的可以在下面的网站中得到 http://www.gnu.org/manual/diffutils-2.7/diff.html 这就是给内核打补丁的方法。
王瑞川,爱好linux与系统底层编程,希望与有志于此的爱好者一起探讨。电子邮箱地址 jeppeterone@163.com








