CN105224251A - 一种基于Linux的读写锁优化方法和系统 - Google Patents
一种基于Linux的读写锁优化方法和系统 Download PDFInfo
- Publication number
- CN105224251A CN105224251A CN201510629053.4A CN201510629053A CN105224251A CN 105224251 A CN105224251 A CN 105224251A CN 201510629053 A CN201510629053 A CN 201510629053A CN 105224251 A CN105224251 A CN 105224251A
- Authority
- CN
- China
- Prior art keywords
- read
- write
- waiting list
- lock application
- limit priority
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于Linux的读写锁优化方法和系统,包括:接收加读锁申请或加写锁申请并判断读写锁之前是否处于被申请状态。没有处于被申请状态时,直接处理加读锁申请或加写锁申请。处于被申请状态并且已经被占用时,将加读写锁申请加入预设的读写等待队列中,并更新rwlock结构体中记录的读最高优先级或写最高优先级。当被占用的读写锁被释放时,判断读写等待队列中是否已有加读写锁申请等待;根据判断结果和读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。通过本发明的方案,能够减少或者避免读者或者写者饿死的情况,提高了系统的资源利用率和系统并行处理性能。
Description
技术领域
本发明涉及操作系统设计领域,具体涉及一种基于Linux的读写锁优化方法和系统。
背景技术
在linux下有两种实现数据互斥的基本机制,包括了信号量(Semaphore)和自旋锁(Spinlock)。由于互斥的特点,使用自旋锁的代码毫无线程并发性可言,多处理器系统的性能受到限制。读写自旋锁(Reader-WriterSpinlock)将线程区分为读者和写者,多个读者可以被允许同时访问共享资源,共享资源在一个时间段内只能被一个写者访问,申请线程在等待期内依然使用忙等待方式。
Linux目前可以配置读写锁是读优先或写优先两种模式,默认读写锁是读优先的,如果有写者在等待锁,不会阻塞读者。如果配置为写优先,如果有写者在等待锁,所有的后续的读者加锁都会阻塞。但是当占有读者锁的读者数为0时,当有写者在等待时,会优先唤醒写者。但是这两种配置方式都会出现读者或者写者饿死的情况,当配置为读者优先时,会出现写者饿死的情况,而当配置为写者优先时,会出现读者饿死的情况。
发明内容
为了解决上述问题,本发明提出了一种基于Linux的读写锁优化方法和系统,能够减少或者避免读者或者写者饿死的情况,提高了系统的资源利用率和系统并行处理性能。
为了达到上述目的,本发明提出了一种基于Linux的加读写锁的优化方法,该方法包括:
接收加读锁申请或加写锁申请,并判断读写锁之前是否处于被申请状
态。
当判定读写锁没有处于被申请状态时,直接处理加读锁申请或加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作。
当读写锁处于被申请状态并且已经被占用时,将接收到的加读锁申请加入预设的读等待队列中,并更新rwlock结构体中记录的读等待队列中的读最高优先级;或者,将接收到的写读锁申请加入预设的写等待队列中,并更新rwlock结构体中记录的写等待队列中的写最高优先级。
当被占用的读写锁被释放时,判断读等待队列中是否已有加读锁申请等待以及写等待队列中是否已有加写锁申请等待;根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
优选地,
更新rwlock结构体中记录的读等待队列中的读最高优先级包括:
比较接收到的加读锁申请的优先级是否高于rwlock结构体中预记录的读等待队列中先前存在的加读锁申请的读最高优先级,当接收到的加读锁申请的优先级高于读等待队列中先前存在的加读锁申请的读最高优先级时,更新rwlock结构体中记录的读等待队列中的读最高优先级,或者,当读等待队列中仅有接收到的加读锁申请时,将接收到的加读锁申请的优先级作为读最高优先级并记录在rwlock结构体中。
优选地,
更新rwlock结构体中记录的写等待队列中的写最高优先级包括:
比较接收到的写读锁申请的优先级是否高于rwlock结构体中预记录的写等待队列中先前存在的加写锁申请的写最高优先级,当接收到的加写锁申请的优先级高于写等待队列中先前存在的加写锁申请的写最高优先级时,更新rwlock结构体中记录的写等待队列中的写最高优先级,或者,当写等待队列中仅有接收到的加写锁申请时,将接收到的加写锁申请的优先级作为写最高优先级并记录在rwlock结构体中。
优选地,根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请包括:
当判定读等待队列中已有加读锁申请等待并且写等待队列中已有加写锁申请等待时,比较rwlock结构体中记录的读最高优先级和写最高优先级;当读最高优先级高于写最高优先级时,优先处理加读锁申请;当写最高优先级高于读最高优先级时,优先处理加写锁申请。
当判定读等待队列中已有加读锁申请等待,写等待队列中没有加写锁申请等待时,直接处理读等待队列中的加读锁申请。
当判定写等待队列中已有加写锁申请等待,读等待队列中没有加读锁申请等待时,直接处理写等待队列中的加写锁申请。
优选地,该方法还包括:
在根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请之前,判断被释放的是读锁还是写锁。
当被释放的是读锁时,将记录的当前持有读锁的读者的个数减一,并判断减一之后持有读锁的读者的个数是否为零;当减一之后持有读锁的读者的个数为零时,根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的所述加写锁申请;当减一之后持有读锁的读者的个数不为零时,继续等待当前持有读锁的读者释放读锁。
当被释放的是写锁时,直接根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
为了达到上述目的,本发明还提出了一种基于Linux的加读写锁的优化系统,该系统包括:判断模块、处理模块和更新模块。
判断模块,用于接收加读锁申请或加写锁申请,并判断读写锁之前是否处于被申请状态。
处理模块,用于当判定读写锁没有处于被申请状态时,直接处理加读锁申请或加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作。
更新模块,用于当读写锁处于被申请状态并且已经被占用时,将接收到的加读锁申请加入预设的读等待队列中,并更新rwlock结构体中记录的读等待队列中的读最高优先级;或者,将接收到的写读锁申请加入预设的写等待队列中,并更新rwlock结构体中记录的写等待队列中的写最高优先级。
处理模块,还用于当被占用的读写锁被释放时,判断读等待队列中是否已有加读锁申请等待以及写等待队列中是否已有加写锁申请等待;根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
优选地,
更新模块更新rwlock结构体中记录的读等待队列中的读最高优先级包括:
比较接收到的加读锁申请的优先级是否高于rwlock结构体中预记录的读等待队列中先前存在的加读锁申请的读最高优先级,当接收到的加读锁申请的优先级高于读等待队列中先前存在的加读锁申请的读最高优先级时,更新rwlock结构体中记录的读等待队列中的读最高优先级,或者,当读等待队列中仅有接收到的加读锁申请时,将接收到的加读锁申请的优先级作为读最高优先级并记录在rwlock结构体中。
优选地,
更新模块更新rwlock结构体中记录的写等待队列中的写最高优先级包括:
比较接收到的写读锁申请的优先级是否高于rwlock结构体中预记录的写等待队列中先前存在的加写锁申请的写最高优先级,当接收到的加写锁申请的优先级高于写等待队列中先前存在的加写锁申请的写最高优先级时,更新rwlock结构体中记录的写等待队列中的写最高优先级,或者,当写等待队列中仅有接收到的加写锁申请时,将接收到的加写锁申请的优先级作为写最高优先级并记录在rwlock结构体中。
优选地,处理模块根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请包括:
当判定读等待队列中已有加读锁申请等待并且写等待队列中已有加写锁申请等待时,比较rwlock结构体中记录的读最高优先级和写最高优先级;当读最高优先级高于写最高优先级时,优先处理加读锁申请;当写最高优先级高于读最高优先级时,优先处理加写锁申请。
当判定读等待队列中已有加读锁申请等待,写等待队列中没有加写锁申请等待时,直接处理读等待队列中的加读锁申请。
当判定写等待队列中已有加写锁申请等待,读等待队列中没有加读锁申请等待时,直接处理写等待队列中的加写锁申请。
优选地,处理模块还用于:
在根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请之前,判断被释放的是读锁还是写锁。
当被释放的是读锁时,将记录的当前持有读锁的读者的个数减一,并判断减一之后持有读锁的读者的个数是否为零;当减一之后持有读锁的读者的个数为零时,根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请;当减一之后持有读锁的读者的个数不为零时,继续等待当前持有读锁的读者释放读锁。
当被释放的是写锁时,直接根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
与现有技术相比,本发明包括:接收加读锁申请或加写锁申请,并判断读写锁之前是否处于被申请状态。当判定读写锁没有处于被申请状态时,直接处理加读锁申请或加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作。当读写锁处于被申请状态并且已经被占用时,将接收到的加读锁申请加入预设的读等待队列中,并更新rwlock结构体中记录的读等待队列中的读最高优先级;或者,将接收到的写读锁申请加入预设的写等待队列中,并更新rwlock结构体中记录的写等待队列中的写最高优先级。当被占用的读写锁被释放时,判断读等待队列中是否已有加读锁申请等待以及写等待队列中是否已有加写锁申请等待;根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。通过本发明的方案,能够减少或者避免读者或者写者饿死的情况,提高了系统的资源利用率和系统并行处理性能。
附图说明
下面对本发明实施例中的附图进行说明,实施例中的附图是用于对本发明的进一步理解,与说明书一起用于解释本发明,并不构成对本发明保护范围的限制。
图1为本发明的基于Linux的加读写锁的优化方法流程图;
图2为本发明的基于Linux的加读写锁的优化系统组成框图。
具体实施方式
为了便于本领域技术人员的理解,下面结合附图对本发明作进一步的描述,并不能用来限制本发明的保护范围。
本文以Linux内核2.6.32为例,充分考虑了读者和写者的情况,提出了一个基于读者写者优先级的优化方法,尽量减少或者避免出现读者或者写者饿死的情况,提高系统的资源利用率和系统并行处理性能。
本发明中的读写自旋锁的优化包括三个部分:加读锁的优化、加写锁的优化和释放锁的优化,本文的优化方法对此三部分都进行了优化处理。本发明的设计思路是:基于读者和写者的优先级,利用rwlock结构体中的填充位pad1和pad2,分别用来记录读写等待队列中的最高优先级。然后在解锁的时候,判断如果读写等待队列都有的话,比较这两个的优先级。当读者请求一个读写锁的读锁时,若没有写者占有锁,或者堵塞的写者的优先级没有读者高,则读者获得锁。
具体地,为了达到上述目的,本发明提出了一种基于Linux的加读写锁的优化方法,如图1所示,该方法包括:
S101、接收加读锁申请或加写锁申请,并判断读写锁之前是否处于被申请状态。
S102、当判定读写锁没有处于被申请状态时,直接处理加读锁申请或加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作。
S103、当读写锁处于被申请状态并且已经被占用时,将接收到的加读锁申请加入预设的读等待队列中,并更新rwlock结构体中记录的读等待队列中的读最高优先级;或者,将接收到的写读锁申请加入预设的写等待队列中,并更新rwlock结构体中记录的写等待队列中的写最高优先级。
优选地,更新rwlock结构体中记录的读等待队列中的读最高优先级包括:
比较接收到的加读锁申请的优先级是否高于rwlock结构体中预记录的读等待队列中先前存在的加读锁申请的读最高优先级,当接收到的加读锁申请的优先级高于读等待队列中先前存在的加读锁申请的读最高优先级时,更新rwlock结构体中记录的读等待队列中的读最高优先级,或者,当读等待队列中仅有接收到的加读锁申请时,将接收到的加读锁申请的优先级作为读最高优先级并记录在rwlock结构体中。
优选地,更新rwlock结构体中记录的写等待队列中的写最高优先级包括:
比较接收到的写读锁申请的优先级是否高于rwlock结构体中预记录的写等待队列中先前存在的加写锁申请的写最高优先级,当接收到的加写锁申请的优先级高于写等待队列中先前存在的加写锁申请的写最高优先级时,更新rwlock结构体中记录的写等待队列中的写最高优先级,或者,当写等待队列中仅有接收到的加写锁申请时,将接收到的加写锁申请的优先级作为写最高优先级并记录在rwlock结构体中。
S104、当被占用的读写锁被释放时,判断读等待队列中是否已有加读锁申请等待以及写等待队列中是否已有加写锁申请等待;根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
优选地,根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请包括:
当判定读等待队列中已有加读锁申请等待并且写等待队列中已有加写锁申请等待时,比较rwlock结构体中记录的读最高优先级和写最高优先级;当读最高优先级高于写最高优先级时,优先处理加读锁申请;当写最高优先级高于读最高优先级时,优先处理加写锁申请。
在本发明实施例中,利用rwlock结构体中的填充位pad1和pad2,分别用来记录读等待队列中的读最高优先级以及写等待队列中的写最高优先级。这里比较rwlock结构体中记录的读最高优先级和写最高优先级,即比较pad1和pad2的值的大小,若pad1的值大于pad2的值,则唤醒读等待队列中的读者,否则唤醒写等待队列中的写者。
当判定读等待队列中已有加读锁申请等待,写等待队列中没有加写锁申请等待时,直接处理读等待队列中的加读锁申请。
当判定写等待队列中已有加写锁申请等待,读等待队列中没有加读锁申请等待时,直接处理写等待队列中的加写锁申请。
优选地,该方法还包括:
在根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请之前,判断被释放的是读锁还是写锁。
当被释放的是读锁时,将记录的当前持有读锁的读者的个数减一,并判断减一之后持有读锁的读者的个数是否为零;当减一之后持有读锁的读者的个数为零时,根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的所述加写锁申请;当减一之后持有读锁的读者的个数不为零时,继续等待当前持有读锁的读者释放读锁。
当被释放的是写锁时,直接根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
为了达到上述目的,本发明还提出了一种基于Linux的加读写锁的优化系统01,如图2所示,该系统包括:判断模块02、处理模块03和更新模块04。
判断模块02,用于接收加读锁申请或加写锁申请,并判断读写锁之前是否处于被申请状态。
处理模块03,用于当判定读写锁没有处于被申请状态时,直接处理加读锁申请或加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作。
更新模块04,用于当读写锁处于被申请状态并且已经被占用时,将接收到的加读锁申请加入预设的读等待队列中,并更新rwlock结构体中记录的读等待队列中的读最高优先级;或者,将接收到的写读锁申请加入预设的写等待队列中,并更新rwlock结构体中记录的写等待队列中的写最高优先级。
处理模块03,还用于当被占用的读写锁被释放时,判断读等待队列中是否已有加读锁申请等待以及写等待队列中是否已有加写锁申请等待;根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
优选地,
更新模块04更新rwlock结构体中记录的读等待队列中的读最高优先级包括:
比较接收到的加读锁申请的优先级是否高于rwlock结构体中预记录的读等待队列中先前存在的加读锁申请的读最高优先级,当接收到的加读锁申请的优先级高于读等待队列中先前存在的加读锁申请的读最高优先级时,更新rwlock结构体中记录的读等待队列中的读最高优先级,或者,当读等待队列中仅有接收到的加读锁申请时,将接收到的加读锁申请的优先级作为读最高优先级并记录在rwlock结构体中。
优选地,
更新模块04更新rwlock结构体中记录的写等待队列中的写最高优先级包括:
比较接收到的写读锁申请的优先级是否高于rwlock结构体中预记录的写等待队列中先前存在的加写锁申请的写最高优先级,当接收到的加写锁申请的优先级高于写等待队列中先前存在的加写锁申请的写最高优先级时,更新rwlock结构体中记录的写等待队列中的写最高优先级,或者,当写等待队列中仅有接收到的加写锁申请时,将接收到的加写锁申请的优先级作为写最高优先级并记录在rwlock结构体中。
优选地,处理模块03根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请包括:
当判定读等待队列中已有加读锁申请等待并且写等待队列中已有加写锁申请等待时,比较rwlock结构体中记录的读最高优先级和写最高优先级;当读最高优先级高于写最高优先级时,优先处理加读锁申请;当写最高优先级高于读最高优先级时,优先处理加写锁申请。
当判定读等待队列中已有加读锁申请等待,写等待队列中没有加写锁申请等待时,直接处理读等待队列中的加读锁申请。
当判定写等待队列中已有加写锁申请等待,读等待队列中没有加读锁申请等待时,直接处理写等待队列中的加写锁申请。
优选地,处理模块03还用于:
在根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请之前,判断被释放的是读锁还是写锁。
当被释放的是读锁时,将记录的当前持有读锁的读者的个数减一,并判断减一之后持有读锁的读者的个数是否为零;当减一之后持有读锁的读者的个数为零时,根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请;当减一之后持有读锁的读者的个数不为零时,继续等待当前持有读锁的读者释放读锁。
当被释放的是写锁时,直接根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。
与现有技术相比,本发明包括:接收加读锁申请或加写锁申请,并判断读写锁是否处于被申请状态。当判定读写锁没有处于被申请状态时,直接处理加读锁申请或加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作。当读写锁处于被申请状态并且已经被占用时,将接收到的加读锁申请加入预设的读等待队列中,并更新rwlock结构体中记录的读等待队列中的读最高优先级;或者,将接收到的写读锁申请加入预设的写等待队列中,并更新rwlock结构体中记录的写等待队列中的写最高优先级。当被占用的读写锁被释放时,判断读等待队列中是否已有加读锁申请等待以及写等待队列中是否已有加写锁申请等待;根据判断结果和rwlock结构体中记录的读最高优先级以及写最高优先级,处理读等待队列中的加读锁申请以及写等待队列中的加写锁申请。通过本发明的方案,能够减少或者避免读者或者写者饿死的情况,提高了系统的资源利用率和系统并行处理性能。
总之,本发明的有益效果是:通过基于读者、写者优先级的读写锁优化方法,减少了或者避免了出现读者或者写者饿死的情况,提高了系统的资源利用率和系统并行处理性能,同时不改变现有操作系统的数据结构,保持了操作系统应用的兼容性。
需要说明的是,以上所述的实施例仅是为了便于本领域的技术人员理解而已,并不用于限制本发明的保护范围,在不脱离本发明的发明构思的前提下,本领域技术人员对本发明所做出的任何显而易见的替换和改进等均在本发明的保护范围之内。
Claims (10)
1.一种基于Linux的读写锁优化方法,其特征在于,所述方法包括:
接收加读锁申请或加写锁申请,并判断读写锁之前是否处于被申请状态;
当判定所述读写锁没有处于被申请状态时,直接处理所述加读锁申请或所述加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作;
当所述读写锁处于被申请状态并且已经被占用时,将接收到的所述加读锁申请加入预设的读等待队列中,并更新所述rwlock结构体中记录的所述读等待队列中的读最高优先级;或者,将接收到的所述写读锁申请加入预设的写等待队列中,并更新所述rwlock结构体中记录的所述写等待队列中的写最高优先级;
当被占用的所述读写锁被释放时,判断所述读等待队列中是否已有加读锁申请等待以及所述写等待队列中是否已有加写锁申请等待;根据判断结果和所述rwlock结构体中记录的所述读最高优先级以及所述写最高优先级,处理所述读等待队列中的所述加读锁申请以及所述写等待队列中的所述加写锁申请。
2.如权利要求1所述的优化方法,其特征在于,
所述更新所述rwlock结构体中记录的所述读等待队列中的读最高优先级包括:
比较接收到的所述加读锁申请的优先级是否高于所述rwlock结构体中预记录的所述读等待队列中先前存在的加读锁申请的读最高优先级,当接收到的所述加读锁申请的优先级高于所述读等待队列中先前存在的加读锁申请的读最高优先级时,更新所述rwlock结构体中记录的所述读等待队列中的读最高优先级,或者,当所述读等待队列中仅有接收到的所述加读锁申请时,将接收到的所述加读锁申请的优先级作为所述读最高优先级并记录在所述rwlock结构体中。
3.如权利要求1所述的优化方法,其特征在于,
所述更新所述rwlock结构体中记录的所述写等待队列中的写最高优先级包括:
比较接收到的所述写读锁申请的优先级是否高于所述rwlock结构体中预记录的所述写等待队列中先前存在的加写锁申请的写最高优先级,当接收到的所述加写锁申请的优先级高于所述写等待队列中先前存在的加写锁申请的写最高优先级时,更新所述rwlock结构体中记录的所述写等待队列中的写最高优先级,或者,当所述写等待队列中仅有接收到的所述加写锁申请时,将接收到的所述加写锁申请的优先级作为所述写最高优先级并记录在所述rwlock结构体中。
4.如权利要求1所述的优化方法,其特征在于,所述根据判断结果和所述rwlock结构体中记录的所述读最高优先级以及所述写最高优先级,处理所述读等待队列中的所述加读锁申请以及所述写等待队列中的所述加写锁申请包括:
当判定所述读等待队列中已有所述加读锁申请等待并且所述写等待队列中已有所述加写锁申请等待时,比较所述rwlock结构体中记录的所述读最高优先级和所述写最高优先级;当所述读最高优先级高于所述写最高优先级时,优先处理所述加读锁申请;当所述写最高优先级高于所述读最高优先级时,优先处理所述加写锁申请;
当判定所述读等待队列中已有所述加读锁申请等待,所述写等待队列中没有所述加写锁申请等待时,直接处理所述读等待队列中的所述加读锁申请;
当判定所述写等待队列中已有所述加写锁申请等待,所述读等待队列中没有所述加读锁申请等待时,直接处理所述写等待队列中的所述加写锁申请。
5.如权利要求1所述的优化方法,其特征在于,所述方法还包括:
在根据所述判断结果和所述rwlock结构体中记录的所述读最高优先级以及所述写最高优先级,处理所述读等待队列中的所述加读锁申请以及所述写等待队列中的所述加写锁申请之前,判断被释放的是读锁还是写锁;
当被释放的是读锁时,将记录的当前持有所述读锁的读者的个数减一,并判断减一之后持有所述读锁的读者的个数是否为零;当减一之后持有所述读锁的读者的个数为零时,根据所述判断结果和所述rwlock结构体中记录的所述读最高优先级以及所述写最高优先级,处理所述读等待队列中的所述加读锁申请以及所述写等待队列中的所述加写锁申请;当减一之后持有所述读锁的读者的个数不为零时,继续等待当前持有所述读锁的读者释放所述读锁;
当被释放的是写锁时,直接根据所述判断结果和所述rwlock结构体中记录的所述读最高优先级以及所述写最高优先级,处理所述读等待队列中的所述加读锁申请以及所述写等待队列中的所述加写锁申请。
6.一种基于Linux的读写锁优化系统,其特征在于,所述系统包括:判断模块、处理模块和更新模块;
所述判断模块,用于接收加读锁申请或加写锁申请,并判断读写锁之前是否处于被申请状态;
所述处理模块,用于当判定所述读写锁没有处于被申请状态时,直接处理所述加读锁申请或所述加写锁申请,使读者获得读锁进入临界区操作或者使写者获得写锁进入临界区操作;
所述更新模块,用于当所述读写锁处于被申请状态并且已经被占用时,将接收到的所述加读锁申请加入预设的读等待队列中,并更新所述rwlock结构体中记录的所述读等待队列中的读最高优先级;或者,将接收到的所述写读锁申请加入预设的写等待队列中,并更新所述rwlock结构体中记录的所述写等待队列中的写最高优先级;
所述处理模块,还用于当被占用的所述读写锁被释放时,判断所述读等待队列中是否已有加读锁申请等待以及所述写等待队列中是否已有加写锁申请等待;根据判断结果和所述rwlock结构体中记录的所述读最高优先级以及所述写最高优先级,处理所述读等待队列中的所述加读锁申请以及所述写等待队列中的所述加写锁申请。
7.如权利要求6所述的优化系统,其特征在于,
所述更新模块更新所述rwlock结构体中记录的所述读等待队列中的读最高优先级包括:
比较接收到的所述加读锁申请的优先级是否高于所述rwlock结构体中预记录的所述读等待队列中先前存在的加读锁申请的读最高优先级,当接收到的所述加读锁申请的优先级高于所述读等待队列中先前存在的加读锁申请的读最高优先级时,更新所述rwlock结构体中记录的所述读等待队列中的读最高优先级,或者,当所述读等待队列中仅有接收到的所述加读锁申请时,将接收到的所述加读锁申请的优先级作为所述读最高优先级并记录在所述rwlock结构体中。
8.如权利要求6所述的优化系统,其特征在于,
所述更新模块更新所述rwlock结构体中记录的所述写等待队列中的写最高优先级包括:
比较接收到的所述写读锁申请的优先级是否高于所述rwlock结构体中预记录的所述写等待队列中先前存在的加写锁申请的写最高优先级,当接收到的所述加写锁申请的优先级高于所述写等待队列中先前存在的加写锁申请的写最高优先级时,更新所述rwlock结构体中记录的所述写等待队列中的写最高优先级,或者,当所述写等待队列中仅有接收到的所述加写锁申请时,将接收到的所述加写锁申请的优先级作为所述写最高优先级并记录在所述rwlock结构体中。
9.如权利要求6所述的优化系统,其特征在于,所述处理模块根据判断结果和所述rwlock结构体中记录的所述读最高优先级以及所述写最高优先级,处理所述读等待队列中的所述加读锁申请以及所述写等待队列中的所述加写锁申请包括:
当判定所述读等待队列中已有所述加读锁申请等待并且所述写等待队列中已有所述加写锁申请等待时,比较所述rwlock结构体中记录的所述读最高优先级和所述写最高优先级;当所述读最高优先级高于所述写最高优先级时,优先处理所述加读锁申请;当所述写最高优先级高于所述读最高优先级时,优先处理所述加写锁申请;
当判定所述读等待队列中已有所述加读锁申请等待,所述写等待队列中没有所述加写锁申请等待时,直接处理所述读等待队列中的所述加读锁申请;
当判定所述写等待队列中已有所述加写锁申请等待,所述读等待队列中没有所述加读锁申请等待时,直接处理所述写等待队列中的所述加写锁申请。
10.如权利要求6所述的优化系统,其特征在于,所述处理模块还用于:
在根据所述判断结果和所述rwlock结构体中记录的所述读最高优先级以及所述写最高优先级,处理所述读等待队列中的所述加读锁申请以及所述写等待队列中的所述加写锁申请之前,判断被释放的是读锁还是写锁;
当被释放的是读锁时,将记录的当前持有所述读锁的读者的个数减一,并判断减一之后持有所述读锁的读者的个数是否为零;当减一之后持有所述读锁的读者的个数为零时,根据所述判断结果和所述rwlock结构体中记录的所述读最高优先级以及所述写最高优先级,处理所述读等待队列中的所述加读锁申请以及所述写等待队列中的所述加写锁申请;当减一之后持有所述读锁的读者的个数不为零时,继续等待当前持有所述读锁的读者释放所述读锁;
当被释放的是写锁时,直接根据所述判断结果和所述rwlock结构体中记录的所述读最高优先级以及所述写最高优先级,处理所述读等待队列中的所述加读锁申请以及所述写等待队列中的所述加写锁申请。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510629053.4A CN105224251B (zh) | 2015-09-28 | 2015-09-28 | 一种基于Linux的读写锁优化方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510629053.4A CN105224251B (zh) | 2015-09-28 | 2015-09-28 | 一种基于Linux的读写锁优化方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105224251A true CN105224251A (zh) | 2016-01-06 |
CN105224251B CN105224251B (zh) | 2018-09-25 |
Family
ID=54993257
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510629053.4A Active CN105224251B (zh) | 2015-09-28 | 2015-09-28 | 一种基于Linux的读写锁优化方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105224251B (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107273214A (zh) * | 2017-06-30 | 2017-10-20 | 郑州云海信息技术有限公司 | 一种基于固态硬盘的多核控制器资源访问方法及其装置 |
CN107632794A (zh) * | 2017-10-20 | 2018-01-26 | 北京小米移动软件有限公司 | 读写锁控制方法及装置 |
CN109032522A (zh) * | 2018-07-25 | 2018-12-18 | 浪潮电子信息产业股份有限公司 | 固态硬盘的数据读取方法以及固态硬盘 |
CN109299046A (zh) * | 2018-08-30 | 2019-02-01 | 湖北工业大学 | 一种基于TCP WebSocket协议的协同编辑方法 |
WO2019052576A1 (zh) * | 2017-09-18 | 2019-03-21 | 惠州Tcl移动通信有限公司 | 一种基于同步锁的多线程处理方法、终端以及存储介质 |
CN109710644A (zh) * | 2018-12-26 | 2019-05-03 | 苏州思必驰信息科技有限公司 | 防止缓存穿透的方法和装置 |
CN110908968A (zh) * | 2019-11-14 | 2020-03-24 | 浪潮电子信息产业股份有限公司 | 一种文件锁解锁时避免惊群的方法、装置、设备及存储介质 |
CN111104412A (zh) * | 2018-10-25 | 2020-05-05 | 阿里巴巴集团控股有限公司 | 基于单线程的并发控制方法、装置和系统 |
CN111984379A (zh) * | 2020-07-14 | 2020-11-24 | 上海金仕达软件科技有限公司 | 读写事务控制方法、系统、终端设备及存储介质 |
CN111984428A (zh) * | 2020-07-20 | 2020-11-24 | 上海金仕达软件科技有限公司 | 一种资源访问时自旋锁的实现方法、装置及设备 |
CN113010325A (zh) * | 2021-03-16 | 2021-06-22 | 北京百度网讯科技有限公司 | 一种读写锁的实现方法、装置及电子设备 |
CN117539650A (zh) * | 2023-10-10 | 2024-02-09 | 本原数据(北京)信息技术有限公司 | 数据管理系统的去中心化记录锁管理方法以及相关设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1920780A (zh) * | 2006-08-15 | 2007-02-28 | 杭州华为三康技术有限公司 | 访问临界区的方法和系统 |
CN101187862A (zh) * | 2006-11-13 | 2008-05-28 | 英特尔公司 | 用于硬件锁定取消的临界区检测和预测机制 |
US20110099313A1 (en) * | 2009-10-25 | 2011-04-28 | Sony Ericsson Mobile Communications Ab | System and method for controlling interruption of a process in electronic equipment based on priority of the process, and program |
CN102662747A (zh) * | 2012-04-23 | 2012-09-12 | 深圳市融创天下科技股份有限公司 | 一种线程访问临界区的方法、系统和终端设备 |
US8495642B2 (en) * | 2008-04-23 | 2013-07-23 | Red Hat, Inc. | Mechanism for priority inheritance for read/write locks |
-
2015
- 2015-09-28 CN CN201510629053.4A patent/CN105224251B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1920780A (zh) * | 2006-08-15 | 2007-02-28 | 杭州华为三康技术有限公司 | 访问临界区的方法和系统 |
CN101187862A (zh) * | 2006-11-13 | 2008-05-28 | 英特尔公司 | 用于硬件锁定取消的临界区检测和预测机制 |
US8495642B2 (en) * | 2008-04-23 | 2013-07-23 | Red Hat, Inc. | Mechanism for priority inheritance for read/write locks |
US20110099313A1 (en) * | 2009-10-25 | 2011-04-28 | Sony Ericsson Mobile Communications Ab | System and method for controlling interruption of a process in electronic equipment based on priority of the process, and program |
CN102662747A (zh) * | 2012-04-23 | 2012-09-12 | 深圳市融创天下科技股份有限公司 | 一种线程访问临界区的方法、系统和终端设备 |
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107273214A (zh) * | 2017-06-30 | 2017-10-20 | 郑州云海信息技术有限公司 | 一种基于固态硬盘的多核控制器资源访问方法及其装置 |
WO2019052576A1 (zh) * | 2017-09-18 | 2019-03-21 | 惠州Tcl移动通信有限公司 | 一种基于同步锁的多线程处理方法、终端以及存储介质 |
CN107632794A (zh) * | 2017-10-20 | 2018-01-26 | 北京小米移动软件有限公司 | 读写锁控制方法及装置 |
CN109032522B (zh) * | 2018-07-25 | 2021-06-29 | 浪潮电子信息产业股份有限公司 | 固态硬盘的数据读取方法以及固态硬盘 |
CN109032522A (zh) * | 2018-07-25 | 2018-12-18 | 浪潮电子信息产业股份有限公司 | 固态硬盘的数据读取方法以及固态硬盘 |
CN109299046A (zh) * | 2018-08-30 | 2019-02-01 | 湖北工业大学 | 一种基于TCP WebSocket协议的协同编辑方法 |
CN109299046B (zh) * | 2018-08-30 | 2023-08-15 | 湖北工业大学 | 一种基于TCP WebSocket协议的协同编辑方法 |
CN111104412A (zh) * | 2018-10-25 | 2020-05-05 | 阿里巴巴集团控股有限公司 | 基于单线程的并发控制方法、装置和系统 |
CN111104412B (zh) * | 2018-10-25 | 2023-05-30 | 阿里巴巴集团控股有限公司 | 基于单线程的并发控制方法、装置和系统 |
CN109710644A (zh) * | 2018-12-26 | 2019-05-03 | 苏州思必驰信息科技有限公司 | 防止缓存穿透的方法和装置 |
CN110908968B (zh) * | 2019-11-14 | 2022-05-27 | 浪潮电子信息产业股份有限公司 | 一种文件锁解锁时避免惊群的方法、装置、设备及存储介质 |
CN110908968A (zh) * | 2019-11-14 | 2020-03-24 | 浪潮电子信息产业股份有限公司 | 一种文件锁解锁时避免惊群的方法、装置、设备及存储介质 |
CN111984379A (zh) * | 2020-07-14 | 2020-11-24 | 上海金仕达软件科技有限公司 | 读写事务控制方法、系统、终端设备及存储介质 |
CN111984428A (zh) * | 2020-07-20 | 2020-11-24 | 上海金仕达软件科技有限公司 | 一种资源访问时自旋锁的实现方法、装置及设备 |
CN113010325A (zh) * | 2021-03-16 | 2021-06-22 | 北京百度网讯科技有限公司 | 一种读写锁的实现方法、装置及电子设备 |
CN113010325B (zh) * | 2021-03-16 | 2023-07-25 | 北京百度网讯科技有限公司 | 一种读写锁的实现方法、装置及电子设备 |
CN117539650A (zh) * | 2023-10-10 | 2024-02-09 | 本原数据(北京)信息技术有限公司 | 数据管理系统的去中心化记录锁管理方法以及相关设备 |
Also Published As
Publication number | Publication date |
---|---|
CN105224251B (zh) | 2018-09-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105224251A (zh) | 一种基于Linux的读写锁优化方法和系统 | |
CN104572568B (zh) | 读锁操作方法、写锁操作方法及系统 | |
US9069790B2 (en) | Multi-threaded message passing journal | |
KR101970390B1 (ko) | 2진 변환 기반 프로세서들에 의한 록 생략 | |
US8713262B2 (en) | Managing a spinlock indicative of exclusive access to a system resource | |
CN110597640A (zh) | 进程间的数据传输方法、装置、终端及计算机存储介质 | |
US11442871B2 (en) | Supporting concurrent remove operations and add-to-front operations on a Least Recently Used (LRU) queue | |
US9411603B2 (en) | Chip and starting method thereof | |
US9747114B2 (en) | Information processing apparatus, boot up method, and computer-readable storage medium storing boot up program | |
US20130145372A1 (en) | Embedded systems and methods for threads and buffer management thereof | |
CN112559210A (zh) | 一种基于rtx实时系统的共享资源读写互斥方法 | |
DE112012006743T5 (de) | Verbinden und integrieren von Vorrichtungen unterschiedlicher Verarbeitungssysteme | |
CN110993014B (zh) | Ssd处于空闲状态下的行为测试方法、装置、计算机设备及存储介质 | |
CN110309224B (zh) | 一种数据复制方法及装置 | |
US10691486B2 (en) | Processor comprising a plurality of computation cores | |
CN109634826A (zh) | 控制器极限性能分析方法、装置、计算机设备及存储介质 | |
CN112346879B (zh) | 进程管理方法、装置、计算机设备及存储介质 | |
CN111930527B (zh) | 一种多核异构平台维护cache一致性的方法 | |
CN105264494B (zh) | 鉴权处理装置和方法 | |
KR102123616B1 (ko) | 충돌 페이지 리스트를 이용한 병렬 저널링 방법 및 그 장치 | |
US8868845B1 (en) | Dynamic single/multi-reader, single-writer spinlocks | |
CN106407132B (zh) | 一种基于共享存储器的数据通信同步方法 | |
CN114328345B (zh) | 控制信息的处理方法、装置以及计算机可读存储介质 | |
CN105844151B (zh) | 一种文件存储保护实现方法和系统 | |
CN109542632A (zh) | 一种处理访问请求的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |