一种基于Linux的读写锁优化方法和系统的制作方法_2

文档序号:9471091阅读:来源:国知局
优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请包括:
[0037]当判定读等待队列中已有加读锁申请等待并且写等待队列中已有加写锁申请等待时,比较rwlock结构体中记录的读最高优先级和写最高优先级;当读最高优先级高于写最尚优先级时,优先处理加读锁申请;当与最尚优先级尚于读最尚优先级时,优先处理加与锁申请。
[0038]当判定读等待队列中已有加读锁申请等待,写等待队列中没有加写锁申请等待时,直接处理读等待队列中的加读锁申请。
[0039]当判定写等待队列中已有加写锁申请等待,读等待队列中没有加读锁申请等待时,直接处理写等待队列中的加写锁申请。
[0040]优选地,处理模块还用于:
[0041]在根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请之前,判断被释放的是读锁还是写锁。
[0042]当被释放的是读锁时,将记录的当前持有读锁的读者的个数减一,并判断减一之后持有读锁的读者的个数是否为零;当减一之后持有读锁的读者的个数为零时,根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请;当减一之后持有读锁的读者的个数不为零时,继续等待当前持有读锁的读者释放读锁。
[0043]当被释放的是写锁时,直接根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
[0044]与现有技术相比,本发明包括:接收加读锁申请或加写锁申请,并判断读写锁之前是否处于被申请状态。当判定读写锁没有处于被申请状态时,直接处理加读锁申请或加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作。当读写锁处于被申请状态并且已经被占用时,将接收到的加读锁申请加入预设的读等待队列中,并更新rwlock结构体中记录的读等待队列中的读最高优先级;或者,将接收到的写读锁申请加入预设的写等待队列中,并更新rwlock结构体中记录的写等待队列中的写最高优先级。当被占用的读写锁被释放时,判断读等待队列中是否已有加读锁申请等待以及写等待队列中是否已有加写锁申请等待;根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。通过本发明的方案,能够减少或者避免读者或者写者饿死的情况,提高了系统的资源利用率和系统并行处理性能。
【附图说明】
[0045]下面对本发明实施例中的附图进行说明,实施例中的附图是用于对本发明的进一步理解,与说明书一起用于解释本发明,并不构成对本发明保护范围的限制。
[0046]图1为本发明的基于Linux的加读写锁的优化方法流程图;
[0047]图2为本发明的基于Linux的加读写锁的优化系统组成框图。
【具体实施方式】
[0048]为了便于本领域技术人员的理解,下面结合附图对本发明作进一步的描述,并不能用来限制本发明的保护范围。
[0049]本文以Linux内核2.6.32为例,充分考虑了读者和写者的情况,提出了一个基于读者写者优先级的优化方法,尽量减少或者避免出现读者或者写者饿死的情况,提高系统的资源利用率和系统并行处理性能。
[0050]本发明中的读写自旋锁的优化包括三个部分:加读锁的优化、加写锁的优化和释放锁的优化,本文的优化方法对此三部分都进行了优化处理。本发明的设计思路是:基于读者和写者的优先级,利用rwlock结构体中的填充位padl和pad2,分别用来记录读写等待队列中的最高优先级。然后在解锁的时候,判断如果读写等待队列都有的话,比较这两个的优先级。当读者请求一个读写锁的读锁时,若没有写者占有锁,或者堵塞的写者的优先级没有读者高,则读者获得锁。
[0051]具体地,为了达到上述目的,本发明提出了一种基于Linux的加读写锁的优化方法,如图1所示,该方法包括:
[0052]SlOU接收加读锁申请或加写锁申请,并判断读写锁之前是否处于被申请状态。
[0053]S102、当判定读写锁没有处于被申请状态时,直接处理加读锁申请或加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作。
[0054]S103、当读写锁处于被申请状态并且已经被占用时,将接收到的加读锁申请加入预设的读等待队列中,并更新rwlock结构体中记录的读等待队列中的读最高优先级;或者,将接收到的写读锁申请加入预设的写等待队列中,并更新rwlock结构体中记录的写等待队列中的与最尚优先级。
[0055]优选地,更新rwlock结构体中记录的读等待队列中的读最高优先级包括:
[0056]比较接收到的加读锁申请的优先级是否高于rwlock结构体中预记录的读等待队列中先前存在的加读锁申请的读最高优先级,当接收到的加读锁申请的优先级高于读等待队列中先前存在的加读锁申请的读最高优先级时,更新rwlock结构体中记录的读等待队列中的读最高优先级,或者,当读等待队列中仅有接收到的加读锁申请时,将接收到的加读锁申请的优先级作为读最高优先级并记录在rwlock结构体中。
[0057]优选地,更新rwlock结构体中记录的写等待队列中的写最高优先级包括:
[0058]比较接收到的写读锁申请的优先级是否高于rwlock结构体中预记录的写等待队列中先前存在的加写锁申请的写最高优先级,当接收到的加写锁申请的优先级高于写等待队列中先前存在的加写锁申请的写最高优先级时,更新rwlock结构体中记录的写等待队列中的与最尚优先级,或者,当与等待队列中仅有接收到的加与锁申请时,将接收到的加与锁申请的优先级作为写最高优先级并记录在rwlock结构体中。
[0059]S104、当被占用的读写锁被释放时,判断读等待队列中是否已有加读锁申请等待以及写等待队列中是否已有加写锁申请等待;根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
[0060]优选地,根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请包括:
[0061]当判定读等待队列中已有加读锁申请等待并且写等待队列中已有加写锁申请等待时,比较rwlock结构体中记录的读最高优先级和写最高优先级;当读最高优先级高于写最尚优先级时,优先处理加读锁申请;当与最尚优先级尚于读最尚优先级时,优先处理加与锁申请。
[0062]在本发明实施例中,利用rwlock结构体中的填充位padl和pad2,分别用来记录读等待队列中的读最高优先级以及写等待队列中的写最高优先级。这里比较rwlock结构体中记录的读最高优先级和写最高优先级,即比较padl和pad2的值的大小,若padl的值大于pad2的值,则唤醒读等待队列中的读者,否则唤醒写等待队列中的写者。
[0063]当判定读等待队列中已有加读锁申请等待,写等待队列中没有加写锁申请等待时,直接处理读等待队列中的加读锁申请。
[0064]当判定写等待队列中已有加写锁申请等待,读等待队列中没有加读锁申请等待时,直接处理写等待队列中的加写锁申请。
[0065]优选地,该方法还包括:
[0066]在根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请之前,判断被释放的是读锁还是写锁。
[0067]当被释放的是读锁时,将记录的当前持有读锁的读者的个数减一,并判断减一之后持有读锁的读者的个数是否为零;当减一之后持有读锁的读者的个数为零时
当前第2页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1