麻豆精品无码国产在线播放,国产亚洲精品成人AA片新蒲金,国模无码大尺度一区二区三区,神马免费午夜福利剧场

線程棧的處理方法及系統與流程

文檔序號:11154297閱讀:358來源:國知局
線程棧的處理方法及系統與制造工藝

本發明涉及計算機的線程技術領域,特別是涉及一種線程棧的處理方法及系統。



背景技術:

線程技術是計算機軟件領域中并發處理業務的核心技術,其與CPU(Central Processing Unit,中央處理器)硬件直接關聯,且所有線程技術的實現原理一致。而維護線程棧內存又是線程技術的核心點之一,在POSIX Thread(多線程編程)的實現中,線程棧的內存空間大小通常默認設置或由用戶自己設置為一個不容易溢出的大小,但一旦被設置之后就不允許再被修改。通常情況下,線程棧的內存空間大小不需要很大,能夠滿足一般的函數調用就可以滿足程序線程的正常運行,但是如果調用比較大的函數時,如:在調用main函數(主函數)時將會使線程棧的內存空間不夠用,此時如果不能及時防止這種情況出現,會直接導致計算機宕機。



技術實現要素:

基于此,有必要針對傳統在調用較大的函數時線程棧的內存空間不夠用的問題,提供一種能夠有效避免線程棧溢出的線程棧的處理方法及系統。

為達到發明目的,提供一種線程棧的處理方法,所述處理方法包括:

根據線程調用的調用函數獲得所述調用函數對應的函數數據;

將所述函數數據寫入線程棧,并獲取所述函數數據在寫入所述線程棧時在所述線程棧中的棧頂地址;

判斷所述棧頂地址是否位于所述線程棧的棧保護區之內;

如果所述棧頂地址位于所述棧保護區內,則擴展所述線程棧的內存空間,并在擴展后的線程棧的內存空間中根據所述棧保護區的內存空間大小重新設置所述線程棧的棧保護區,使所述棧頂地址位于重設的棧保護區之外。

在其中一個實施例中,所述判斷所述棧頂地址是否位于所述線程棧的棧保護區之內的步驟包括:

獲取設置在所述棧保護區內的初始魔數數據,并由所述初始魔數數據中提取所述初始魔數數據的魔數偏移量和魔數占用空間;

根據所述線程棧終止地址和所述魔數偏移量確定所述初始魔數數據的魔數起始地址,并根據所述魔數起始地址和所述魔數占用空間確定所述初始魔數數據的魔數終止地址,其中,所述魔數起始地址與所述魔數終止地址界定的區間為所述初始魔數數據的魔數占用區;

當所述函數數據寫入所述線程棧時,獲取所述魔數占用區中的當前數據;

將所述當前數據與所述初始魔數數據進行比較,并在所述當前數據與所述初始魔數數據不一致時,確定所述棧頂地址位于所述棧保護區內。

在其中一個實施例中,所述擴展所述線程棧的內存空間的步驟包括:

根據所述線程棧的當前內存空間將所述線程棧的內存空間擴展為所述當前內存空間的預設倍數,擴展后的內存空間作為所述線程棧的新內存空間。

在其中一個實施例中,當所述初始魔數數據為多個,每個所述初始魔數數據對應有不同的魔數偏移量時;所述在擴展后的線程棧的內存空間中根據所述棧保護區的內存空間大小重新設置所述線程棧的棧保護區,使所述棧頂地址位于重設的棧保護區之外的步驟包括:

從多個所述初始魔數數據對應的魔數偏移量中獲得最大魔數偏移量,并根據所述最大魔數偏移量和所述魔數占用空間確定所述棧保護區的內存空間大小;

根據所述棧保護區的內存空間大小在所述線程棧的新內存空間中重設所述棧保護區的起始地址和終止地址,并將所述重設的棧保護區的起始地址作為新的棧保護區起始地址,將重設的棧保護區的終止地址作為新的線程棧終止地址;

判斷所述函數數據在所述線程棧中的所述棧頂地址是否位于所述重設的棧保護區內,并在所述棧頂地址位于所述重設的棧保護區內時返回所述根據所述初始內存空間將所述線程棧的內存空間擴展為所述初始內存空間的預設倍數的步驟,直至將所述函數數據全部寫入所述線程棧后所述函數數據的所述棧頂地址位于所述重設的棧保護區之外。

在其中一個實施例中,所述根據所述棧保護區的內存空間大小在所述線程棧的新內存空間中重設所述棧保護區的起始地址和終止地址,并將所述重設的棧保護區的起始地址作為新的棧保護區起始地址,將重設的棧保護區的終止地址作為新的線程棧終止地址的步驟之后,還包括:

將所述新的棧保護區起始地址和所述新的線程棧終止地址保存在相應的存儲單元中,以及

根據初始魔數數據的所述魔數偏移量和所述魔數占用空間在所述重設的棧保護區內設置新的魔數數據。

在其中一個實施例中,所述擴展所述線程棧的初始內存空間,并根據所述棧保護區的內存空間大小重新設置所述線程棧的棧保護區,使所述棧頂地址位于重設的棧保護區之外的步驟之后,還包括:

判斷所述調用函數是否結束,并在所述調用函數結束后,刪除寫入到所述線程棧中的所述函數數據;

釋放所述線程棧擴展的內存空間,保留所述線程棧的初始內存空間;

將所述線程棧的所述初始內存空間對應的所述棧保護區起始地址和所述線程棧終止地址重新寫入相應的存儲單元中。

本發明還提供一種線程棧的處理系統,所述處理系統包括:

函數數據獲取模塊,用于根據線程調用的調用函數獲得所述調用函數對應的函數數據;

棧頂地址獲取模塊,用于將所述函數數據寫入線程棧,并獲取所述函數數據在寫入所述線程棧時在所述線程棧中的棧頂地址;

第一判斷模塊,用于判斷所述棧頂地址是否位于所述線程棧的棧保護區之內;

擴展重設模塊,用于如果所述棧頂地址位于所述棧保護區內,則擴展所述線程棧的內存空間,并在擴展后的線程棧的內存空間中根據所述棧保護區的內存空間大小重新設置所述線程棧的棧保護區,使所述棧頂地址位于重設的棧保護區之外。

在其中一個實施例中,所述第一判斷模塊包括:

提取單元,用于獲取設置在所述棧保護區內的初始魔數數據,并由所述初始魔數數據中提取所述初始魔數數據的魔數偏移量和魔數占用空間;

第一確定單元,用于根據所述線程棧終止地址和所述魔數偏移量確定所述初始魔數數據的魔數起始地址,并根據所述魔數起始地址和所述魔數占用空間確定所述初始魔數數據的魔數終止地址,其中,所述魔數起始地址與所述魔數終止地址界定的區間為所述初始魔數數據的魔數占用區;

獲取單元,用于當所述函數數據寫入到所述線程棧后,獲取所述魔數占用區中的當前數據;

比較單元,用于將所述當前數據與所述初始魔數數據進行比較,并在所述當前數據與所述初始魔數數據不一致時,確定所述棧頂地址位于所述棧保護區內。

在其中一個實施例中,所述擴展重設模塊包括:

擴展單元,用于根據所述線程棧的當前內存空間將所述線程棧的內存空間擴展為所述當前內存空間的預設倍數,擴展后的內存空間作為所述線程棧的新內存空間。

在其中一個實施例中,當所述初始魔數數據為多個,每個所述初始魔數數據對應有不同的魔數偏移量時,所述擴展重設模塊還包括:

第二確定單元,用于從多個所述初始魔數數據對應的魔數偏移量中獲得最大魔數偏移量,并根據所述最大魔數偏移量和所述魔數占用空間確定所述棧保護區的內存空間大??;

重設單元,用于根據所述棧保護區的內存空間大小在所述線程棧的新內存空間中重設所述棧保護區的起始地址和終止地址,并將所述重設的棧保護區的起始地址作為新的棧保護區起始地址,將重設的棧保護區的終止地址作為新的線程棧終止地址;

判斷單元,用于判斷所述函數數據在所述線程棧中的所述棧頂地址是否位于所述重設的棧保護區內,并在所述棧頂地址位于所述重設的棧保護區內時返回所述擴展單元,直至將所述函數數據全部寫入所述線程棧后所述函數數據的所述棧頂地址位于所述重設的棧保護區之外。

在其中一個實施例中,所述擴展重設模塊還包括:

保存單元,用于在根據所述棧保護區的內存空間大小在所述線程棧的新內存空間中重設所述棧保護區的起始地址和終止地址之后,將所述新的棧保護區起始地址和所述新的線程棧終止地址保存在相應的存儲單元中;以及

設置單元,用于根據初始魔數數據的所述魔數偏移量和所述魔數占用空間在所述重設的棧保護區內設置新的魔數數據。

在其中一個實施例中,所述處理系統還包括:

第二判斷模塊,用于在擴展所述線程棧的初始內存空間,并根據所述棧保護區的內存空間大小重新設置所述線程棧的棧保護區,使所述棧頂地址位于重設的棧保護區之外后,判斷所述調用函數是否結束,并在所述調用函數結束后,刪除寫入到所述線程棧中的所述函數數據;

釋放保留模塊,用于釋放所述線程棧擴展的內存空間,保留所述線程棧的初始內存空間;

重寫模塊,用于將所述線程棧的所述初始內存空間對應的所述棧保護區起始地址和所述線程棧終止地址重新寫入相應的存儲單元中。

本發明的有益效果包括:

上述線程棧的處理方法及系統,通過獲取調用函數對應的函數數據在線程棧中的棧頂地址來實時有效地監控函數數據對線程棧的使用情況,通過在線程棧中設置棧保護區,并在函數數據在線程棧中的棧頂地址位于棧保護區內時,判定線程棧的當前內存空間即將使用完,從而及時地擴展線程棧的內存空間,以使棧頂地址始終位于棧安全區之內,避免函數數據溢出線程棧的現象。

附圖說明

圖1為一個實施例中的設置有棧保護區的線程棧的分布示意圖;

圖2為一個實施例中的線程棧的處理方法的流程示意圖;

圖3為一實施例中的圖2所示實施例中的步驟S300的流程示意圖;

圖4為一個實施例中的圖2所示實施例中的步驟S400的流程示意圖;

圖5為另一個實施例中的線程棧的處理方法的流程示意圖;

圖6為一個實施例中的線程棧的處理系統的結構示意圖。

具體實施方式

為了使本發明的目的、技術方案及優點更加清楚明白,以下結合附圖及實施例對本發明線程棧的處理方法及系統進行進一步詳細說明。應當理解,此處所描述的具體實施例僅用以解釋本發明,并不用于限定本發明。

在一個實施例中,如圖1、圖2所示,提供了一種線程棧的處理方法,該方法包括以下步驟:

S100,根據線程調用的調用函數獲得調用函數對應的函數數據。

S200,將函數數據寫入線程棧,并獲取函數數據在寫入線程棧時在線程棧中的棧頂地址。

S300,判斷棧頂地址是否位于線程棧的棧保護區之內。

S400,如果棧頂地址位于棧保護區內,則擴展線程棧的內存空間,并在擴展后的線程棧的內存空間中根據棧保護區的內存空間大小重新設置線程棧的棧保護區,使棧頂地址位于重設的棧保護區之外。

本實施例中,當線程調用函數后,會將其調用的調用函數對應的函數數據寫入到該線程對應的線程棧中,即在線程棧中申請一定的存儲空間用來存儲函數數據,而線程棧是一種運算受限的線性表,如圖1所示,其具有先進后出的特點,即其限制僅允許在表的一端進行插入和刪除運算,這一端稱為棧頂,相對地,把另一端稱為棧底,而線程棧整體的內存空間由線程棧起始地址(棧底地址)和線程棧終止地址(棧基地址)界定,當調用函數對應的函數數據在線程棧的一端寫入時,該函數數據在線程棧的寫入端的最頂位置即為棧頂地址,棧頂地址是隨著程序的運行而動態變化的,即棧頂地址是隨著函數數據的寫入而實時變化的,這樣在獲得線程棧的棧頂地址后,便可知道函數數據對線程棧的實時使用情況。在該線程棧中設置棧限制線從而將線程棧劃分為棧保護區和棧安全區。在一個實施例中,將線程棧劃分為棧保護區和棧安全區是通過在線程棧中設置魔數數據來實現的,魔數數據是內核自己定義的,其猶如密碼一樣不容易出現重復,棧保護區由魔數數據的魔數偏移量及其自身的魔數占用空間來確定,在首次確定棧保護區之后,棧保護區的內存空間大小將不會發生變化,即在后續擴展線程棧的內存空間后,并在線程棧的新內存空間中重設的棧保護區的內存空間大小與首次設置的棧保護區的內存空間大小一致。

由于線程棧具有先進后出的特點,在將函數數據寫入線程棧后,便可以獲得該函數數據在線程棧中的棧頂地址,然后判斷該棧頂地址是否超出了棧安全區,即棧頂地址是否位于棧保護區內,如果棧頂地址位于棧保護區,則說明該線程棧的內存空間即將被使用完,此時為了避免數據溢出線程棧的現象,需要擴展該線程棧的內存空間,并將擴展后的內存空間作為該線程棧的新內存空間,在該線程棧的新內存空間中重新設置棧保護區,該棧保護區的設置根據首次設置的棧保護區的內存空間大小來設置,即重設的棧保護區的內存空間大小與原來的棧保護區的內存空間大小相同,從而使得棧頂地址位于重設的棧保護區之外。此處需要說明的是,函數數據超出線程棧的線程棧終止地址時,將不存在棧頂地址,所以,此處的棧頂地址位于重設的棧保護區之外指的是棧頂地址位于擴展后的線程棧的棧安全區內,從而在調用比較大的函數時也能滿足數據對線程棧的需求,不會出現線程棧溢出的情況,程序能夠繼續正常執行下去,有效防止計算機的宕機。

本實施例中的線程棧的處理方法,通過獲取調用函數對應的函數數據在線程棧中的棧頂地址來實時有效地監控函數數據對線程棧的使用情況,通過在線程棧中設置棧保護區,并在函數數據在線程棧中的棧頂地址位于棧保護區內時,判定線程棧的當前內存空間即將使用完,從而及時地擴展線程棧的內存空間,以使棧頂地址始終位于棧安全區之內,避免函數數據溢出線程棧的現象。

需要說明的是,該實施例中的調用函數是用來調用主函數的,一般主函數對應的函數數據比較大,此時需要判斷線程棧是否夠用。其中,棧保護區為由棧保護區起始地址和線程棧終止地址界定的內存空間,棧保護區起始地址位于線程棧起始地址和線程棧終止地址之間。通常,設置棧保護區的內存空間小于線程棧的內存空間,優選地,棧保護區的內存空間小于線程棧的內存空間的一半。過大的棧保護區將造成線程棧內存空間的資源浪費,而過小的棧保護區則不能很好起到防止線程棧溢出的作用,因此,通常設置不是很大的內存空間,例如:200字節的空間內存,來作為棧保護區的內存空間。

在一個實施例中,線程棧的處理方法還包括步驟S400′,如果棧頂地址沒有位于棧保護區內,則將函數數據繼續寫入線程棧中。當棧頂地址沒有位于棧保護區內時,表明棧頂地址位于棧安全區時,則判定線程棧仍有充足的內存空間供函數數據使用,此時調用函數繼續執行,即該調用函數對應的函數數據繼續寫入線程棧。

在一個實施例中,參見圖3,步驟S300包括:

S310,獲取設置在棧保護區內的初始魔數數據,并由初始魔數數據中提取初始魔數數據的魔數偏移量和魔數占用空間。

S320,根據線程棧終止地址和魔數偏移量確定初始魔數數據的魔數起始地址,并根據魔數起始地址和魔數占用空間確定初始魔數數據的魔數終止地址。其中,魔數起始地址與所述魔數終止地址界定的區間為所述初始魔數數據的魔數占用區。

S330,當函數數據寫入到所述線程棧時,獲取魔數占用區中的當前數據。

S340,將當前數據與初始魔數數據進行比較,并在當前數據與初始魔數數據不一致時,確定棧頂地址位于棧保護區內。

上述實施例中為判斷棧頂地址是否位于棧保護區的一個具體實施方式,在線程棧中設置棧保護區時,是將線程棧中靠近線程棧終止地址的內存空間的一些字節使用魔數數據(magic number)來初始化,如果魔數數據只有一個的情況下,該魔數數據所在的位置就是棧限制線所在的位置,如果魔數數據有多個的情況下,偏離線程棧終止地址最遠位置的魔數數據(即偏移量最大的魔數數據)所在的位置為棧限制線所在的位置。首先獲得棧保護區內的初始魔數數據,并由這些初始魔數數據中提取魔數偏移量和魔數占用空間,由線程棧終止地址和各個初始魔數數據的魔數偏移量確定各個初始魔數數據的魔數起始地址,再由魔數起始地址和魔數占用空間確定各個初始魔數數據的魔數終止地址,每個初始魔數數據所在的內存空間由該初始魔數數據的魔數起始地址和魔數終止地址界定,這里稱為魔數占用區,在函數數據寫入線程棧時,獲取這些魔數占用區中的當前數據,判斷當前數據和初始魔數數據是否一致,如果一致,說明函數數據還沒有寫入到初始魔數數據所在的位置處,即函數數據在線程棧中的棧頂地址還沒進入棧保護區,此時線程棧還有充足的內存空間供函數數據寫入,如果不一致,則說明函數數據已寫入到初始魔數數據所在的位置處,即函數數據在線程棧中的棧頂地址已進入棧保護區,此時線程棧即將被用完,需要擴展線程棧的初始內存空間,以使線程棧有充足的內存空間供函數數據使用。

需要說明的是,當函數數據寫入到初始魔數數據所在的魔數占用區時,函數數據將初始魔數數據覆蓋,從而使該魔數占用區內的數據發生變化。

優選地,在一個實施例中,初始魔數數據為多個,每個初始魔數數據對應有不同的魔數偏移量,即使得多個初始魔數數據分別位于棧保護區的不同位置,這樣相當于在棧保護區內設置了多道棧限制線,使得在第一道棧限制線失效的情況下,第二道棧限制線……第N道棧限制線也會起作用,從而進一步防止了線程棧溢出的情況發生。進一步地,每個初始魔數數據的魔數占用空間相同,便于辨識。當然,每個初始魔數數據的占用空間也可不相同。在一個實施例中,每個初始魔數數據的占用四個字節。

例如:在一個具體的實施例中,初始魔數數據包括第一初始魔數數據STACK_MAGIC1,第二初始魔數數據STACK_MAGIC2和第三初始魔數數據STACK_MAGIC3,三個初始魔數數據定義如下:

#define STACK_MAGIC1 0XEACD1532

#define STACK_MAGIC2 0XD3C56234

#define STACK_MAGIC3 0XF31AB123

更進一步地,三個初始魔數數據的偏移量(STACK_MAGIC1_OFFSET、STACK_MAGIC2_OFFSET、STACK_MAGIC3_OFFSET)定義如下:

#define STACK_MAGIC1_OFFSET 4*SIZEOF(INT4)

#define STACK_MAGIC2_OFFSET 15*SIZEOF(INT4)

#define STACK_MAGIC3_OFFSET 55*SIZEOF(INT4)

即第一初始魔數數據的具體數據為“0XEACD1532”,第二初始魔數數據的具體數據為“0XD3C56234”,第三初始魔數數據為“0XF31AB123”,上述初始魔數數據均用16進制表示,每個初始魔數數據占用4個字節,即32位。其中,第一初始魔數數據偏移16個字節,第二初始魔數數據偏移60個字節,第三初始魔數數據偏移220個字節。第三初始魔數數據距離線程棧終止地址最遠,其魔數偏移量為220個字節,其魔數占用空間為4個字節,從而確定棧保護區的大小為220+4=224個字節。

在一個實施例中,參見圖4,步驟S400包括:

S410,根據線程棧的當前內存空間將線程棧的內存空間擴展為當前內存空間的預設倍數,擴展后的內存空間作為線程棧的新內存空間。

上述步驟為線程棧內存空間擴展的一種具體實施方式,這種實施方式較易于實施,只需根據線程棧的當前內存空間的大小在內存中申請一段連續的新內存空間,這個新內存空間為線程棧的當前內存空間的預設倍數,然后將當前內存空間拷貝到新內存空間中,從而實現線程棧內存空間的擴展。優選地,線程棧的新內存空間為當前內存空間的兩倍,這樣既能實現避免線程棧的溢出,又能避免申請過多的內存空間造成資源的浪費。在另外一個實施例中,在擴展線程棧的內存空間時,也可根據該線程棧的初始內存空間進行擴展,例如:當第一次確定棧頂地址位于棧保護區內時,將線程棧的內存空間擴展為初始內存空間的兩倍,當第二次確定棧頂地址位于重設的棧保護區內時,將線程棧的內存空間擴展為初始內存空間的三倍,以此類推,以滿足線程對線程棧的需求,避免線程棧的溢出。

在一個實施例中,當初始魔數數據為多個時,步驟S400還包括:

S420,從多個初始魔數數據對應的魔數偏移量中獲得最大魔數偏移量,并根據最大魔數偏移量和所述魔數占用空間確定棧保護區的內存空間大小。

上述步驟S420為初始魔數數據為多個情況,根據多個初始魔數數據中偏移量最大的初始魔數數據的魔數偏移量及其魔數占用空間確定棧保護區的內存空間大小。通常情況下,每個初始魔數數據的魔數占用空間都相同,所以無需特意的去獲取偏移量最大的初始魔數數據的魔數占用空間。在初始魔數數據僅為一個的情況下,只需獲得該初始魔數數據的魔數偏移量及魔數占用空間便可得到棧保護區的內存空間大小。

S430,根據棧保護區的內存空間大小在線程棧的新內存空間中重設棧保護區的起始地址和終止地址,并將重設的棧保護區的起始地址作為新的棧保護區起始地址,將重設的棧保護區的終止地址作為新的線程棧終止地址。

在得到線程棧的新內存空間后,便可知該線程棧的新的線程棧起始地址和新的線程棧終止地址,并在確定棧保護區的內存空間大小后,從新的線程棧終止地址開始向線程棧內偏移棧保護區的內存空間大小后的位置處作為重設的棧保護區的起始地址,即新的棧保護區起始地址(棧限制線),而新的線程棧終止地址即為重設后的棧保護區的終止地址。

S440,判斷函數數據在線程棧中的棧頂地址是否位于重設的棧保護區內,并在棧頂地址位于重設的棧保護區內時返回步驟S410,直至將函數數據全部寫入線程棧后函數數據的棧頂地址位于重設的棧保護區之外。

在擴展線程棧的內存空間得到線程棧的新內存空間和得到重設的棧保護區后,函數數據會繼續在線程棧的新內存空間中寫入,此時繼續判斷函數數據在線程棧中的棧頂地址是否位于重設的棧保護區內,如果棧頂地址再次落入棧保護區內,則再次擴展線程棧的棧保護區,即返回步驟S410,直至函數數據在線程棧內全部寫完,且仍位于線程棧的棧安全區內,從而有效地防止了函數數據在線程棧中的溢出。

在一個實施例中,在步驟S430之后,還包括:

S430a,將新的棧保護區起始地址和新的線程棧終止地址保存在相應的存儲單元中。

將新的棧保護區起始地址和新的線程棧終止地址保存在相應的存儲單元中,便于判斷棧頂地址是否位于棧保護區及再次擴展線程棧時方便新的棧保護區的設置。在一個實施例中,將新的棧保護區起始地址和新的線程棧終止地址取代保存在存儲單元中的原有的相應的地址信息,以避免資源的浪費。優選地,存儲單元為中央處理單元的寄存器。

S430b,根據初始魔數數據的魔數偏移量和魔數占用空間在重設后的棧保護區內設置新的魔數數據。

在線程棧的新內存空間中重新設置好棧保護區后,為了達到多重保障防止線程棧溢出的效果,需要在重設的棧保護區內設置多個魔數數據,優選地,在重設的棧保護區內設置的多個魔數數據與初始魔數數據的魔數偏移量和魔數占用空間相同,從而實現與線程棧的初始內存空間相同的多重保障效果,并且這樣也使得新的魔數數據的設置變得簡單。當然,在重設的棧保護區內設置新的魔數數據時,也可以設置與初始魔數數據的魔數偏移量和魔數占用空間不相同的新的魔數數據。通常初始魔數數據的魔數偏移量是一種最優的實施方式,例如:第一初始魔數數據偏移線程棧終止地址較近、第二初始魔數數據偏移線程棧終止地址稍遠些、第三初始魔數數據偏移線程棧終止地址最遠,在距離線程棧終止地址較近的位置處設置較多的魔數數據,因此設置新的魔數數據與初始魔數數據相同的魔數偏移量和魔數占用空間,可以很好地保障線程棧不會溢出。

需要說明的是,上述步驟S430a和步驟S430b只是為了便于說明,兩個步驟之間并不存在先后順序。

在一個實施例中,參見圖5,在步驟S400之后,線程棧的處理方法還包括:

S500,判斷調用函數是否結束,并在調用函數結束后,刪除寫入到線程棧中的函數數據。

S600,釋放線程棧擴展的內存空間,保留線程棧的初始內存空間。

S700,將線程棧的初始內存空間對應的棧保護區起始地址和線程棧終止地址重新寫入相應的存儲單元中。

調用函數結束后,首先,刪除寫入到線程棧中的函數數據,減少對線程棧內存空間的占用。然后,釋放線程棧中擴展的內存空間,只保留線程棧中的初始內存空間,從而使線程棧在整個過程中好像沒有改變過一樣,這樣能夠減少線程棧在計算機的物理內存空間中占用,從而實現在極端情況下滿足線程棧需求的同時,降低對計算機物理內存空間的占用,提高計算機中央處理器的處理效率。步驟S700是根據具體的情況而定,如果重設的棧保護區(新的棧保護區)的起始地址和新的線程棧終止地址不是取代保存在存儲單元中的原有的相應的地址信息,而只是保存在存儲單元中,則只需將新的棧保護區起始地址和新的線程棧終止地址從存儲單元中刪除即可,如果是取代的方式,則將線程棧的初始內存空間對應的棧保護區起始地址和線程棧終止地址重新寫入相應的存儲單元中。在整個實施過程中,可默認為線程棧起始地址不變。

本領域普通技術人員可以理解實現上述實施例方法中的全部或部分流程,是可以通過計算機程序來指令相關的硬件來完成,所述的程序可存儲于一計算機可讀取存儲介質中,該程序在執行時,可包括如上述各方法的實施例的流程。其中,所述的存儲介質可為磁碟、光盤、只讀存儲記憶體(Read-Only Memory,ROM)或隨機存儲記憶體(Random Access Memory,RAM)等。

在一個實施例中,如圖6所示,還提供了一種線程棧的處理系統,該系統包括:函數數據獲取模塊100,用于根據線程調用的調用函數獲得所述調用函數對應的函數數據。棧頂地址獲取模塊200,用于將函數數據寫入線程棧,并獲取函數數據在寫入線程棧時在線程棧中的棧頂地址。第一判斷模塊300,用于判斷棧頂地址是否位于所述線程棧的棧保護區之內。擴展重設模塊400,用于如果棧頂地址位于棧保護區內,則擴展線程棧的內存空間,并在擴展后的線程棧的內存空間中根據棧保護區的內存空間大小重新設置線程棧的棧保護區,使棧頂地址位于重設的棧保護區之外。

本實施例中的線程棧的處理系統,通過獲取調用函數對應的函數數據在線程棧中的棧頂地址來實時有效地監控函數數據對線程棧的使用情況,通過在線程棧中設置棧保護區,并在函數數據在線程棧中的棧頂地址位于棧保護區內時,判定線程棧的當前內存空間即將使用完,從而及時地擴展線程棧的內存空間,以使棧頂地址始終位于棧安全區之內,避免函數數據溢出線程棧的現象。

其中,棧保護區為由所述棧保護區起始地址和所述線程棧終止地址界定的內存空間,棧保護區起始地址位于線程棧起始地址和線程棧終止地址之間。

在一個實施例中,第一判斷模塊300包括:提取單元310,用于獲取設置在棧保護區內的初始魔數數據,并由初始魔數數據中提取所述初始魔數數據的魔數偏移量和魔數占用空間;第一確定單元320,用于根據線程棧終止地址和魔數偏移量確定初始魔數數據的魔數起始地址,并根據魔數起始地址和所述魔數占用空間確定所述初始魔數數據的魔數終止地址,其中,魔數起始地址與所述魔數終止地址界定的區間為初始魔數數據的魔數占用區;獲取單元330,用于當所述函數數據寫入到線程棧后,獲取所述魔數占用區中的當前數據;以及比較單元340,用于將當前數據與初始魔數數據進行比較,并在當前數據與初始魔數數據不一致時,確定棧頂地址位于所述棧保護區內。

在一個實施例中,擴展重設模塊400包括:擴展單元410,用于根據線程棧的當前內存空間將線程棧的內存空間擴展為當前內存空間的預設倍數,擴展后的內存空間作為線程棧的新內存空間。

在一個實施例中,當初始魔數數據為多個,每個初始魔數數據對應有不同的魔數偏移量時,擴展重設模塊400還包括:第二確定單元420,用于從多個初始魔數數據對應的魔數偏移量中獲得最大魔數偏移量,并根據最大魔數偏移量和魔數占用空間確定棧保護區的內存空間大?。恢卦O單元430,用于根據所述棧保護區的內存空間大小在線程棧的新內存空間中重設棧保護區的起始地址和終止地址,并將重設的棧保護區的起始地址作為新的棧保護區起始地址,將重設的棧保護區的終止地址作為新的線程棧終止地址;以及判斷單元440,用于判斷函數數據在所述線程棧中的所述棧頂地址是否位于所述重設的棧保護區內,并在所述棧頂地址位于重設的棧保護區內時返回所述擴展單元410,直至將函數數據全部寫入線程棧后函數數據的棧頂地址位于重設的棧保護區之外。

在一個實施例中,擴展重設模塊400還包括:保存單元430a,用于在根據棧保護區的內存空間大小在線程棧的新內存空間中重設棧保護區的起始地址和終止地址之后,將新的棧保護區起始地址和新的線程棧終止地址保存在相應的存儲單元中;以及設置單元430b,用于根據初始魔數數據的魔數偏移量和魔數占用空間在重設的棧保護區內設置新的魔數數據。

在一個實施例中,系統還包括:第二判斷模塊500,用于在擴展所述線程棧的初始內存空間,并根據所述棧保護區的內存空間大小重新設置所述線程棧的棧保護區,使棧頂地址位于重設的棧保護區之外后,判斷所述調用函數是否結束,并在所述調用函數結束后,刪除寫入到所述線程棧中的所述函數數據;釋放保留模塊600,用于釋放線程棧擴展的內存空間,保留線程棧的初始內存空間;以及重寫模塊700,用于將線程棧的初始內存空間對應的所述棧保護區起始地址和線程棧終止地址重新寫入相應的存儲單元中。

由于此系統解決問題的原理與前述一種線程棧的處理方法相似,因此該系統的實施可以參見前述方法的實施,重復之處不再贅述。

以上所述實施例的各技術特征可以進行任意的組合,為使描述簡潔,未對上述實施例中的各個技術特征所有可能的組合都進行描述,然而,只要這些技術特征的組合不存在矛盾,都應當認為是本說明書記載的范圍。

以上所述實施例僅表達了本發明的幾種實施方式,其描述較為具體和詳細,但并不能因此而理解為對發明專利范圍的限制。應當指出的是,對于本領域的普通技術人員來說,在不脫離本發明構思的前提下,還可以做出若干變形和改進,這些都屬于本發明的保護范圍。因此,本發明專利的保護范圍應以所附權利要求為準。

當前第1頁1 2 3 
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
主站蜘蛛池模板: 鲁山县| 泰安市| 泗水县| 双桥区| 故城县| 富锦市| 五台县| 永宁县| 陆川县| 将乐县| 新和县| 双桥区| 平安县| 金溪县| 天气| 长垣县| 三江| 黎川县| 安化县| 彭水| 寿阳县| 井研县| 西乌| 苗栗县| 漾濞| 英超| 邳州市| 济源市| 甘洛县| 建水县| 陕西省| 金川县| 砚山县| 镇安县| 青冈县| 永嘉县| 怀远县| 河津市| 新晃| 班戈县| 莲花县|