,根據(jù)判斷結(jié)果和rwlock結(jié)構(gòu)體中記錄的讀最高優(yōu)先級以及寫最高優(yōu)先級,處理讀等待隊(duì)列中的加讀鎖申請以及寫等待隊(duì)列中的所述加寫鎖申請;當(dāng)減一之后持有讀鎖的讀者的個(gè)數(shù)不為零時(shí),繼續(xù)等待當(dāng)前持有讀鎖的讀者釋放讀鎖。
[0068]當(dāng)被釋放的是寫鎖時(shí),直接根據(jù)判斷結(jié)果和rwlock結(jié)構(gòu)體中記錄的讀最高優(yōu)先級以及寫最高優(yōu)先級,處理讀等待隊(duì)列中的加讀鎖申請以及寫等待隊(duì)列中的加寫鎖申請。
[0069]為了達(dá)到上述目的,本發(fā)明還提出了一種基于Linux的加讀寫鎖的優(yōu)化系統(tǒng)01,如圖2所示,該系統(tǒng)包括:判斷模塊02、處理模塊03和更新模塊04。
[0070]判斷模塊02,用于接收加讀鎖申請或加寫鎖申請,并判斷讀寫鎖之前是否處于被申請狀態(tài)。
[0071]處理模塊03,用于當(dāng)判定讀寫鎖沒有處于被申請狀態(tài)時(shí),直接處理加讀鎖申請或加寫鎖申請,使讀者獲得讀鎖進(jìn)入臨界區(qū)操作或者使寫者獲得寫鎖進(jìn)入臨界區(qū)操作。
[0072]更新模塊04,用于當(dāng)讀寫鎖處于被申請狀態(tài)并且已經(jīng)被占用時(shí),將接收到的加讀鎖申請加入預(yù)設(shè)的讀等待隊(duì)列中,并更新rwlock結(jié)構(gòu)體中記錄的讀等待隊(duì)列中的讀最高優(yōu)先級;或者,將接收到的寫讀鎖申請加入預(yù)設(shè)的寫等待隊(duì)列中,并更新rwlock結(jié)構(gòu)體中記錄的寫等待隊(duì)列中的寫最高優(yōu)先級。
[0073]處理模塊03,還用于當(dāng)被占用的讀寫鎖被釋放時(shí),判斷讀等待隊(duì)列中是否已有加讀鎖申請等待以及寫等待隊(duì)列中是否已有加寫鎖申請等待;根據(jù)判斷結(jié)果和rwlock結(jié)構(gòu)體中記錄的讀最高優(yōu)先級以及寫最高優(yōu)先級,處理讀等待隊(duì)列中的加讀鎖申請以及寫等待隊(duì)列中的加寫鎖申請。
[0074]優(yōu)選地,
[0075]更新模塊04更新rwlock結(jié)構(gòu)體中記錄的讀等待隊(duì)列中的讀最高優(yōu)先級包括:
[0076]比較接收到的加讀鎖申請的優(yōu)先級是否高于rwlock結(jié)構(gòu)體中預(yù)記錄的讀等待隊(duì)列中先前存在的加讀鎖申請的讀最高優(yōu)先級,當(dāng)接收到的加讀鎖申請的優(yōu)先級高于讀等待隊(duì)列中先前存在的加讀鎖申請的讀最高優(yōu)先級時(shí),更新rwlock結(jié)構(gòu)體中記錄的讀等待隊(duì)列中的讀最高優(yōu)先級,或者,當(dāng)讀等待隊(duì)列中僅有接收到的加讀鎖申請時(shí),將接收到的加讀鎖申請的優(yōu)先級作為讀最高優(yōu)先級并記錄在rwlock結(jié)構(gòu)體中。
[0077]優(yōu)選地,
[0078]更新模塊04更新rwlock結(jié)構(gòu)體中記錄的寫等待隊(duì)列中的寫最高優(yōu)先級包括:
[0079]比較接收到的寫讀鎖申請的優(yōu)先級是否高于rwlock結(jié)構(gòu)體中預(yù)記錄的寫等待隊(duì)列中先前存在的加寫鎖申請的寫最高優(yōu)先級,當(dāng)接收到的加寫鎖申請的優(yōu)先級高于寫等待隊(duì)列中先前存在的加寫鎖申請的寫最高優(yōu)先級時(shí),更新rwlock結(jié)構(gòu)體中記錄的寫等待隊(duì)列中的與最尚優(yōu)先級,或者,當(dāng)與等待隊(duì)列中僅有接收到的加與鎖申請時(shí),將接收到的加與鎖申請的優(yōu)先級作為寫最高優(yōu)先級并記錄在rwlock結(jié)構(gòu)體中。
[0080]優(yōu)選地,處理模塊03根據(jù)判斷結(jié)果和rwlock結(jié)構(gòu)體中記錄的讀最高優(yōu)先級以及寫最高優(yōu)先級,處理讀等待隊(duì)列中的加讀鎖申請以及寫等待隊(duì)列中的加寫鎖申請包括:
[0081]當(dāng)判定讀等待隊(duì)列中已有加讀鎖申請等待并且寫等待隊(duì)列中已有加寫鎖申請等待時(shí),比較rwlock結(jié)構(gòu)體中記錄的讀最高優(yōu)先級和寫最高優(yōu)先級;當(dāng)讀最高優(yōu)先級高于寫最尚優(yōu)先級時(shí),優(yōu)先處理加讀鎖申請;當(dāng)與最尚優(yōu)先級尚于讀最尚優(yōu)先級時(shí),優(yōu)先處理加與鎖申請。
[0082]當(dāng)判定讀等待隊(duì)列中已有加讀鎖申請等待,寫等待隊(duì)列中沒有加寫鎖申請等待時(shí),直接處理讀等待隊(duì)列中的加讀鎖申請。
[0083]當(dāng)判定寫等待隊(duì)列中已有加寫鎖申請等待,讀等待隊(duì)列中沒有加讀鎖申請等待時(shí),直接處理寫等待隊(duì)列中的加寫鎖申請。
[0084]優(yōu)選地,處理模塊03還用于:
[0085]在根據(jù)判斷結(jié)果和rwlock結(jié)構(gòu)體中記錄的讀最高優(yōu)先級以及寫最高優(yōu)先級,處理讀等待隊(duì)列中的加讀鎖申請以及寫等待隊(duì)列中的加寫鎖申請之前,判斷被釋放的是讀鎖還是寫鎖。
[0086]當(dāng)被釋放的是讀鎖時(shí),將記錄的當(dāng)前持有讀鎖的讀者的個(gè)數(shù)減一,并判斷減一之后持有讀鎖的讀者的個(gè)數(shù)是否為零;當(dāng)減一之后持有讀鎖的讀者的個(gè)數(shù)為零時(shí),根據(jù)判斷結(jié)果和rwlock結(jié)構(gòu)體中記錄的讀最高優(yōu)先級以及寫最高優(yōu)先級,處理讀等待隊(duì)列中的加讀鎖申請以及寫等待隊(duì)列中的加寫鎖申請;當(dāng)減一之后持有讀鎖的讀者的個(gè)數(shù)不為零時(shí),繼續(xù)等待當(dāng)前持有讀鎖的讀者釋放讀鎖。
[0087]當(dāng)被釋放的是寫鎖時(shí),直接根據(jù)判斷結(jié)果和rwlock結(jié)構(gòu)體中記錄的讀最高優(yōu)先級以及寫最高優(yōu)先級,處理讀等待隊(duì)列中的加讀鎖申請以及寫等待隊(duì)列中的加寫鎖申請。
[0088]與現(xiàn)有技術(shù)相比,本發(fā)明包括:接收加讀鎖申請或加寫鎖申請,并判斷讀寫鎖是否處于被申請狀態(tài)。當(dāng)判定讀寫鎖沒有處于被申請狀態(tài)時(shí),直接處理加讀鎖申請或加寫鎖申請,使讀者獲得讀鎖進(jìn)入臨界區(qū)操作或者使寫者獲得寫鎖進(jìn)入臨界區(qū)操作。當(dāng)讀寫鎖處于被申請狀態(tài)并且已經(jīng)被占用時(shí),將接收到的加讀鎖申請加入預(yù)設(shè)的讀等待隊(duì)列中,并更新rwlock結(jié)構(gòu)體中記錄的讀等待隊(duì)列中的讀最高優(yōu)先級;或者,將接收到的寫讀鎖申請加入預(yù)設(shè)的寫等待隊(duì)列中,并更新rwlock結(jié)構(gòu)體中記錄的寫等待隊(duì)列中的寫最高優(yōu)先級。當(dāng)被占用的讀寫鎖被釋放時(shí),判斷讀等待隊(duì)列中是否已有加讀鎖申請等待以及寫等待隊(duì)列中是否已有加寫鎖申請等待;根據(jù)判斷結(jié)果和rwlock結(jié)構(gòu)體中記錄的讀最高優(yōu)先級以及寫最高優(yōu)先級,處理讀等待隊(duì)列中的加讀鎖申請以及寫等待隊(duì)列中的加寫鎖申請。通過本發(fā)明的方案,能夠減少或者避免讀者或者寫者餓死的情況,提高了系統(tǒng)的資源利用率和系統(tǒng)并行處理性能。
[0089]總之,本發(fā)明的有益效果是:通過基于讀者、寫者優(yōu)先級的讀寫鎖優(yōu)化方法,減少了或者避免了出現(xiàn)讀者或者寫者餓死的情況,提高了系統(tǒng)的資源利用率和系統(tǒng)并行處理性能,同時(shí)不改變現(xiàn)有操作系統(tǒng)的數(shù)據(jù)結(jié)構(gòu),保持了操作系統(tǒng)應(yīng)用的兼容性。
[0090]需要說明的是,以上所述的實(shí)施例僅是為了便于本領(lǐng)域的技術(shù)人員理解而已,并不用于限制本發(fā)明的保護(hù)范圍,在不脫離本發(fā)明的發(fā)明構(gòu)思的前提下,本領(lǐng)域技術(shù)人員對本發(fā)明所做出的任何顯而易見的替換和改進(jìn)等均在本發(fā)明的保護(hù)范圍之內(nèi)。
【主權(quán)項(xiàng)】
1.一種基于Linux的讀寫鎖優(yōu)化方法,其特征在于,所述方法包括: 接收加讀鎖申請或加寫鎖申請,并判斷讀寫鎖之前是否處于被申請狀態(tài); 當(dāng)判定所述讀寫鎖沒有處于被申請狀態(tài)時(shí),直接處理所述加讀鎖申請或所述加寫鎖申請,使讀者獲得讀鎖進(jìn)入臨界區(qū)操作或者使寫者獲得寫鎖進(jìn)入臨界區(qū)操作; 當(dāng)所述讀寫鎖處于被申請狀態(tài)并且已經(jīng)被占用時(shí),將接收到的所述加讀鎖申請加入預(yù)設(shè)的讀等待隊(duì)列中,并更新所述rwlock結(jié)構(gòu)體中記錄的所述讀等待隊(duì)列中的讀最高優(yōu)先級;或者,將接收到的所述寫讀鎖申請加入預(yù)設(shè)的寫等待隊(duì)列中,并更新所述rwlock結(jié)構(gòu)體中記錄的所述寫等待隊(duì)列中的寫最高優(yōu)先級; 當(dāng)被占用的所述讀寫鎖被釋放時(shí),判斷所述讀等待隊(duì)列中是否已有加讀鎖申請等待以及所述寫等待隊(duì)列中是否已有加寫鎖申請等待;根據(jù)判斷結(jié)果和所述rwlock結(jié)構(gòu)體中記錄的所述讀最高優(yōu)先級以及所述寫最高優(yōu)先級,處理所述讀等待隊(duì)列中的所述加讀鎖申請以及所述寫等待隊(duì)列中的所述加寫鎖申請。2.如權(quán)利要求1所述的優(yōu)化方法,其特征在于, 所述更新所述rwlock結(jié)構(gòu)體中記錄的所述讀等待隊(duì)列中的讀最高優(yōu)先級包括: 比較接收到的所述加讀鎖申請的優(yōu)先級是否高于所述rwlock結(jié)構(gòu)體中預(yù)記錄的所述讀等待隊(duì)列中先前存在的加讀鎖申請的讀最高優(yōu)先級,當(dāng)接收到的所述加讀鎖申請的優(yōu)先級高于所述讀等待隊(duì)列中先前存在的加讀鎖申請的讀最高優(yōu)先級時(shí),更新所述rwlock結(jié)構(gòu)體中記錄的所述讀等待隊(duì)列中的讀最高優(yōu)先級,或者,當(dāng)所述讀等待隊(duì)列中僅有接收到的所述加讀鎖申請時(shí),將接收到的所述加讀鎖申請的優(yōu)先級作為所述讀最高優(yōu)先級并記錄在所述rwlock結(jié)構(gòu)體中。3.如權(quán)利要求1所述的優(yōu)化方法,其特征在于, 所述更新所述rwl