一種基于avl樹的數(shù)據(jù)寫入方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別是涉及一種基于AVL樹的數(shù)據(jù)寫入方法及裝置。
【背景技術(shù)】
[0002]AVL樹又稱為平衡二叉樹(Balanced Binary Tree),具有以下性質(zhì):是一棵空樹或它的左右兩個(gè)子樹的高度差的絕對(duì)值不超過1,并且左右兩個(gè)子樹都是一棵平衡二叉樹。因?yàn)槠涮厥獾慕Y(jié)構(gòu),在單線程數(shù)據(jù)的索引和存放方面,相比線性數(shù)據(jù)結(jié)構(gòu)具有更好的性能;但是多線程訪問時(shí)由于并發(fā)保護(hù)引入的鎖機(jī)制不夠完善,導(dǎo)致其具有性能瓶頸。
[0003]紅黑樹(Red Black Tree)是一種自平衡二叉查找樹,紅黑樹和AVL樹類似,都是在進(jìn)行插入和刪除操作時(shí)通過特定操作保持二叉查找樹的平衡,從而獲得較高的查找性能。它雖然是復(fù)雜的,但它的最壞情況運(yùn)行時(shí)間也是非常良好的,并且在實(shí)踐中是高效的,其可以在0(log η)時(shí)間內(nèi)做查找、插入和刪除操作。
[0004]Linux內(nèi)核中目前并發(fā)控制的機(jī)制主要包括:自旋鎖、信號(hào)量、原子操作,還有基于自旋鎖設(shè)計(jì)的讀寫鎖。自旋鎖是使用忙等待鎖來確?;コ怄i的一種特別方法,針對(duì)的是臨界區(qū);信號(hào)量包括一個(gè)變量及對(duì)它進(jìn)行的兩個(gè)原語操作,此變量就稱之為信號(hào)量,針對(duì)的是臨界區(qū);原子鎖是原子操作不可能被其他的任務(wù)給調(diào)開,針對(duì)的是單個(gè)變量;讀寫鎖是自旋鎖的一個(gè)變種,與一般的自旋鎖相比,自旋鎖一次只能有一個(gè)進(jìn)程進(jìn)入臨界區(qū),而對(duì)讀寫鎖而言,如果進(jìn)程是讀的話,那就可以有多個(gè)進(jìn)程同時(shí)進(jìn)入臨界區(qū),而如果是寫的話,則只有一個(gè)可以。顯然,讀寫鎖相比其它三種機(jī)制,在讀多寫少的場(chǎng)景下優(yōu)勢(shì)明顯。
[0005]—個(gè)存儲(chǔ)有所需數(shù)據(jù)的紅黑樹,當(dāng)同一時(shí)刻只有一個(gè)寫請(qǐng)求到達(dá)時(shí),只需要按照二叉搜索樹的搜索策略定位到需要修改的節(jié)點(diǎn)即可,此時(shí)不需要并發(fā)控制。當(dāng)同一時(shí)刻有多個(gè)寫請(qǐng)求到達(dá)紅黑樹的樹根時(shí),簡(jiǎn)單的處理就是對(duì)紅黑樹的根節(jié)點(diǎn)加鎖,然后依次下發(fā)請(qǐng)求,就能保證臨界資源的完整性。但是這種處理方式在兩個(gè)請(qǐng)求要修改節(jié)點(diǎn)的搜索路徑并不沖突的情況下,也就說本來可以同時(shí)將搜索路徑不沖突的請(qǐng)求下發(fā),卻必須要等待前一請(qǐng)求完成后才能下發(fā),這個(gè)等待過程所消耗的時(shí)間帶來了額外的性能開銷,而且可能不是兩個(gè)請(qǐng)求,而是更多的請(qǐng)求,那么性能開銷就更大。
【發(fā)明內(nèi)容】
[0006]本發(fā)明的目的是提供一種基于AVL樹的數(shù)據(jù)寫入方法及裝置,目的在于對(duì)AVL樹中局部未沖突的寫操作允許并行處理,從而提高數(shù)據(jù)寫入的性能。
[0007]為解決上述技術(shù)問題,本發(fā)明提供一種基于AVL樹的數(shù)據(jù)寫入方法,采用讀寫鎖對(duì)數(shù)據(jù)寫入進(jìn)行并發(fā)控制,包括:
[0008]接收數(shù)據(jù)的寫入請(qǐng)求;
[0009]根據(jù)寫入節(jié)點(diǎn)值的大小以及AVL樹的特性確定搜索路徑;
[0010]判斷所述搜索路徑中各節(jié)點(diǎn)是否處于鎖狀態(tài);其中,鎖狀態(tài)為在當(dāng)前并發(fā)的寫操作中第一節(jié)點(diǎn)為發(fā)生局部調(diào)整子樹的根節(jié)點(diǎn)時(shí),將所述第一節(jié)點(diǎn)設(shè)置為鎖住的狀態(tài);
[0011]若所述搜索路徑中沒有節(jié)點(diǎn)處于鎖狀態(tài),則進(jìn)行寫操作;若所述搜索路徑中有節(jié)點(diǎn)處于鎖狀態(tài),則將寫操作阻塞至鎖住的節(jié)點(diǎn)上,直至所述鎖住的節(jié)點(diǎn)的鎖狀態(tài)取消。
[0012]可選地,在當(dāng)前并發(fā)的寫操作中第一節(jié)點(diǎn)為發(fā)生局部調(diào)整子樹的根節(jié)點(diǎn)時(shí),將所述第一節(jié)點(diǎn)設(shè)置為鎖住的狀態(tài)包括:
[0013]根據(jù)當(dāng)前并發(fā)的寫操作的數(shù)據(jù)寫入節(jié)點(diǎn)值的大小以及AVL樹的特性確定搜索路徑,并定位到實(shí)際寫入的第二節(jié)點(diǎn)的位置;
[0014]計(jì)算所述第二節(jié)點(diǎn)的父節(jié)點(diǎn)的平衡因子,并向上遞歸計(jì)算其他節(jié)點(diǎn)的平衡因子,直至計(jì)算出平衡因子的值為2或者-2的第一節(jié)點(diǎn)為止;
[0015]開啟所述第一節(jié)點(diǎn)的鎖狀態(tài),并根據(jù)所述平衡因子的值進(jìn)行相應(yīng)的調(diào)整;
[0016]寫操作完成后釋放所述第一節(jié)點(diǎn)的鎖狀態(tài)。
[0017]可選地,所述開啟所述第一節(jié)點(diǎn)的鎖狀態(tài),并根據(jù)所述平衡因子的值進(jìn)行相應(yīng)的調(diào)整包括:
[0018]當(dāng)所述平衡因子的值為2時(shí):若旋轉(zhuǎn)根的左孩子的平衡因子的值為1,則進(jìn)行LL型旋轉(zhuǎn);若旋轉(zhuǎn)根的左孩子的平衡因子的值為-1,則進(jìn)行LR型旋轉(zhuǎn);
[0019]當(dāng)所述平衡因子的值為-2時(shí):若旋轉(zhuǎn)根的右孩子的平衡因子的值為1,則進(jìn)行RL型旋轉(zhuǎn);若旋轉(zhuǎn)根的右孩子的平衡因子的值為-1,則進(jìn)行RR型旋轉(zhuǎn)。
[0020]可選地,所述AVL樹為紅黑樹。
[0021]本發(fā)明還提供了一種基于AVL樹的數(shù)據(jù)寫入裝置,采用讀寫鎖對(duì)數(shù)據(jù)寫入進(jìn)行并發(fā)控制,包括:
[0022]接收模塊,用于接收數(shù)據(jù)的寫入請(qǐng)求;
[0023]確定模塊,用于根據(jù)寫入節(jié)點(diǎn)值的大小以及AVL樹的特性確定搜索路徑;
[0024]判斷模塊,用于判斷所述搜索路徑中各節(jié)點(diǎn)是否處于鎖狀態(tài);其中,鎖狀態(tài)為在當(dāng)前并發(fā)的寫操作中第一節(jié)點(diǎn)為發(fā)生局部調(diào)整子樹的根節(jié)點(diǎn)時(shí),將所述第一節(jié)點(diǎn)設(shè)置為鎖住的狀態(tài);
[0025]寫入模塊,用于當(dāng)所述搜索路徑中沒有節(jié)點(diǎn)處于鎖狀態(tài)時(shí),則進(jìn)行寫操作;當(dāng)所述搜索路徑中有節(jié)點(diǎn)處于鎖狀態(tài)時(shí),則將寫操作阻塞至鎖住的節(jié)點(diǎn)上,直至所述鎖住的節(jié)點(diǎn)的鎖狀態(tài)取消。
[0026]可選地,所述判斷模塊還包括:
[0027]定位單元,用于根據(jù)當(dāng)前并發(fā)的寫操作的數(shù)據(jù)寫入節(jié)點(diǎn)值的大小以及AVL樹的特性確定搜索路徑,并定位到實(shí)際寫入的第二節(jié)點(diǎn)的位置;
[0028]計(jì)算單元,用于計(jì)算所述第二節(jié)點(diǎn)的父節(jié)點(diǎn)的平衡因子,并向上遞歸計(jì)算其他節(jié)點(diǎn)的平衡因子,直至計(jì)算出平衡因子的值為2或者-2的第一節(jié)點(diǎn)為止;
[0029]開啟單元,用于開啟所述第一節(jié)點(diǎn)的鎖狀態(tài),并根據(jù)所述平衡因子的值進(jìn)行相應(yīng)的調(diào)整;
[0030]釋放單元,用于在寫操作完成后釋放所述第一節(jié)點(diǎn)的鎖狀態(tài)。
[0031]可選地,所述開啟單元具體用于:
[0032]當(dāng)所述平衡因子的值為2時(shí):若旋轉(zhuǎn)根的左孩子的平衡因子的值為1,則進(jìn)行LL型旋轉(zhuǎn);若旋轉(zhuǎn)根的左孩子的平衡因子的值為-1,則進(jìn)行LR型旋轉(zhuǎn);
[0033]當(dāng)所述平衡因子的值為-2時(shí):若旋轉(zhuǎn)根的右孩子的平衡因子的值為1,則進(jìn)行RL型旋轉(zhuǎn);若旋轉(zhuǎn)根的右孩子的平衡因子的值為-1,則進(jìn)行RR型旋轉(zhuǎn)。
[0034]可選地,所述AVL樹為紅黑樹。
[0035]本發(fā)明所提供的基于AVL樹的數(shù)據(jù)寫入方法及裝置,采用讀寫鎖對(duì)數(shù)據(jù)寫入進(jìn)行并發(fā)控制,接收數(shù)據(jù)的寫入請(qǐng)求之后;根據(jù)寫入節(jié)點(diǎn)值的大小以及AVL樹的特性確定搜索路徑;判斷搜索路徑中各節(jié)點(diǎn)是否處于鎖狀態(tài);若搜索路徑中沒有節(jié)點(diǎn)處于鎖狀態(tài),則進(jìn)行寫操作;若搜索路徑中有節(jié)點(diǎn)處于鎖狀態(tài),則將寫操作阻塞至鎖住的節(jié)點(diǎn)上,直至鎖住的節(jié)點(diǎn)的鎖狀態(tài)取消??梢?,本發(fā)明所提供的基于AVL樹的數(shù)據(jù)寫入方法及裝置,對(duì)AVL樹中局部未沖突的寫操作允許并行處理,從而提高數(shù)據(jù)寫入的性能。
【附圖說明】
[0036]圖1為本發(fā)明所提供的基于AVL樹的數(shù)據(jù)寫入方法的一種【具體實(shí)施方式】的流程圖;
[0037]圖2為本發(fā)明所提供的基于AVL樹的數(shù)據(jù)寫入裝置的一種【具體實(shí)施方式】的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0038]本發(fā)明的核心是提供一種基于AVL樹的數(shù)據(jù)寫入方法及裝置,采用讀寫鎖對(duì)數(shù)據(jù)寫入進(jìn)行并發(fā)控制。讀寫鎖相比其它幾種并發(fā)控制機(jī)制的優(yōu)勢(shì)在于,對(duì)于讀請(qǐng)求較多的場(chǎng)景,由于讀請(qǐng)求并不修改臨界資源,因此沒有鎖機(jī)制的保護(hù),也就沒有了鎖的開銷和等待。因此在紅黑樹中引入讀寫鎖的優(yōu)勢(shì)在于,不用考慮并發(fā)讀的性能瓶頸,只需重點(diǎn)關(guān)注并發(fā)寫的保護(hù)策略。
[0039]為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面結(jié)合附圖和【具體實(shí)施方式】對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說明。顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0040]本發(fā)明所提供的基于AVL樹的數(shù)據(jù)寫入方法的一種【具體實(shí)施方式】的流程圖如圖1所示,該方法采用讀寫鎖對(duì)數(shù)據(jù)寫入進(jìn)行并發(fā)控制,具體包括:
[0041]步驟S101:接收數(shù)據(jù)的寫入請(qǐng)求;
[0042]步驟S102:根據(jù)寫入節(jié)點(diǎn)值的大小以及AVL樹的特性確定搜索路徑;
[0043]步驟S103:判斷所述搜索路徑中各節(jié)點(diǎn)是否處于鎖狀態(tài);其中,鎖狀態(tài)為在當(dāng)前并發(fā)的寫操作中第一節(jié)點(diǎn)為發(fā)生局部調(diào)整子樹的根節(jié)點(diǎn)時(shí),將所述第一節(jié)點(diǎn)設(shè)置為鎖住的狀態(tài);
[0044]步驟S104:若所述搜索路徑中沒有節(jié)點(diǎn)處于鎖狀態(tài),則進(jìn)行寫操作;若所述搜索路徑中有節(jié)點(diǎn)處于鎖狀態(tài),則將寫操作阻塞至鎖住的節(jié)點(diǎn)上,直至所述鎖住的節(jié)點(diǎn)的鎖狀態(tài)取消。
[0045]本發(fā)明所提供的基于AVL樹的數(shù)據(jù)寫入方法,采用讀寫鎖對(duì)數(shù)據(jù)寫入進(jìn)行并發(fā)控制,接收數(shù)據(jù)的寫入請(qǐng)求之后;根據(jù)寫入節(jié)點(diǎn)值的大小以及AVL樹的特性確定搜索路徑;判斷搜索路徑中各節(jié)點(diǎn)是否處于鎖狀態(tài);若搜索路徑中沒有節(jié)點(diǎn)處于鎖狀態(tài),則進(jìn)行寫操作;若搜索路徑中有節(jié)點(diǎn)處于鎖狀態(tài),則將寫操作阻塞至鎖住的節(jié)點(diǎn)上,直至鎖住的節(jié)點(diǎn)的鎖狀態(tài)取消。可見,本發(fā)明所提供的基于AVL樹的數(shù)據(jù)寫入方法,對(duì)AVL樹中局部未沖突的寫操作允許并行處理,從而提高數(shù)據(jù)寫入的性能。
[0046]具體地,在當(dāng)前并發(fā)的寫操作中第一節(jié)點(diǎn)為發(fā)生局部調(diào)整子樹的根節(jié)點(diǎn)時(shí),將所述第一節(jié)點(diǎn)設(shè)置為鎖住的狀態(tài)包括:
[0047]根據(jù)當(dāng)前并發(fā)的寫操作的數(shù)據(jù)寫入節(jié)點(diǎn)值的大小以及AVL樹的特性確定搜索路徑,并定位到實(shí)際寫入的第二節(jié)點(diǎn)的位置;
[0048]計(jì)算所述第二節(jié)點(diǎn)的父節(jié)點(diǎn)的平衡因子,并向上遞歸計(jì)算其他節(jié)點(diǎn)的平衡因子,直至計(jì)算出平衡因子的值為2或者-2的第一節(jié)點(diǎn)為止;
[0049]開啟所述第一節(jié)點(diǎn)的鎖狀態(tài),并根據(jù)所述平衡因子的值進(jìn)行相應(yīng)的調(diào)整;
[0050]寫操作完成后釋放所述第一節(jié)點(diǎn)的鎖狀態(tài)。
[0051]在本實(shí)施例中,所述開啟所述第一節(jié)點(diǎn)的鎖狀態(tài),并根據(jù)所述平衡因子的值進(jìn)行相應(yīng)的調(diào)整包括:
[0052]當(dāng)所述平衡因子的值為2時(shí):若旋轉(zhuǎn)根的左孩子的平衡因子的值為1,則進(jìn)行LL型旋轉(zhuǎn);若旋轉(zhuǎn)根的左孩子的平衡因子的值為-1,則進(jìn)行LR型旋轉(zhuǎn);
[0053]當(dāng)所述平衡因子的值為-2時(shí):若旋轉(zhuǎn)根的右孩子的平衡因子的值為1,則進(jìn)行RL型旋轉(zhuǎn);若旋轉(zhuǎn)根的右孩子的平衡因子的值為-1,則進(jìn)行RR型旋轉(zhuǎn)。
[0054]紅黑樹是AVL樹的變種,且內(nèi)核中使用較多,許多文件系統(tǒng)中都使用到該數(shù)據(jù)結(jié)構(gòu),本實(shí)施例中使用該數(shù)據(jù)結(jié)構(gòu)作為說明對(duì)象,對(duì)其具體實(shí)施過程進(jìn)行進(jìn)一步說明。
[0055]寫入和擦除數(shù)據(jù)相對(duì)應(yīng)紅黑樹的操作就是節(jié)點(diǎn)的插入和刪除。初始的紅黑樹已經(jīng)按照其定義調(diào)整好自己的平衡狀態(tài)。在插入和刪除節(jié)點(diǎn)的過程中,紅黑樹的平衡狀態(tài)