本發(fā)明涉及互聯(lián)網(wǎng)協(xié)議存儲(chǔ)局域網(wǎng)絡(luò)(Internet Protocol Storage Area Network,IPSAN)技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)保護(hù)方法及裝置。
背景技術(shù):
隨著社會(huì)的發(fā)展和計(jì)算機(jī)的普及,網(wǎng)絡(luò)中的信息量呈爆炸性增長,存儲(chǔ)的網(wǎng)絡(luò)化成為IT技術(shù)的新亮點(diǎn)。存儲(chǔ)網(wǎng)絡(luò)的搭建,使得人們可以將海量的信息存儲(chǔ)到網(wǎng)絡(luò)端,便于共享。在用戶端,操作系統(tǒng)為用戶提供訪問協(xié)議棧的接口,保證用戶可以通過協(xié)議棧訪問工作隊(duì)列,進(jìn)行數(shù)據(jù)存儲(chǔ)與讀取。
在多核CPU硬件結(jié)構(gòu)中,如果要充分發(fā)揮處理器的計(jì)算能力,必須采用多線程執(zhí)行。在多線程編程中,當(dāng)用戶對(duì)工作隊(duì)列中的共享數(shù)據(jù)資源進(jìn)行操作時(shí),需要使用互斥鎖來對(duì)共享數(shù)據(jù)進(jìn)行保護(hù)。具體的,當(dāng)用戶對(duì)工作隊(duì)列的共享數(shù)據(jù)進(jìn)行訪問,例如執(zhí)行入隊(duì)或出隊(duì)操作時(shí),需要在操作的隊(duì)首和隊(duì)尾加互斥鎖從而對(duì)共享數(shù)據(jù)加以保護(hù)。需要說明的是,互斥操作的開銷是非常大的,而在現(xiàn)有技術(shù)中,對(duì)于臨界區(qū)(共享數(shù)據(jù)資源區(qū)域)的所有入隊(duì)操作,均添加互斥鎖,系統(tǒng)開銷非常大。
技術(shù)實(shí)現(xiàn)要素:
基于上述現(xiàn)有技術(shù)的缺陷和不足,本發(fā)明提出一種數(shù)據(jù)保護(hù)方法及裝置,采用該方法,僅在工作隊(duì)列不滿時(shí)對(duì)數(shù)據(jù)添加互斥鎖進(jìn)行保護(hù),省去了在隊(duì)列已滿時(shí)的互斥開銷。
一種數(shù)據(jù)保護(hù)方法,應(yīng)用于工作隊(duì)列,該方法包括:
接收并存儲(chǔ)入隊(duì)數(shù)據(jù);
判斷所述工作隊(duì)列是否已滿;
如果所述工作隊(duì)列未滿,則在所述工作隊(duì)列的隊(duì)尾添加互斥鎖。
優(yōu)選地,在所述接收并存儲(chǔ)入隊(duì)數(shù)據(jù)之后,在所述判斷所述工作隊(duì)列是否已滿之前,該方法還包括:
生成表征所述工作隊(duì)列狀態(tài)的變量;
其中,當(dāng)所述工作隊(duì)列已滿時(shí),所述變量的取值為設(shè)定的第一取值;當(dāng)所述工作隊(duì)列未滿時(shí),所述變量的取值為設(shè)定的第二取值。
優(yōu)選地,所述生成表征所述工作隊(duì)列狀態(tài)的變量,包括:
生成表征所述工作隊(duì)列狀態(tài)的原子整形變量。
優(yōu)選地,所述判斷所述工作隊(duì)列是否已滿,包括:
根據(jù)所述變量,判斷所述工作隊(duì)列是否已滿。
優(yōu)選地,所述根據(jù)所述變量,判斷所述工作隊(duì)列是否已滿,包括:
讀取所述變量的值;
如果所述變量的值為所述設(shè)定的第一取值,則判斷所述工作隊(duì)列已滿;
如果所述變量的值為所述設(shè)定的第二取值,則判斷所述工作隊(duì)列未滿。
一種數(shù)據(jù)保護(hù)裝置,應(yīng)用于工作隊(duì)列,該裝置包括:
數(shù)據(jù)接收單元,用于接收并存儲(chǔ)入隊(duì)數(shù)據(jù);
判斷單元,用于判斷所述工作隊(duì)列是否已滿;
處理單元,用于在所述判斷單元判斷所述工作隊(duì)列未滿時(shí),在所述工作隊(duì)列的隊(duì)尾添加互斥鎖。
優(yōu)選地,所述裝置還包括:
變量生成單元,用于生成表征所述工作隊(duì)列狀態(tài)的變量;
其中,當(dāng)所述工作隊(duì)列已滿時(shí),所述變量的取值為設(shè)定的第一取值;當(dāng)所述工作隊(duì)列未滿時(shí),所述變量的取值為設(shè)定的第二取值;
優(yōu)選地,所述變量生成單元生成表征所述工作隊(duì)列狀態(tài)的變量時(shí),具體用于:
生成表征所述工作隊(duì)列狀態(tài)的原子整形變量。
優(yōu)選地,所述判斷單元判斷所述工作隊(duì)列是否已滿時(shí),具體用于:
根據(jù)所述變量,判斷所述工作隊(duì)列是否已滿。
優(yōu)選地,所述判斷單元根據(jù)所述變量,判斷所述工作隊(duì)列是否已滿時(shí),具體用于:
讀取所述變量的值;
如果所述變量的值為所述設(shè)定的第一取值,則判斷所述工作隊(duì)列已滿;
如果所述變量的值為所述設(shè)定的第二取值,則判斷所述工作隊(duì)列未滿。
本發(fā)明提出的數(shù)據(jù)保護(hù)方法,應(yīng)用于工作隊(duì)列,該方法包括:接收并存儲(chǔ)入隊(duì)數(shù)據(jù);判斷所述工作隊(duì)列是否已滿;如果所述工作隊(duì)列未滿,則在所述工作隊(duì)列的隊(duì)尾添加互斥鎖。采用上述技術(shù)方案,僅在隊(duì)列不滿時(shí)在隊(duì)尾添加互斥鎖,免除了隊(duì)列已滿時(shí)添加互斥鎖帶來的互斥開銷,整體上節(jié)省了系統(tǒng)開銷。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1是本發(fā)明實(shí)施例提供的一種數(shù)據(jù)保護(hù)方法的流程示意圖;
圖2是本發(fā)明實(shí)施例提供的協(xié)議棧結(jié)構(gòu)示意圖;
圖3是本發(fā)明實(shí)施例提供的另一種數(shù)據(jù)保護(hù)方法的流程示意圖;
圖4是本發(fā)明實(shí)施例提供的一種數(shù)據(jù)保護(hù)裝置的結(jié)構(gòu)示意圖;
圖5是本發(fā)明實(shí)施例提供的另一種數(shù)據(jù)保護(hù)裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
本發(fā)明實(shí)施例公開了一種數(shù)據(jù)保護(hù)方法,應(yīng)用于工作隊(duì)列,參見圖1所示,該方法包括:
S101、接收并存儲(chǔ)入隊(duì)數(shù)據(jù);
具體的,本發(fā)明實(shí)施例技術(shù)方案可應(yīng)用于互聯(lián)網(wǎng)協(xié)議存儲(chǔ)局域網(wǎng)絡(luò)(Internet Protocol Storage Area Network,IPSAN)。在IPSAN中,用戶PC終端訪問協(xié)議棧,對(duì)內(nèi)核協(xié)議棧工作隊(duì)列進(jìn)行操作。鑒于傳統(tǒng)的內(nèi)核協(xié)議棧的功能冗余、定制性差、操作系統(tǒng)開銷大、內(nèi)存拷貝開銷大等缺陷,采用把協(xié)議棧構(gòu)建在用戶空間的方式可以很好地避免這些問題。
例如,在Linux操作系統(tǒng)中,參見圖2所示,系統(tǒng)調(diào)用接口提供了用戶空間訪問協(xié)議棧的入口:socket層提供了一組公用接口來支持TCP和UDP協(xié)議;網(wǎng)絡(luò)協(xié)議層負(fù)責(zé)實(shí)現(xiàn)TCP/IP協(xié)議族中的各種網(wǎng)絡(luò)協(xié)議的處理流程;設(shè)備無關(guān)層提供了一組公用接口供設(shè)備驅(qū)動(dòng)程序使用,其中設(shè)備驅(qū)動(dòng)程序針對(duì)特定的物理設(shè)備來設(shè)計(jì)實(shí)現(xiàn),提供了操作網(wǎng)絡(luò)設(shè)備的入口。底層數(shù)據(jù)包從用戶終端的網(wǎng)卡緩沖區(qū)進(jìn)入內(nèi)核時(shí),會(huì)觸發(fā)硬件中斷,對(duì)應(yīng)的中斷處理例程會(huì)以直接內(nèi)存存取(Direct Memory Access,DMA)等方式把數(shù)據(jù)包從網(wǎng)卡緩沖區(qū)拷貝到內(nèi)核開辟的緩沖區(qū)中。
基于上述配置,用戶終端能夠?qū)ぷ麝?duì)列進(jìn)行入隊(duì)或出隊(duì)操作。當(dāng)用戶端對(duì)工作隊(duì)列進(jìn)行入隊(duì)操作時(shí),即是將需要存儲(chǔ)的數(shù)據(jù),發(fā)送給工作隊(duì)列,使工作隊(duì)列進(jìn)行存儲(chǔ);當(dāng)用戶端對(duì)工作隊(duì)列進(jìn)行出隊(duì)操作時(shí),即是從工作隊(duì)列中讀取出需要的數(shù)據(jù)。
在工作隊(duì)列中,有一些數(shù)據(jù)是共享數(shù)據(jù)資源,這些數(shù)據(jù)資源可以被多個(gè)用戶線程進(jìn)行訪問操作。為了保證當(dāng)一個(gè)線程對(duì)這些數(shù)據(jù)進(jìn)行訪問操作時(shí)不被其它需要訪問操作這些數(shù)據(jù)的線程打擾,工作隊(duì)列需要對(duì)這些數(shù)據(jù)設(shè)置保護(hù)鎖,以便這些數(shù)據(jù)只能在同一時(shí)間被一個(gè)線程訪問操作。也就是說,本發(fā)明實(shí)施例技術(shù)方案是為了對(duì)工作隊(duì)列中的共享數(shù)據(jù)進(jìn)行保護(hù),實(shí)際應(yīng)用于工作隊(duì)列的臨界區(qū),也就是需要進(jìn)行鎖保護(hù)的數(shù)據(jù)資源所在的隊(duì)列區(qū)域。因此,本發(fā)明實(shí)施例所涉及的工作隊(duì)列,可以看做是需要對(duì)數(shù)據(jù)加互斥鎖保護(hù)的工作隊(duì)列。
S102、判斷所述工作隊(duì)列是否已滿;
具體的,工作隊(duì)列在每接受一次入隊(duì)操作后,都檢驗(yàn)一次工作隊(duì)列是否已滿。
S103、如果所述工作隊(duì)列未滿,則在所述工作隊(duì)列的隊(duì)尾添加互斥鎖。
具體的,如果在接受一次入隊(duì)操作后,工作隊(duì)列檢測(cè)判斷工作隊(duì)列尚未滿,則后續(xù)還可以有用戶端執(zhí)行入隊(duì)操作,同樣的,可能會(huì)發(fā)生多個(gè)用戶端開啟線程執(zhí)行入隊(duì)操作的情況,因此需要對(duì)工作隊(duì)列中已有的數(shù)據(jù)加入隊(duì)互斥鎖,以保護(hù)在同一時(shí)刻只能有一個(gè)線程執(zhí)行入隊(duì)操作。又由于入隊(duì)操作都是在隊(duì)列尾部進(jìn)行的,因此在工作隊(duì)列的隊(duì)尾加互斥鎖,對(duì)入隊(duì)操作進(jìn)行保護(hù)。
相反的,如果在接受一次入隊(duì)操作后,工作隊(duì)列檢測(cè)判斷工作隊(duì)列已滿,則后續(xù)不會(huì)再有用戶端執(zhí)行入隊(duì)操作,因?yàn)榇藭r(shí)工作隊(duì)列已經(jīng)沒有空間再接受入隊(duì)操作,此時(shí),也就不會(huì)發(fā)生入隊(duì)沖突的情況,因此,當(dāng)判斷工作隊(duì)列已滿時(shí),工作隊(duì)列就不需要再為隊(duì)列中的數(shù)據(jù)添加互斥鎖,以節(jié)省系統(tǒng)互斥開銷。
本發(fā)明提出的數(shù)據(jù)保護(hù)方法,應(yīng)用于工作隊(duì)列,該方法包括:接收并存儲(chǔ)入隊(duì)數(shù)據(jù);判斷所述工作隊(duì)列是否已滿;如果所述工作隊(duì)列未滿,則在所述工作隊(duì)列的隊(duì)尾添加互斥鎖。采用上述技術(shù)方案,僅在隊(duì)列不滿時(shí)在隊(duì)尾添加互斥鎖,免除了隊(duì)列已滿時(shí)添加互斥鎖帶來的互斥開銷,整體上節(jié)省了系統(tǒng)開銷。
可選的,在本發(fā)明的另一個(gè)實(shí)施例中,參見圖3所示,在執(zhí)行步驟S301、接收并存儲(chǔ)入隊(duì)數(shù)據(jù)之后,在執(zhí)行步驟S303、判斷所述工作隊(duì)列是否已滿之前,該方法還包括:
S302、生成表征所述工作隊(duì)列狀態(tài)的變量;
其中,當(dāng)所述工作隊(duì)列已滿時(shí),所述變量的取值為設(shè)定的第一取值;當(dāng)所述工作隊(duì)列未滿時(shí),所述變量的取值為設(shè)定的第二取值。
具體的,本發(fā)明實(shí)施例技術(shù)方案根據(jù)工作隊(duì)列是否已滿的狀態(tài),決定是否對(duì)隊(duì)列添加入隊(duì)操作互斥鎖保護(hù)。因此,明確工作隊(duì)列的狀態(tài),是決定是否為工作隊(duì)列添加互斥鎖的關(guān)鍵信息?;谏鲜鲈?,在每次接受入隊(duì)數(shù)據(jù)后,生成一個(gè)表征工作隊(duì)列狀態(tài)的變量,該變量用于標(biāo)識(shí)工作隊(duì)列是否已滿:當(dāng)工作隊(duì)列已滿時(shí),生成的變量的值為第一取值;當(dāng)工作隊(duì)列尚未滿時(shí),生成的變量的值為第二取值。通過生成的變量的取值不同,可以直觀明確地確定當(dāng)前工作隊(duì)列的狀態(tài)。
例如,在每次接受入隊(duì)操作,存儲(chǔ)入隊(duì)數(shù)據(jù)后,生成變量FullFlag:當(dāng)工作隊(duì)列已滿時(shí),F(xiàn)ullFlag=1;當(dāng)工作隊(duì)列尚未滿時(shí),F(xiàn)ullFlag=0。通過讀取變量FullFlag的值,即可快速的確定工作隊(duì)列狀態(tài)。
需要說明的是,在具體實(shí)現(xiàn)本發(fā)明實(shí)施例技術(shù)方案時(shí),根據(jù)程序形式限制,還可以生成兩個(gè)互斥的變量,用于標(biāo)識(shí)工作隊(duì)列狀態(tài)。例如,生成變量FullFlag和EmptyFlag:當(dāng)工作隊(duì)列已滿時(shí),F(xiàn)ullFlag=1,EmptyFlag=0;當(dāng)工作隊(duì)列尚未滿時(shí),F(xiàn)ullFlag=0,EmptyFlag=1。通過讀取FullFlag或EmptyFlag兩者其一的值,就可以確定工作隊(duì)列狀態(tài)。
本實(shí)施例中的步驟S301、S303、S304分別對(duì)應(yīng)圖1所示的方法的實(shí)施例中的步驟S101、S102、S103,其具體內(nèi)容請(qǐng)參見對(duì)應(yīng)的方法實(shí)施例的內(nèi)容,此處不再贅述。
可選的,在本發(fā)明的另一個(gè)實(shí)施例中,所述生成表征所述工作隊(duì)列狀態(tài)的變量,包括:
生成表征所述工作隊(duì)列狀態(tài)的原子整形變量。
具體的,在本發(fā)明實(shí)施例中,生成的變量為原子整形變量。相應(yīng)的,讀取該變量的值需要通過整數(shù)原子操作來實(shí)現(xiàn)。原子操作使得讀取該變量值的操作不會(huì)被打斷,在同一時(shí)間只能由一個(gè)線程讀取,免去了為讀取該變量的值設(shè)置互斥鎖的開銷。
例如,生成原子整形變量FullFlag:當(dāng)工作隊(duì)列已滿時(shí),F(xiàn)ullFlag=1;當(dāng)工作隊(duì)列尚未滿時(shí),F(xiàn)ullFlag=0。通過讀取變量FullFlag的值,即可快速的確定工作隊(duì)列狀態(tài)。
可選的,在本發(fā)明的另一個(gè)實(shí)施例中,所述判斷所述工作隊(duì)列是否已滿,包括:
根據(jù)所述變量,判斷所述工作隊(duì)列是否已滿。
具體的,由于工作隊(duì)列在每次接受入隊(duì)操作后,都會(huì)生成一個(gè)表征工作隊(duì)列狀態(tài)的變量,因此,通過該變量,即可直觀地判斷該隊(duì)列是否已滿。具體的,根據(jù)約定的該變量取值與工作隊(duì)列狀態(tài)的對(duì)應(yīng)關(guān)系,讀取該變量的取值,即可確定該工作隊(duì)列的狀態(tài)。
可選的,在本發(fā)明的另一個(gè)實(shí)施例中,所述根據(jù)所述變量,判斷所述工作隊(duì)列是否已滿,包括:
讀取所述變量的值;
如果所述變量的值為所述設(shè)定的第一取值,則判斷所述工作隊(duì)列已滿;
如果所述變量的值為所述設(shè)定的第二取值,則判斷所述工作隊(duì)列未滿。
具體的,按照生成變量的規(guī)則,變量的不同取值對(duì)應(yīng)著工作隊(duì)列的不同狀態(tài),當(dāng)變量取值為第一取值時(shí),對(duì)應(yīng)著工作隊(duì)列已滿的狀態(tài),當(dāng)變量取值為第二取值時(shí),對(duì)應(yīng)著工作隊(duì)列未滿的狀態(tài)。因此,通過讀取所生成的變量的值,可以明確工作隊(duì)列的狀態(tài):如果變量的值為第一取值,則說明工作隊(duì)列已滿;如果變量的值為第二取值,則說明工作隊(duì)列未滿。
例如,假設(shè)生成的變量為FullFlag,并且,按照約定,工作隊(duì)列已滿時(shí),生成FullFlag=1;當(dāng)工作隊(duì)列尚未滿時(shí),生成FullFlag=0。那么在判斷工作隊(duì)列狀態(tài)時(shí),讀取變量FullFlag的值,如果FullFlag=1,則說明工作隊(duì)列已滿,如果FullFlag=0,則說明工作隊(duì)列未滿。
本發(fā)明實(shí)施例還公開了一種數(shù)據(jù)保護(hù)裝置,應(yīng)用于工作隊(duì)列,參見圖4所示,該裝置包括:
數(shù)據(jù)接收單元401,用于接收并存儲(chǔ)入隊(duì)數(shù)據(jù);
判斷單元402,用于判斷所述工作隊(duì)列是否已滿;
處理單元403,用于在判斷單元402判斷所述工作隊(duì)列未滿時(shí),在所述工作隊(duì)列的隊(duì)尾添加互斥鎖。
具體的,本實(shí)施例中各個(gè)單元的具體工作內(nèi)容,請(qǐng)參見對(duì)應(yīng)的方法實(shí)施例的內(nèi)容,此處不再贅述。
本發(fā)明提出的數(shù)據(jù)保護(hù)裝置,應(yīng)用于工作隊(duì)列,該裝置在保護(hù)工作隊(duì)列數(shù)據(jù)時(shí),在數(shù)據(jù)接收單元401接收并存儲(chǔ)入隊(duì)數(shù)據(jù)后;判斷單元402判斷所述工作隊(duì)列是否已滿;如果所述工作隊(duì)列未滿,則處理單元403在所述工作隊(duì)列的隊(duì)尾添加互斥鎖。采用上述技術(shù)方案,僅在隊(duì)列不滿時(shí)在隊(duì)尾添加互斥鎖,免除了隊(duì)列已滿時(shí)添加互斥鎖帶來的互斥開銷,整體上節(jié)省了系統(tǒng)開銷。
可選的,在本發(fā)明的另一個(gè)實(shí)施例中,參見圖5所示,所述裝置還包括:
變量生成單元404,用于生成表征所述工作隊(duì)列狀態(tài)的變量;
其中,當(dāng)所述工作隊(duì)列已滿時(shí),所述變量的取值為設(shè)定的第一取值;當(dāng)所述工作隊(duì)列未滿時(shí),所述變量的取值為設(shè)定的第二取值;
具體的,本實(shí)施例中變量生成單元404的具體工作內(nèi)容,請(qǐng)參見對(duì)應(yīng)的方法實(shí)施例的內(nèi)容,此處不再贅述。
可選的,在本發(fā)明的另一個(gè)實(shí)施例中,變量生成單元404生成表征所述工作隊(duì)列狀態(tài)的變量時(shí),具體用于:
生成表征所述工作隊(duì)列狀態(tài)的原子整形變量。
具體的,本實(shí)施例中變量生成單元404的具體工作內(nèi)容,請(qǐng)參見對(duì)應(yīng)的方法實(shí)施例的內(nèi)容,此處不再贅述。
可選的,在本發(fā)明的另一個(gè)實(shí)施例中,判斷單元402判斷所述工作隊(duì)列是否已滿時(shí),具體用于:
根據(jù)所述變量,判斷所述工作隊(duì)列是否已滿。
具體的,本實(shí)施例中判斷單元402的具體工作內(nèi)容,請(qǐng)參見對(duì)應(yīng)的方法實(shí)施例的內(nèi)容,此處不再贅述。
可選的,在本發(fā)明的另一個(gè)實(shí)施例中,判斷單元402根據(jù)所述變量,判斷所述工作隊(duì)列是否已滿時(shí),具體用于:
讀取所述變量的值;
如果所述變量的值為所述設(shè)定的第一取值,則判斷所述工作隊(duì)列已滿;
如果所述變量的值為所述設(shè)定的第二取值,則判斷所述工作隊(duì)列未滿。
具體的,本實(shí)施例中判斷單元402的具體工作內(nèi)容,請(qǐng)參見對(duì)應(yīng)的方法實(shí)施例的內(nèi)容,此處不再贅述。
對(duì)所公開的實(shí)施例的上述說明,使本領(lǐng)域?qū)I(yè)技術(shù)人員能夠?qū)崿F(xiàn)或使用本發(fā)明。對(duì)這些實(shí)施例的多種修改對(duì)本領(lǐng)域的專業(yè)技術(shù)人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本發(fā)明的精神或范圍的情況下,在其它實(shí)施例中實(shí)現(xiàn)。因此,本發(fā)明將不會(huì)被限制于本文所示的這些實(shí)施例,而是要符合與本文所公開的原理和新穎特點(diǎn)相一致的最寬的范圍。