專利名稱:一種多任務操作系統(tǒng)中任務進程的保護方法
技術(shù)領域:
本發(fā)明涉及一種多任務操作系統(tǒng)中任務進程的保護方法。
通常,通信系統(tǒng)軟件為了解決效率以及實時性問題,模塊間的偶合度比較高,幾個并發(fā)執(zhí)行的任務共享數(shù)據(jù)是不可避免的。而且,為了方便編碼,很多數(shù)據(jù)結(jié)構(gòu)都是以鏈表形式組織的。鏈表通常使用動態(tài)分配內(nèi)存的方式,內(nèi)存的使用效率比較高,使用起來非常靈活,但是如果鏈表的中間任何一個環(huán)節(jié)被打斷,都有可能破壞鏈表的完整性,嚴重的會引起系統(tǒng)癱瘓。例如,路由器通常有很多的接口與外圍的設備或者直接與用戶的計算機相連,這些接口(interface)保存了許多配置信息。假定這些數(shù)據(jù)是用鏈表組織的,以顯示接口信息(Show interface)為例,在一臺有多個接口的路由器上,如果要顯示接口信息,輸入顯示接口信息的命令,該命令的主要動作就是遍歷接口鏈表,并且結(jié)果輸出到屏幕上,假設結(jié)果信息不能一屏顯示完畢,則顯示完一屏就需要等待用戶發(fā)出顯示下一屏或結(jié)束顯示的命令。用戶可以在敲鍵盤之前仔細地查看接口信息。由于路由器的配置是多用戶的,也就是可以有多個用戶同時執(zhí)行對接口的操作,如顯示接口信息和刪除接口等,顯示任務掛起等待用戶繼續(xù)操作時,必須允許別的任務對該接口進行操作,否則別的任務會有長時間的等待,使多個任務之間相互之間有很大的影響。假如顯示接口命令在遍歷鏈表時不將數(shù)據(jù)一次完全產(chǎn)生完成,由于在等待時對應的顯示任務是掛起的,因此這時該任務中會有一個變量指向當前顯示的接口對應的數(shù)據(jù)結(jié)構(gòu)。具體說,假設當顯示任務掛起時,任務中有一個變量pShowIf指向了所述顯示接口的1號數(shù)據(jù)結(jié)構(gòu),由于顯示任務的掛起,所以系統(tǒng)會切到換別的任務運行。假設當前另外一個共享該接口1號數(shù)據(jù)結(jié)構(gòu)的任務進程刪除了1號數(shù)據(jù)結(jié)構(gòu),那么這時pShowIf指向的空間就成為一個非法的空間,進而導致顯示任務進程的異常終止或系統(tǒng)死機。
為解決上述問題,目前采用的方法一是使每一個任務進程一次完全產(chǎn)生所有的數(shù)據(jù),但是這將浪費大量的資源;另外一種做法是加引用計數(shù),當pShowIf指向上述接口的1號數(shù)據(jù)結(jié)構(gòu)時,將引用計數(shù)加1,共享該數(shù)據(jù)結(jié)構(gòu)的任務進程在刪除該數(shù)據(jù)結(jié)構(gòu)時,判斷引用計數(shù),如果不為0,則刪除操作失敗。第二個方法對于用戶可以干預的數(shù)據(jù)結(jié)構(gòu)可以使用,但是對于路由模塊就不適合,因為任務進程可能將路由項掛起很長的一段時間,因此,在這么長的時間內(nèi),該路由項不能被更新,會造成轉(zhuǎn)發(fā)錯誤。
本發(fā)明的目的在于,提供一種對多任務操作系統(tǒng)中共享數(shù)據(jù)的多個任務進程的保護方法,該方法能夠避免由于共享數(shù)據(jù)的意外刪除而導致任務進程的異常終止或系統(tǒng)死機。
為達到上述目的,本發(fā)明提供了一種多任務操作系統(tǒng)中任務進程的保護方法,該方法包括創(chuàng)建一個守護鏈表,對于可能產(chǎn)生掛起操作的任何一個任務進程,(1)在運行前,向所述守護鏈表注冊本任務進程使用的數(shù)據(jù)類型多個實例的數(shù)據(jù)集合,以所述數(shù)據(jù)集合為一個主類型節(jié)點,同時在所述主類型節(jié)點下,注冊一個葉子節(jié)點,用以保存對所述數(shù)據(jù)類型多個實例的數(shù)據(jù)集合本次使用所需要的本任務進程的遍歷算法,然后運行本任務進程;
(2)本任務進程掛起時,通知所述守護鏈表中本任務進程注冊的葉子節(jié)點保存本任務進程所操作的數(shù)據(jù)子集中當前數(shù)據(jù),然后其他任務進程運行;(3)本任務進程結(jié)束掛起時,通過所述守護鏈表中本任務進程注冊的葉子節(jié)點,取回本任務進程所操作的數(shù)據(jù)子集中當前數(shù)據(jù);所述方法還包括對于可能產(chǎn)生刪除操作的任何一個任務進程,在執(zhí)行刪除操作時,通知所述守護鏈表,將與本任務進程具有共同父節(jié)點、且共享當前要刪除數(shù)據(jù)的其它所有葉子節(jié)點的指針,指向其對應的數(shù)據(jù)子集中的下一個要操作的數(shù)據(jù)。
上面所述保存本任務進程的遍歷算法,是保存對本任務所要操作的數(shù)據(jù)類型多個實例的集合的一個數(shù)據(jù)子集以及操作所述數(shù)據(jù)子集所需要的指針。
由于本發(fā)明對于可能產(chǎn)生掛起操作的任何一個任務進程,都要在運行前,在所述守護鏈表中本任務進程使用的數(shù)據(jù)類型多個實例的數(shù)據(jù)集合的主節(jié)點下,注冊一個保存對所述數(shù)據(jù)類型多個實例的數(shù)據(jù)集合本次使用所需要的本任務進程的遍歷算法的葉子節(jié)點,在執(zhí)行刪除操作時,通知所述守護鏈表中與本任務進程具有共同父節(jié)點、且共享當前要刪除數(shù)據(jù)的其它所有葉子節(jié)點,將指針指向其對應的數(shù)據(jù)子集中的下一個要操作的數(shù)據(jù),這樣,在本任務進程掛起時,只要通知所述守護鏈表中本任務進程注冊的葉子節(jié)點,將保存在其中的指針指向本任務進程所操作的數(shù)據(jù)子集中當前數(shù)據(jù),就能夠保證在結(jié)束掛起時,從上述葉子節(jié)點中取回本任務進程所操作的數(shù)據(jù)子集中的當前數(shù)據(jù),因此,本發(fā)明能夠?qū)Χ嗳蝿詹僮飨到y(tǒng)中共享數(shù)據(jù)的多個任務進程進行保護,避免由于共享數(shù)據(jù)的意外刪除而導致任務進程的異常終止或系統(tǒng)死機。
下面結(jié)合附圖和實施例對本發(fā)明作進一步詳細的描述。
圖1是本發(fā)明采用的守護鏈表原理圖1;圖2是本發(fā)明采用的守護鏈表原理圖2;圖3是本發(fā)明采用的守護鏈表原理圖3;圖4是本發(fā)明實施例的流程圖;圖5是本發(fā)明實施例采用的守護鏈表狀態(tài)圖1;圖6是本發(fā)明實施例采用的守護鏈表狀態(tài)圖2;圖7是本發(fā)明實施例采用的守護鏈表狀態(tài)圖3;圖8是本發(fā)明實施例采用的守護鏈表狀態(tài)圖4;圖9是本發(fā)明實施例采用的守護鏈表狀態(tài)圖5;在多任務系統(tǒng)中,由于可能多個任務進程共享一個數(shù)據(jù)結(jié)構(gòu),一個任務進程對該共享的數(shù)據(jù)結(jié)構(gòu)進行刪除,使得其它進程可能崩潰。造成此狀況的原因是由于執(zhí)行刪除操作的任務不知道是哪一個變量指向了該數(shù)據(jù)結(jié)構(gòu)。因此,如果能提供一種支持,使得當執(zhí)行刪除任務的進程在刪除該數(shù)據(jù)結(jié)構(gòu)時能將相應的指向該數(shù)據(jù)結(jié)構(gòu)的變量都指向正確的位置,就不會使其它共享該數(shù)據(jù)結(jié)構(gòu)的任務進程產(chǎn)生異常。
按照本發(fā)明,首先應創(chuàng)建一個守護鏈表,用以管理對共享數(shù)據(jù)的操作,守護鏈表本身用來管理關(guān)鍵數(shù)據(jù)操作的數(shù)據(jù)結(jié)構(gòu)是一棵兩層的樹,參考圖1,其中,主類型節(jié)點表示一種數(shù)據(jù)結(jié)構(gòu),圖中的主類型節(jié)點為接口數(shù)據(jù)結(jié)構(gòu)和路由數(shù)據(jù)結(jié)構(gòu);子類型節(jié)點表示對作為主類型節(jié)點數(shù)據(jù)的一次使用,圖中對應接口數(shù)據(jù)結(jié)構(gòu),有按三種不同的次序顯示接口信息的三個任務顯示任務1和顯示任務2,顯示任務3,分別對應圖中主類型節(jié)點為接口數(shù)據(jù)結(jié)構(gòu)的葉子節(jié)點中的三個葉子,表示同時有三個任務對其進行操作,顯示任務1和顯示任務2,顯示任務3三個任務進程在運行前,需要分別注冊一次對接口數(shù)據(jù)結(jié)構(gòu)的使用,以在各自的葉子節(jié)點中保存各自對共享數(shù)據(jù)的使用實例,因為在不同的任務中,顯示的接口可能不一樣,例如假設路由器有接口1到接口7共7個接口,顯示任務1需要顯示接口1和接口3,顯示任務2需要顯示接口2、接口3和接口4,而顯示任務3需要顯示接口4、接口5和接口7;對應路由數(shù)據(jù)結(jié)構(gòu),也有按三種不同的次序操作路由數(shù)據(jù)結(jié)構(gòu)的三個任務操作任務1和操作任務2,操作任務3,分別對應圖中主類型節(jié)點為路由數(shù)據(jù)結(jié)構(gòu)的葉子節(jié)點中的三個葉子,表示同時有三個任務對其進行操作。葉子節(jié)點中保存了當前操作的一些信息,例如當前顯示的接口信息。
圖中連接上下兩層的箭頭表示父子關(guān)系,同一層次之間的箭頭表示兄弟關(guān)系。使用上述鏈表樹對系統(tǒng)中所有可能掛起的任務進程進行管理,從圖中可以看出顯示任務1,顯示任務2,顯示任務3形成了兄弟關(guān)系。
守護鏈表樹與共享數(shù)據(jù)的關(guān)系如圖2所示,假設共享數(shù)據(jù)A為一數(shù)據(jù)鏈表,該表為由數(shù)據(jù)1到數(shù)據(jù)7共7個數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合,圖中有兩條分別由兩個任務控制的操作鏈表,它們的父節(jié)點都為主類型為同一共享數(shù)據(jù)A的節(jié)點。其中操作鏈表1操作由共享數(shù)據(jù)A的數(shù)據(jù)集合中的數(shù)據(jù)2、4和數(shù)據(jù)5構(gòu)成的子集,操作鏈表2操作由共享數(shù)據(jù)A的數(shù)據(jù)集合中的數(shù)據(jù)1、2、3、4和數(shù)據(jù)6構(gòu)成的子集。假定某一時刻,兩個操作都在操作數(shù)據(jù)2,那么主節(jié)點A的兩個葉子節(jié)點1和2中的數(shù)據(jù)指針都指向數(shù)據(jù)2。
假設此時有第三個任務把關(guān)鍵數(shù)據(jù)刪除了,此時如果不使用守護鏈表,那么操作鏈表1和操作鏈表2將無法找到下一個要操作的數(shù)據(jù),數(shù)據(jù)4和數(shù)據(jù)3,而且可能對已經(jīng)釋放的內(nèi)存進行操作。如果在刪除數(shù)據(jù)2之前,使兩個葉子節(jié)點1和2中的數(shù)據(jù)指針分別指向數(shù)據(jù)4和數(shù)據(jù)3,情況就改變,如圖3所示。
圖4是本發(fā)明實施例的流程圖。在圖4所述的實施例中,假如現(xiàn)在有兩個用戶1、2控制的兩個顯示任務進程1和2在同時使用顯示接口命令Show interface顯示接口信息,假定有接口1到接口6共6個接口,其中用戶1打算顯示2、4、5號接口,而用戶2顯示1、2、3、4、6接口,還有一個用戶3控制的任務進程具有刪除數(shù)據(jù)的能力。在使用守護鏈表之前,將所述守護鏈表的初始值設置為空,即守護鏈表的管理樹是空的。
首先顯示任務1執(zhí)行步驟1,在運行前,判斷所述守護鏈表中是否存在本任務進程使用的數(shù)據(jù)類型,因為此時守護鏈表中還不存在接口數(shù)據(jù)類型,因此,顯示任務1執(zhí)行步驟2,向所述守護鏈表注冊本任務進程使用的數(shù)據(jù)類型多個實例的數(shù)據(jù)集合,即接口數(shù)據(jù)類型,它包括由接口1到接口6共6個接口組成的數(shù)據(jù)集合,以所述數(shù)據(jù)集合為一個主類型節(jié)點,接著執(zhí)行步驟3,在所述主類型節(jié)點下,注冊一個名為任務1的葉子節(jié)點,用以保存對所述接口數(shù)據(jù)類型多個實例的數(shù)據(jù)集合本次使用所需要的任務進程的遍歷算法,也就是說,保存對本任務所要操作的數(shù)據(jù)類型多個實例的集合的一個數(shù)據(jù)子集以及操作所述數(shù)據(jù)子集所需要的指針。本例中,在由接口1到接口6共6個接口組成的數(shù)據(jù)集合中,選取2、4、5號接口作為一個數(shù)據(jù)操作子集,將該子集與指向該子集的指針保存到任務1葉子節(jié)點中,當然這種保存并不用物理復制出該自己保存,可以只保存2、4、5接口的標識。然后運行本任務進程;參考圖5;接著,顯示任務2也執(zhí)行步驟1,在運行前,判斷所述守護鏈表中是否存在本任務進程使用的數(shù)據(jù)類型,因為此時守護鏈表中已經(jīng)存在接口數(shù)據(jù)類型,因此,顯示任務2直接執(zhí)行步驟3,向守護鏈表中的接口節(jié)點下,注冊一個名為任務2的葉子節(jié)點,用以保存對所述接口數(shù)據(jù)類型多個實例的數(shù)據(jù)集合本次使用所需要的任務進程的遍歷算法,本例中,顯示任務2選取1、2、3、4、6號接口作為一個數(shù)據(jù)操作子集,將該子集與指向該子集的指針保存到任務2葉子節(jié)點中,然后運行本任務進程;參考圖6。
顯示任務1執(zhí)行步驟4,在顯示到接口2時,本任務進程掛起,并且等待用戶敲鍵盤,同時通知守護鏈表正在使用接口2,也就是通知所述守護鏈表中本任務進程注冊的葉子節(jié)點,即任務1葉子節(jié)點保存本任務進程所操作的數(shù)據(jù)子集中當前數(shù)據(jù),也就是使保存在本任務進程注冊的葉子節(jié)點任務1中的指針指向本任務進程所操作的數(shù)據(jù)子集中的當前數(shù)據(jù),即接口2,然后其他任務進程運行。參考圖7。
在顯示任務1掛起時,顯示任務2執(zhí)行步驟4,也在顯示到接口2時掛起,并且等待用戶敲鍵盤,并通知守護鏈表正在使用接口2,也就是使保存在任務進程2注冊的葉子節(jié)點任務2中的指針指向任務進程2所操作的數(shù)據(jù)子集中的當前數(shù)據(jù),即接口2,然后其他任務進程運行。參考圖8。
用戶3控制的任務進程在經(jīng)過步驟1到步驟4,執(zhí)行步驟5刪除接口2,執(zhí)行刪除操作時,通知所述守護鏈表,將與本任務進程具有共同父節(jié)點、且共享當前要刪除數(shù)據(jù)的其它所有葉子節(jié)點,將指針指向其對應的數(shù)據(jù)子集中的下一個要操作的數(shù)據(jù)。也就是通知守護鏈表,守護鏈表的將葉子節(jié)點任務1和任務2的當前指針向后移,分別指向接口4和接口3,參考圖9。
顯示任務1和顯示任務2分別執(zhí)行步驟5,在結(jié)束掛起時,通過所述守護鏈表中本任務進程注冊的葉子節(jié)點,取回本任務進程所操作的數(shù)據(jù)子集中當前數(shù)據(jù),也就是獲取保存在本任務進程注冊的葉子節(jié)點中的指針指向的本任務進程所操作的數(shù)據(jù)子集中的當前數(shù)據(jù)。由于葉子節(jié)點任務1和任務2中的指針已經(jīng)分別指向了各自的數(shù)據(jù)操作子集中的接口4和接口3,這樣顯示任務1和顯示任務2在結(jié)束掛起時,顯示任務1和顯示接口4,而顯示任務2顯示接口3。這樣就保證了顯示任務1和顯示任務2不會因為接口2的刪除導致無法再遍歷接口,甚至導致系統(tǒng)癱瘓。
當用戶1、2控制的兩個顯示任務進程1和2顯示任務1和顯示任務2以及用戶3控制的任務進程在各自完成使命后,分別通知守護鏈表刪除各自注冊的葉子節(jié)點,在刪除最后一個葉子節(jié)點后還要刪除響應的父節(jié)點,當所有任務進程結(jié)束后,所有父節(jié)點被刪除,守護鏈表又變成了空樹。
權(quán)利要求
1.一種多任務操作系統(tǒng)中任務進程的保護方法,該方法包括創(chuàng)建一個守護鏈表,對于可能產(chǎn)生掛起操作的任何一個任務進程,(1)在運行前,向所述守護鏈表注冊本任務進程使用的數(shù)據(jù)類型多個實例的數(shù)據(jù)集合,以所述數(shù)據(jù)集合為一個主類型節(jié)點,同時在所述主類型節(jié)點下,注冊一個葉子節(jié)點,用以保存對所述數(shù)據(jù)類型多個實例的數(shù)據(jù)集合本次使用所需要的本任務進程的遍歷算法,然后運行本任務進程;(2)本任務進程掛起時,通知所述守護鏈表中本任務進程注冊的葉子節(jié)點保存本任務進程所操作的數(shù)據(jù)子集中當前數(shù)據(jù),然后其他任務進程運行;(3)本任務進程結(jié)束掛起時,通過所述守護鏈表中本任務進程注冊的葉子節(jié)點,取回本任務進程所操作的數(shù)據(jù)子集中當前數(shù)據(jù);
2.根據(jù)權(quán)利要求1所述的任務進程的保護方法,其特征在于該方法還包括在向所述守護鏈表注冊本任務進程使用的數(shù)據(jù)類型多個實例的數(shù)據(jù)集合時,還要判斷所述守護鏈表中是否存在本任務進程使用的數(shù)據(jù)類型,如果存在,不需要注冊。
3.根據(jù)權(quán)利要求2所述的任務進程的保護方法,其特征在于將所述守護鏈表的初始值設置為空。
4.根據(jù)權(quán)利要求1、2或3所述的任務進程的保護方法,其特征在于,它還包括對于可能產(chǎn)生刪除操作的任何一個任務進程,在執(zhí)行刪除操作時,通知所述守護鏈表,將與本任務進程具有共同父節(jié)點、且共享當前要刪除數(shù)據(jù)的其它所有葉子節(jié)點的指針,指向其對應的數(shù)據(jù)子集中的下一個要操作的數(shù)據(jù)。
5.根據(jù)權(quán)利要求4所述的任務進程的保護方法,其特征在于所述保存本任務進程的遍歷算法,是保存對本任務所要操作的數(shù)據(jù)類型多個實例的集合的一個數(shù)據(jù)子集以及操作所述數(shù)據(jù)子集所需要的指針。
6.根據(jù)權(quán)利要求4所述的任務進程的保護方法,其特征在于所述在本任務進程掛起時,保存本任務進程所操作的數(shù)據(jù)子集中當前數(shù)據(jù),是使保存在本任務進程注冊的葉子節(jié)點中的指針指向本任務進程所操作的數(shù)據(jù)子集中的當前數(shù)據(jù)。
7.根據(jù)權(quán)利要求4所述的任務進程的保護方法,其特征在于所述在本任務進程結(jié)束掛起時,取回本任務進程所操作的數(shù)據(jù)子集中當前數(shù)據(jù),是獲取保存在本任務進程注冊的葉子節(jié)點中的指針指向的本任務進程所操作的數(shù)據(jù)子集中的當前數(shù)據(jù)。
全文摘要
本發(fā)明公開了一種多任務操作系統(tǒng)中任務進程的保護方法,該方法通過建立守護鏈表,在守護鏈表中建立本任務進程使用的數(shù)據(jù)類型的主節(jié)點下,注冊一個保存本任務進程一次使用的遍歷算法的葉子節(jié)點,在執(zhí)行刪除操作時,通知與本任務進程共享當前要刪除數(shù)據(jù)的其它所有葉子節(jié)點,將指針指向下一個要操作的數(shù)據(jù),使任何任務進程都能取回所操作的當前數(shù)據(jù),因此能夠?qū)蚕頂?shù)據(jù)的多個任務進程進行保護,避免任務進程的異?;蛳到y(tǒng)死機。
文檔編號H04L29/10GK1391386SQ0112933
公開日2003年1月15日 申請日期2001年6月12日 優(yōu)先權(quán)日2001年6月12日
發(fā)明者朱英明, 吳小前, 李莉 申請人:華為技術(shù)有限公司