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

文档序号:9471091阅读:797来源:国知局
一种基于Linux的读写锁优化方法和系统的制作方法
【技术领域】
[0001]本发明涉及操作系统设计领域,具体涉及一种基于Linux的读写锁优化方法和系统。
【背景技术】
[0002]在Iinux下有两种实现数据互斥的基本机制,包括了信号量(Semaphore)和自旋锁(Spinlock)。由于互斥的特点,使用自旋锁的代码毫无线程并发性可言,多处理器系统的性能受到限制。读写自旋锁(Reader-Writer Spinlock)将线程区分为读者和写者,多个读者可以被允许同时访问共享资源,共享资源在一个时间段内只能被一个写者访问,申请线程在等待期内依然使用忙等待方式。
[0003]Linux目前可以配置读写锁是读优先或写优先两种模式,默认读写锁是读优先的,如果有写者在等待锁,不会阻塞读者。如果配置为写优先,如果有写者在等待锁,所有的后续的读者加锁都会阻塞。但是当占有读者锁的读者数为O时,当有写者在等待时,会优先唤醒写者。但是这两种配置方式都会出现读者或者写者饿死的情况,当配置为读者优先时,会出现写者饿死的情况,而当配置为写者优先时,会出现读者饿死的情况。

【发明内容】

[0004]为了解决上述问题,本发明提出了一种基于Linux的读写锁优化方法和系统,能够减少或者避免读者或者写者饿死的情况,提高了系统的资源利用率和系统并行处理性會K。
[0005]为了达到上述目的,本发明提出了一种基于Linux的加读写锁的优化方法,该方法包括:
[0006]接收加读锁申请或加写锁申请,并判断读写锁之前是否处于被申请状态。
[0007]
[0008]当判定读写锁没有处于被申请状态时,直接处理加读锁申请或加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作。
[0009]当读写锁处于被申请状态并且已经被占用时,将接收到的加读锁申请加入预设的读等待队列中,并更新rwlock结构体中记录的读等待队列中的读最高优先级;或者,将接收到的写读锁申请加入预设的写等待队列中,并更新rwlock结构体中记录的写等待队列中的与最尚优先级。
[0010]当被占用的读写锁被释放时,判断读等待队列中是否已有加读锁申请等待以及写等待队列中是否已有加写锁申请等待;根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
[0011]优选地,
[0012]更新rwlock结构体中记录的读等待队列中的读最高优先级包括:
[0013]比较接收到的加读锁申请的优先级是否高于rwlock结构体中预记录的读等待队列中先前存在的加读锁申请的读最高优先级,当接收到的加读锁申请的优先级高于读等待队列中先前存在的加读锁申请的读最高优先级时,更新rwlock结构体中记录的读等待队列中的读最高优先级,或者,当读等待队列中仅有接收到的加读锁申请时,将接收到的加读锁申请的优先级作为读最高优先级并记录在rwlock结构体中。
[0014]优选地,
[0015]更新rwlock结构体中记录的写等待队列中的写最高优先级包括:
[0016]比较接收到的写读锁申请的优先级是否高于rwlock结构体中预记录的写等待队列中先前存在的加写锁申请的写最高优先级,当接收到的加写锁申请的优先级高于写等待队列中先前存在的加写锁申请的写最高优先级时,更新rwlock结构体中记录的写等待队列中的与最尚优先级,或者,当与等待队列中仅有接收到的加与锁申请时,将接收到的加与锁申请的优先级作为写最高优先级并记录在rwlock结构体中。
[0017]优选地,根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请包括:
[0018]当判定读等待队列中已有加读锁申请等待并且写等待队列中已有加写锁申请等待时,比较rwlock结构体中记录的读最高优先级和写最高优先级;当读最高优先级高于写最尚优先级时,优先处理加读锁申请;当与最尚优先级尚于读最尚优先级时,优先处理加与锁申请。
[0019]当判定读等待队列中已有加读锁申请等待,写等待队列中没有加写锁申请等待时,直接处理读等待队列中的加读锁申请。
[0020]当判定写等待队列中已有加写锁申请等待,读等待队列中没有加读锁申请等待时,直接处理写等待队列中的加写锁申请。
[0021 ] 优选地,该方法还包括:
[0022]在根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请之前,判断被释放的是读锁还是写锁。
[0023]当被释放的是读锁时,将记录的当前持有读锁的读者的个数减一,并判断减一之后持有读锁的读者的个数是否为零;当减一之后持有读锁的读者的个数为零时,根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的所述加写锁申请;当减一之后持有读锁的读者的个数不为零时,继续等待当前持有读锁的读者释放读锁。
[0024]当被释放的是写锁时,直接根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
[0025]为了达到上述目的,本发明还提出了一种基于Linux的加读写锁的优化系统,该系统包括:判断模块、处理模块和更新模块。
[0026]判断模块,用于接收加读锁申请或加写锁申请,并判断读写锁之前是否处于被申请状态。
[0027]处理模块,用于当判定读写锁没有处于被申请状态时,直接处理加读锁申请或加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作。
[0028]更新模块,用于当读写锁处于被申请状态并且已经被占用时,将接收到的加读锁申请加入预设的读等待队列中,并更新rwlock结构体中记录的读等待队列中的读最高优先级;或者,将接收到的写读锁申请加入预设的写等待队列中,并更新rwlock结构体中记录的写等待队列中的写最高优先级。
[0029]处理模块,还用于当被占用的读写锁被释放时,判断读等待队列中是否已有加读锁申请等待以及写等待队列中是否已有加写锁申请等待;根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
[0030]优选地,
[0031]更新模块更新rwlock结构体中记录的读等待队列中的读最高优先级包括:
[0032]比较接收到的加读锁申请的优先级是否高于rwlock结构体中预记录的读等待队列中先前存在的加读锁申请的读最高优先级,当接收到的加读锁申请的优先级高于读等待队列中先前存在的加读锁申请的读最高优先级时,更新rwlock结构体中记录的读等待队列中的读最高优先级,或者,当读等待队列中仅有接收到的加读锁申请时,将接收到的加读锁申请的优先级作为读最高优先级并记录在rwlock结构体中。
[0033]优选地,
[0034]更新模块更新rwlock结构体中记录的写等待队列中的写最高优先级包括:
[0035]比较接收到的写读锁申请的优先级是否高于rwlock结构体中预记录的写等待队列中先前存在的加写锁申请的写最高优先级,当接收到的加写锁申请的优先级高于写等待队列中先前存在的加写锁申请的写最高优先级时,更新rwlock结构体中记录的写等待队列中的与最尚优先级,或者,当与等待队列中仅有接收到的加与锁申请时,将接收到的加与锁申请的优先级作为写最高优先级并记录在rwlock结构体中。
[0036]优选地,处理模块根据判断结果和rwlock结构体中记录的读最高
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1