国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      內(nèi)存管理的方法及內(nèi)存管理系統(tǒng)與流程

      文檔序號(hào):12664926閱讀:342來(lái)源:國(guó)知局
      內(nèi)存管理的方法及內(nèi)存管理系統(tǒng)與流程

      本申請(qǐng)實(shí)施例涉及計(jì)算機(jī)存儲(chǔ)領(lǐng)域,并且更具體地,涉及內(nèi)存管理的方法及內(nèi)存管理系統(tǒng)。



      背景技術(shù):

      內(nèi)存管理是存儲(chǔ)系統(tǒng)中一項(xiàng)重要的系統(tǒng)基礎(chǔ)服務(wù),能夠管理系統(tǒng)輸入/輸出(Input/Output,IO)模塊和業(yè)務(wù)模塊的內(nèi)存申請(qǐng)和釋放,以及對(duì)高性能的系統(tǒng)提供基礎(chǔ)的服務(wù),避免系統(tǒng)在IO路徑中因內(nèi)存資源緊張導(dǎo)致存儲(chǔ)業(yè)務(wù)異常,最終影響為上層的業(yè)務(wù)提供服務(wù)。

      內(nèi)存管理是通過(guò)一系列算法對(duì)系統(tǒng)的內(nèi)存進(jìn)行管理,如linux內(nèi)存中的內(nèi)存的管理算法有內(nèi)存管理伙伴算法(buddy)算法、分配機(jī)制算法(slab)等。此外,存儲(chǔ)系統(tǒng)可以作為大型系統(tǒng)中的核心的部分,且當(dāng)前業(yè)界主流的趨向是存儲(chǔ)云化,因而出現(xiàn)了各種基于X86服務(wù)器的分布式存儲(chǔ),如開(kāi)源的分布式存儲(chǔ)(Ceph)等產(chǎn)品。這些存儲(chǔ)的特點(diǎn)是把它們的核心進(jìn)程部署在Linux的用戶態(tài),以及對(duì)系統(tǒng)的資源進(jìn)行預(yù)申請(qǐng)分配,這樣系統(tǒng)在運(yùn)行過(guò)程中,避免動(dòng)態(tài)的向Linux系統(tǒng)中分配和釋放資源,保證它們的系統(tǒng)運(yùn)行正常的同時(shí),避免在IO的過(guò)程中因?yàn)闃I(yè)務(wù)的需求頻繁的向系統(tǒng)申請(qǐng)和釋放內(nèi)存,給系統(tǒng)帶來(lái)大量的CPU的開(kāi)銷。更重要的是,如果底層存儲(chǔ)的大量系統(tǒng)資源因系統(tǒng)內(nèi)存資源不夠而申請(qǐng)不到內(nèi)存,會(huì)對(duì)上層的系統(tǒng)的業(yè)務(wù)造成影響巨大。因此,存儲(chǔ)系統(tǒng)通常都會(huì)對(duì)存儲(chǔ)系統(tǒng)所需要的所有涉及到的內(nèi)存自己進(jìn)行管理。

      現(xiàn)有技術(shù)中,采用定長(zhǎng)內(nèi)存的簡(jiǎn)單的隊(duì)列(即鏈表的方式)實(shí)現(xiàn)對(duì)內(nèi)存的管理,在業(yè)務(wù)申請(qǐng)內(nèi)存和釋放內(nèi)存的線程個(gè)數(shù)不只一個(gè)時(shí),需要配置互斥鎖,但是線程個(gè)數(shù)太多時(shí),互斥鎖的沖突也比較嚴(yán)重,系統(tǒng)并發(fā)能力較低。



      技術(shù)實(shí)現(xiàn)要素:

      本申請(qǐng)實(shí)施例提供了一種內(nèi)存管理的方法及內(nèi)存管理系統(tǒng),能夠降低鎖沖突,以及提高系統(tǒng)并發(fā)能力。

      第一方面,提供了一種內(nèi)存管理的方法,該方法應(yīng)用于包括內(nèi)存管理模塊和多個(gè)第一線程模塊的內(nèi)存管理系統(tǒng)中,該內(nèi)存管理模塊用于管理多個(gè)內(nèi)存空間,且該多個(gè)內(nèi)存空間中的第一內(nèi)存空間包括多個(gè)第一內(nèi)存,該第一內(nèi)存的容量為定值,該第一線程模塊用于管理第二內(nèi)存空間,該第二內(nèi)存空間包括至少一個(gè)該第一內(nèi)存,該方法包括:該第一線程模塊接收業(yè)務(wù)數(shù)據(jù);該第一線程模塊確定該第二內(nèi)存空間是否滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求;在該第二內(nèi)存空間滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),該第一線程模塊使用該第二內(nèi)存空間中的內(nèi)存,處理該業(yè)務(wù)數(shù)據(jù)。

      第一業(yè)務(wù)線程接收業(yè)務(wù)數(shù)據(jù),確定第二內(nèi)存空間是否能夠滿足該業(yè)務(wù)數(shù)據(jù)需求的內(nèi)存大小,在該第二內(nèi)存空間滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),根據(jù)該第二內(nèi)存空間中的內(nèi)存,處理該業(yè)務(wù)數(shù)據(jù)。這樣,在多個(gè)業(yè)務(wù)線程場(chǎng)景下,不同線程模塊分別通過(guò)各自的第二內(nèi)存空間處理業(yè)務(wù)數(shù)據(jù),避免了多個(gè)線程模塊同時(shí)處理業(yè)務(wù)數(shù)據(jù)時(shí),內(nèi)存管理模塊想要通過(guò)內(nèi)存鏈表上的管理鎖鎖定第一內(nèi)存空間的所有內(nèi)存造成的鎖沖突,從而減少了鎖開(kāi)銷,提高了系統(tǒng)的并發(fā)能力。

      在一些可能的實(shí)現(xiàn)方式中,該方法還包括:在該第二內(nèi)存空間不滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),該第一線程模塊向該內(nèi)存管理模塊發(fā)送內(nèi)存請(qǐng)求,該內(nèi)存請(qǐng)求用于請(qǐng)求從該第一內(nèi)存空間申請(qǐng)內(nèi)存;該內(nèi)存管理模塊根據(jù)該內(nèi)存請(qǐng)求,分配內(nèi)存,并對(duì)該第一內(nèi)存空間設(shè)置第一管理鎖,該第一管理鎖用于控制該第一內(nèi)存空間中內(nèi)存的訪問(wèn);該內(nèi)存管理模塊為該第一線程模塊配置內(nèi)存,并釋放該第一管理鎖;該第一線程線程模塊將該配置的內(nèi)存存儲(chǔ)到該第二內(nèi)存空間,以使該第二內(nèi)存空間能夠滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求。

      每個(gè)第一線程模塊在第二內(nèi)存空間不能滿足需求時(shí),從內(nèi)存管理模塊申請(qǐng)內(nèi)存,也就是說(shuō),每個(gè)第一線程仍然能夠通過(guò)各自的第二內(nèi)存空間處理業(yè)務(wù)數(shù)據(jù),避免了多個(gè)線程模塊同時(shí)處理業(yè)務(wù)數(shù)據(jù)時(shí),內(nèi)存管理模塊想要通過(guò)內(nèi)存鏈表上的管理鎖鎖定第一內(nèi)存空間的所有內(nèi)存造成的鎖沖突,從而減少了鎖開(kāi)銷,提高了系統(tǒng)的并發(fā)能力。

      在一些可能的實(shí)現(xiàn)方式中,該內(nèi)存管理模塊根據(jù)該內(nèi)存請(qǐng)求,分配內(nèi)存包括:該內(nèi)存管理模塊根據(jù)該內(nèi)存請(qǐng)求,分配該第一內(nèi)存空間中的至少一個(gè)第一內(nèi)存集合,該第一內(nèi)存空間包括多個(gè)第一內(nèi)存集合,該第一內(nèi)存集合包括至少兩個(gè)該第一內(nèi)存;其中,該內(nèi)存管理模塊向該第一線程模塊發(fā)送內(nèi)存包括:該內(nèi)存管理模塊向該第一線程模塊發(fā)送該至少一個(gè)內(nèi)存集合。

      在第一線程模塊需要大量?jī)?nèi)存的情況下,避免了一一遍歷每個(gè)內(nèi)存,從而能夠節(jié)省時(shí)延。

      在一些可能的實(shí)現(xiàn)方式中,該方法還包括:該內(nèi)存管理模塊為該多個(gè)第一內(nèi)存集合中的每個(gè)第一內(nèi)存集合配置內(nèi)存索引值;其中,該內(nèi)存管理模塊根據(jù)該內(nèi)存請(qǐng)求,分配至少一個(gè)第一內(nèi)存集合包括:該內(nèi)存管理模塊根據(jù)該內(nèi)存請(qǐng)求和該內(nèi)存索引值,分配該至少一個(gè)第一內(nèi)存集合。

      在第一線程模塊需要批量獲取內(nèi)存時(shí),可以快速的批量配置內(nèi)存,且只需要修改幾個(gè)指針,節(jié)省了開(kāi)銷。

      在一些可能的實(shí)現(xiàn)方式中,在該第一線程模塊確定該第二內(nèi)存空間是否滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求之前,該方法還包括:該第一線程模塊向該內(nèi)存管理模塊發(fā)送第一注冊(cè)請(qǐng)求,該第一注冊(cè)請(qǐng)求用于向該內(nèi)存管理模塊請(qǐng)求內(nèi)存;該內(nèi)存管理模塊根據(jù)該第一注冊(cè)請(qǐng)求,向該第一線程模塊發(fā)送至少一個(gè)該第一內(nèi)存;該第一線程模塊根據(jù)該至少一個(gè)該第一內(nèi)存,生成該第二內(nèi)存空間。

      第一線程模塊可以提前獲取內(nèi)存,進(jìn)而用于處理業(yè)務(wù)數(shù)據(jù),而不需要在需要內(nèi)存時(shí)才從第一內(nèi)存空間中獲取內(nèi)存,節(jié)省業(yè)務(wù)數(shù)據(jù)處理時(shí)延。

      在一些可能的實(shí)現(xiàn)方式中,該內(nèi)存管理系統(tǒng)還包括第二線程模塊;其中,該第一線程模塊根據(jù)該第二內(nèi)存空間中的內(nèi)存,處理該業(yè)務(wù)數(shù)據(jù)包括:該第一線程模塊將該業(yè)務(wù)數(shù)據(jù)封裝在該第二內(nèi)存空間中的內(nèi)存中生成業(yè)務(wù)消息;該第一線程模塊向該第二線程模塊發(fā)送該業(yè)務(wù)消息。

      第一線程模塊根據(jù)第二內(nèi)存空間中的內(nèi)存可以處理業(yè)務(wù)數(shù)據(jù),具體可以是將業(yè)務(wù)數(shù)據(jù)封裝在第二內(nèi)存空間的內(nèi)存中生成業(yè)務(wù)消息,發(fā)送給內(nèi)存管理系統(tǒng)中的第二線程模塊。

      在一些可能的實(shí)現(xiàn)方式中,該方法還包括:該第二線程模塊向該內(nèi)存管理模塊發(fā)送第二注冊(cè)請(qǐng)求,該第二注冊(cè)請(qǐng)求用于向該內(nèi)存管理模塊請(qǐng)求內(nèi)存;該內(nèi)存管理模塊根據(jù)該第二注冊(cè)請(qǐng)求,向該第二線程模塊發(fā)送至少一個(gè)該第一內(nèi)存;該第二線程模塊根據(jù)該至少一個(gè)該第一內(nèi)存,生成第三內(nèi)存空間。

      第二線程模塊可以提前獲取內(nèi)存,進(jìn)而用于處理業(yè)務(wù)數(shù)據(jù),而不需要在需要內(nèi)存時(shí)才從第一內(nèi)存空間中獲取內(nèi)存,節(jié)省業(yè)務(wù)數(shù)據(jù)處理時(shí)延。

      在一些可能的實(shí)現(xiàn)方式中,該第一線程模塊為業(yè)務(wù)線程模塊,該第二線程模塊為網(wǎng)絡(luò)線程模塊,該方法還包括:該第二線程模塊向存儲(chǔ)節(jié)點(diǎn)發(fā)送該業(yè)務(wù)消息;該第二線程模塊向該存儲(chǔ)節(jié)點(diǎn)發(fā)送該業(yè)務(wù)消息之后,為該第三內(nèi)存空間設(shè)置第二管理鎖,并修改該第三內(nèi)存空間的內(nèi)存使用計(jì)數(shù)和業(yè)務(wù)路徑,該第二管理鎖用于控制對(duì)該內(nèi)存使用計(jì)數(shù)和該業(yè)務(wù)路徑的修改,且該第二管理鎖不同于該第一管理鎖。

      該內(nèi)存使用計(jì)數(shù)用于檢測(cè)該業(yè)務(wù)消息占用的內(nèi)存是否使用完成,而業(yè)務(wù)路徑用于在系統(tǒng)內(nèi)存泄露,踩內(nèi)存等異常時(shí),可以快速的定位問(wèn)題。這樣在滿足內(nèi)存定位等輔助設(shè)計(jì)需求的同時(shí),避免設(shè)置相同的管理鎖造成的鎖沖突。

      在一些可能的實(shí)現(xiàn)方式中,該第一線程模塊為網(wǎng)絡(luò)線程模塊,該第二線程模塊為業(yè)務(wù)線程模塊,該方法還包括:該第二線程模塊向用戶發(fā)送該業(yè)務(wù)消息;在該第二線模塊向該用戶發(fā)送該業(yè)務(wù)消息之后,該第二線程模塊為該第三內(nèi)存空間設(shè)置第二管理鎖,并修改該第三內(nèi)存空間的內(nèi)存使用計(jì)數(shù)和業(yè)務(wù)路徑,該第二管理鎖用于控制對(duì)該內(nèi)存使用計(jì)數(shù)和該業(yè)務(wù)路徑的修改,且該第二管理鎖不同于該第一管理鎖。

      在滿足內(nèi)存定位等輔助設(shè)計(jì)需求的同時(shí),避免設(shè)置相同的管理鎖造成的鎖沖突。

      在一些可能的實(shí)現(xiàn)方式中,該方法還包括:該第二線程模塊根據(jù)該內(nèi)存使用計(jì)數(shù),確定是否釋放該業(yè)務(wù)消息所占用的內(nèi)存。

      第二線程模塊在業(yè)務(wù)消息占用的內(nèi)存使用完成后,對(duì)該內(nèi)存進(jìn)行釋放,進(jìn)而可以供其他業(yè)務(wù)消息使用,提高了內(nèi)存使用率。

      在一些可能的實(shí)現(xiàn)方式中,該第三內(nèi)存空間包括第一鏈表和第二鏈表,該內(nèi)存使用計(jì)數(shù)的初始預(yù)設(shè)值為1,且該內(nèi)存使用計(jì)數(shù)在對(duì)應(yīng)的內(nèi)存處于占用狀態(tài)時(shí)加1,處于空閑狀態(tài)時(shí)減1;其中,該第二線程模塊根據(jù)該內(nèi)存使用計(jì)數(shù),確定是否釋放該業(yè)務(wù)消息所占用的內(nèi)存包括:在該內(nèi)存使用計(jì)數(shù)為1時(shí),該第二線程模塊將該業(yè)務(wù)消息所占用的內(nèi)存釋放到該第二鏈表中;在該第二鏈表中內(nèi)存?zhèn)€數(shù)超過(guò)第一數(shù)目閾值時(shí),該第二線程模塊將該業(yè)務(wù)消息所占用的剩余內(nèi)存釋放到該第一鏈表中。

      該第三內(nèi)存空間包括第一鏈表和第二鏈表,該第一鏈表和第二鏈表用于存儲(chǔ)該第三內(nèi)存空間中的至少一個(gè)第一內(nèi)存。也就是說(shuō),該第三內(nèi)存空間中的至少一個(gè)第一內(nèi)存可以通過(guò)鏈表的形式管理,例如以free list鏈表(表示為第一鏈表)為例,當(dāng)free list鏈表中的內(nèi)存?zhèn)€數(shù)超過(guò)的低水位(表示為第一數(shù)目閾值),即不再放入free list鏈表中,而是放入unit list鏈表(表示為第二鏈表)中。這樣能夠方便后續(xù)批量回收f(shuō)ree list中的內(nèi)存,提高了回收效率。

      在一些可能的實(shí)現(xiàn)方式中,該方法還包括:在該第三內(nèi)存空間中的內(nèi)存?zhèn)€數(shù)超過(guò)第二數(shù)目閾值時(shí),該第二線程模塊將該第二鏈表中的內(nèi)存釋放到該第一內(nèi)存空間。

      內(nèi)存管理模塊可以將第三內(nèi)存空間中部分的內(nèi)存回收到第一內(nèi)存空間中,這樣可以避免個(gè)別業(yè)務(wù)線程因?yàn)镮O不均等的問(wèn)題把資源全占用了。

      第二方面,提供了一種內(nèi)存管理系統(tǒng),該內(nèi)存管理系統(tǒng)包括用于執(zhí)行第一方面或第一方面的任意可能的實(shí)現(xiàn)方式中的內(nèi)存管理的方法的模塊。

      第三方面,提供了一種內(nèi)存管理系統(tǒng),包括:處理器、存儲(chǔ)器和通信接口。處理器與存儲(chǔ)器和通信接口連接。存儲(chǔ)器用于存儲(chǔ)指令,處理器用于執(zhí)行該指令,通信接口用于在處理器的控制下與其他網(wǎng)元進(jìn)行通信。該處理器執(zhí)行該存儲(chǔ)器存儲(chǔ)的指令時(shí),該執(zhí)行使得該處理器執(zhí)行第一方面或第一方面的任意可能的實(shí)現(xiàn)方式中的內(nèi)存管理的方法。

      第四方面,本申請(qǐng)?zhí)峁┝艘环N計(jì)算機(jī)存儲(chǔ)介質(zhì),該計(jì)算機(jī)存儲(chǔ)介質(zhì)中存儲(chǔ)有程序代碼,該程序代碼用于指示執(zhí)行上述第一方面或第一方面的任一種可能的實(shí)現(xiàn)方式中的內(nèi)存管理的方法的指令。

      基于上述技術(shù)方案,第一業(yè)務(wù)線程接收業(yè)務(wù)數(shù)據(jù),確定第二內(nèi)存空間是否能夠滿足該業(yè)務(wù)數(shù)據(jù)需求的內(nèi)存大小,在該第二內(nèi)存空間滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),根據(jù)該第二內(nèi)存空間中的內(nèi)存,處理該業(yè)務(wù)數(shù)據(jù)。這樣,線程模塊分別通過(guò)各自的第二內(nèi)存空間處理業(yè)務(wù)數(shù)據(jù),避免了在內(nèi)存鏈表上配置管理鎖,鎖定第一內(nèi)存空間的所有內(nèi)存,從而減少了鎖沖突,提高了系統(tǒng)的并發(fā)能力。

      附圖說(shuō)明

      圖1是根據(jù)本申請(qǐng)實(shí)施例的應(yīng)用場(chǎng)景;

      圖2是根據(jù)本申請(qǐng)內(nèi)存管理系統(tǒng)的結(jié)構(gòu)圖;

      圖3是根據(jù)單生產(chǎn)者單消費(fèi)者場(chǎng)景的內(nèi)存管理的示意圖;

      圖4是根據(jù)多生產(chǎn)者多消費(fèi)者場(chǎng)景的內(nèi)存管理的示意圖;

      圖5是根據(jù)多生產(chǎn)者多消費(fèi)者場(chǎng)景的內(nèi)存管理實(shí)施例的示意圖;

      圖6是根據(jù)多生產(chǎn)者多消費(fèi)者場(chǎng)景的另一種內(nèi)存管理的示意圖;

      圖7是根據(jù)本申請(qǐng)實(shí)施例的內(nèi)存管理的架構(gòu)示意圖;

      圖8是根據(jù)本申請(qǐng)實(shí)施例的內(nèi)存管理的方法的示意性流程圖;

      圖9是根據(jù)本申請(qǐng)另一個(gè)實(shí)施例的內(nèi)存管理的方法的示意性流程圖;

      圖10是根據(jù)本申請(qǐng)又一個(gè)實(shí)施例的內(nèi)存管理的方法的示意性流程圖;

      圖11是根據(jù)本申請(qǐng)實(shí)施例的內(nèi)存管理系統(tǒng)的裝置示意圖;

      圖12是根據(jù)本申請(qǐng)實(shí)施例的內(nèi)存管理系統(tǒng)的結(jié)構(gòu)示意圖。

      具體實(shí)施方式

      存儲(chǔ)系統(tǒng)中的內(nèi)存具體分為以下三類:(1)長(zhǎng)度固定的內(nèi)存;(2)長(zhǎng)度不固定的內(nèi)存;(3)長(zhǎng)度不固定且需要IO對(duì)齊的內(nèi)存,如512字節(jié)對(duì)齊、4K對(duì)齊等。這三種不同的內(nèi)存的類型對(duì)應(yīng)的管理方法也不同,對(duì)應(yīng)的采集算法也不同。例如,長(zhǎng)度固定的內(nèi)存,通常可能采用鏈表方式管理;長(zhǎng)度不固定的內(nèi)存,在IO業(yè)務(wù)的申請(qǐng)大小不一時(shí),可能存在鏈表中間部分的內(nèi)存沒(méi)有釋放,而導(dǎo)致該鏈表后邊的內(nèi)存無(wú)法滿足需求,從而產(chǎn)生眾多的小內(nèi)存碎片,通常采用類似Linux系統(tǒng)中的buddy算法等進(jìn)行內(nèi)存的管理。本申請(qǐng)實(shí)施例主要涉及到長(zhǎng)度固定的內(nèi)存。

      圖1示出了本申請(qǐng)實(shí)施例的應(yīng)用場(chǎng)景。如圖1所示為計(jì)算存儲(chǔ)一體機(jī)中的分布式存儲(chǔ)模塊中的業(yè)務(wù)模塊,業(yè)務(wù)模塊處理功能相當(dāng)于存儲(chǔ)的客戶端(client),對(duì)外提供存儲(chǔ)業(yè)務(wù)的能力。本申請(qǐng)實(shí)施例的內(nèi)存管理系統(tǒng)可以應(yīng)用于圖1所示的計(jì)算存儲(chǔ)一體機(jī)中的IO請(qǐng)求模塊110、業(yè)務(wù)處理模塊120和緩存池(CACHE POOL)130任意項(xiàng)模塊中。其中,緩存池130具體可以是中央處理器(Central Processing Unit,CPU)、閃存(Flash)和磁盤(DISK)等。

      應(yīng)理解,本申請(qǐng)實(shí)施例可以應(yīng)用于key-value存儲(chǔ)系統(tǒng),也可以應(yīng)用于其他存儲(chǔ)系統(tǒng),本申請(qǐng)對(duì)此不進(jìn)行限定。但為描述方便,本申請(qǐng)實(shí)施例以key-value存儲(chǔ)系統(tǒng)為例進(jìn)行說(shuō)明。

      圖2示出了內(nèi)存管理系統(tǒng)的結(jié)構(gòu)圖。如圖2所示,內(nèi)存管理系統(tǒng)主要包括多個(gè)業(yè)務(wù)線程210、多個(gè)網(wǎng)絡(luò)線程220和框架內(nèi)存管理模塊230。

      其中,業(yè)務(wù)線程210主要用于處理上層業(yè)務(wù)模塊的IO,從內(nèi)核態(tài)中獲取接口(SCSI)的消息,然后轉(zhuǎn)換成本系統(tǒng)識(shí)別的關(guān)鍵值(Key Value)消息,并根據(jù)Key Value消息的IO路由裝備發(fā)往網(wǎng)絡(luò)線程中,最終發(fā)到存儲(chǔ)節(jié)點(diǎn)。

      網(wǎng)絡(luò)線程220主要用于負(fù)責(zé)客戶端節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)的網(wǎng)絡(luò)鏈路的維護(hù)和消息發(fā)送、接收等業(yè)務(wù),例如,上層業(yè)務(wù)進(jìn)行寫(xiě)業(yè)務(wù),則IO從業(yè)務(wù)線程處理后,根據(jù)Key Value消息的IO路由發(fā)送對(duì)應(yīng)的網(wǎng)絡(luò)線程,網(wǎng)絡(luò)線程最終把IO發(fā)送到后端的存儲(chǔ)節(jié)點(diǎn)。當(dāng)存儲(chǔ)節(jié)點(diǎn)IO寫(xiě)入存儲(chǔ)后,消息從存儲(chǔ)節(jié)點(diǎn)中返回到客戶端,也需要通過(guò)網(wǎng)絡(luò)線程接收存儲(chǔ)節(jié)點(diǎn)的反饋,然后把消息返回給業(yè)務(wù)處理線程,業(yè)務(wù)處理線程把寫(xiě)入或者讀取的結(jié)果反饋給上層的業(yè)務(wù)。

      框架內(nèi)存管理模塊230,主要用于負(fù)責(zé)定長(zhǎng)、變長(zhǎng)和IO等內(nèi)存的管理,在IO下發(fā)到業(yè)務(wù)處理的各個(gè)線程時(shí),由于業(yè)務(wù)的需要,需要從框架內(nèi)存中申請(qǐng)內(nèi)存,然后把消息發(fā)送給網(wǎng)絡(luò)線程并轉(zhuǎn)發(fā)到存儲(chǔ)節(jié)點(diǎn),網(wǎng)絡(luò)模塊把消息發(fā)送出去后,會(huì)把內(nèi)存釋放給框架內(nèi)存。同理,如果消息從存儲(chǔ)節(jié)點(diǎn)返回的時(shí)候,網(wǎng)絡(luò)線程也需要從框架內(nèi)存模塊中申請(qǐng)內(nèi)存用于填充消息信息,把返回的消息返回給業(yè)務(wù)處理線程,業(yè)務(wù)處理線程把消息結(jié)果返回給上層應(yīng)用后,會(huì)把內(nèi)存釋放給框架內(nèi)存。

      在存儲(chǔ)系統(tǒng)中,IO的過(guò)程中頻繁的涉及到內(nèi)存的申請(qǐng)和釋放,內(nèi)存的高效管理對(duì)系統(tǒng)的性能影響非常大,如果管理低效會(huì)導(dǎo)致系統(tǒng)CPU的開(kāi)銷增加,同時(shí)影響系統(tǒng)的并發(fā)能力,最終導(dǎo)致降低系統(tǒng)性能。在多生產(chǎn)者多消費(fèi)者(即多線程申請(qǐng)某類臨界資源(如內(nèi)存),每個(gè)線程既要申請(qǐng)資源,又要釋放資源)場(chǎng)景中,現(xiàn)有技術(shù)采用簡(jiǎn)單的隊(duì)列管理,生產(chǎn)者和消費(fèi)者每次申請(qǐng)都需要從隊(duì)列中分配和釋放,需要大量的垃圾回收,且不利于批量的獲取回收,效率較低。特別是在生產(chǎn)者和消費(fèi)者比較多的時(shí)候,隊(duì)列頭和隊(duì)列尾鎖競(jìng)爭(zhēng)比較大,很難同步,系統(tǒng)的資源開(kāi)銷比較大。具體地,現(xiàn)有技術(shù)對(duì)定長(zhǎng)的內(nèi)存的管理通常有以下幾種:

      如圖3所示為單生產(chǎn)者單消費(fèi)者場(chǎng)景的常用內(nèi)存管理。此種場(chǎng)景不需要加鎖,定長(zhǎng)的內(nèi)存可以通過(guò)讀指針和寫(xiě)指針進(jìn)行控制隊(duì)列操作,具體實(shí)現(xiàn)可以參考linux內(nèi)核提供的先進(jìn)先出的隊(duì)列的免鎖算法(kfifo)的實(shí)現(xiàn)。

      如圖4所示為多生產(chǎn)者多消費(fèi)者場(chǎng)景的常用內(nèi)存管理。通常在多線程場(chǎng)景中,涉及到多個(gè)生產(chǎn)者和多個(gè)消費(fèi)者的場(chǎng)景,最簡(jiǎn)單的管理辦法還是采用鏈表的方式,在鏈表頭部和尾部都是設(shè)置了互斥鎖,控制線程之間對(duì)臨界資源(如圖4中的1號(hào)內(nèi)存和4號(hào)內(nèi)存)的訪問(wèn)。然而,當(dāng)線程越多的時(shí)候,這個(gè)方式的弊端越明顯。

      具體地,以圖5所示的多生產(chǎn)者多消費(fèi)者場(chǎng)景設(shè)置一個(gè)互斥鎖為例進(jìn)行說(shuō)明。如圖5所示,每一種大小相同的內(nèi)存塊(即定長(zhǎng)內(nèi)存)串成一個(gè)鏈,比如32B的數(shù)據(jù)塊一個(gè)鏈,64B數(shù)據(jù)塊一個(gè)鏈,每個(gè)鏈有一個(gè)鎖,當(dāng)某個(gè)消費(fèi)者需要申請(qǐng)比如32B內(nèi)存資源的時(shí)候,申請(qǐng)過(guò)程中需要對(duì)32B的鏈進(jìn)行加鎖,這時(shí)候其他消費(fèi)者就不能申請(qǐng)?jiān)撴湥挥挟?dāng)前面一個(gè)申請(qǐng)完成之后才會(huì)解鎖,因此在多個(gè)消費(fèi)者同時(shí)要申請(qǐng)一個(gè)鏈的內(nèi)存資源,在申請(qǐng)鎖的過(guò)程中,會(huì)產(chǎn)生鎖沖突,導(dǎo)致并發(fā)能力上不去。

      應(yīng)理解,定長(zhǎng)內(nèi)存的大小可以是32B、64B、128B,…,2nB等,本申請(qǐng)對(duì)此不進(jìn)行限定。

      如圖6所示為多生產(chǎn)者多消費(fèi)者場(chǎng)景的另一種常用的內(nèi)存管理。干擾器(Disruptor)是目前公認(rèn)的在處理多生產(chǎn)者和多消費(fèi)者的高效的管理方法,它采用特殊的ring buffer隊(duì)列實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),不僅能夠解決了多生產(chǎn)者和多消費(fèi)者的在鎖沖突嚴(yán)重的問(wèn)題,還能夠方便系統(tǒng)跟蹤內(nèi)存的軌跡,以便在系統(tǒng)內(nèi)存泄露,踩內(nèi)存等異常中,可以快速的定位。但是在系統(tǒng)中存儲(chǔ)生產(chǎn)者和消費(fèi)者比較多的時(shí)候,多個(gè)業(yè)務(wù)線程同時(shí)申請(qǐng)內(nèi)存資源時(shí),兩個(gè)環(huán)形緩沖器(ring buffer)環(huán)配合,鎖的沖突比較嚴(yán)重,管理和實(shí)現(xiàn)也比較復(fù)雜,后期的代碼理解和維護(hù)代價(jià)較高。

      在當(dāng)前大型存儲(chǔ)系統(tǒng)內(nèi)存的管理中,不僅簡(jiǎn)單的進(jìn)行對(duì)內(nèi)存的申請(qǐng)和釋放的管理,同時(shí)為能夠方便系統(tǒng)跟蹤內(nèi)存的軌跡,增加了較多的輔助設(shè)計(jì),以便于在系統(tǒng)內(nèi)存泄露,踩內(nèi)存等異常時(shí),可以快速的定位問(wèn)題。然而,線程模塊進(jìn)行跟蹤內(nèi)存等操作,也需要申請(qǐng)內(nèi)存資源,并管理這些內(nèi)存資源的臨界資源,這樣就可能涉及到一個(gè)鎖內(nèi)嵌套另一個(gè)鎖。

      因此,如圖7所示,本申請(qǐng)實(shí)施例提出了一種內(nèi)存管理的架構(gòu)示意圖,能夠降低鎖沖突,且能夠提高系統(tǒng)的并發(fā)能力。本申請(qǐng)實(shí)施例中,框架內(nèi)存管理模塊(對(duì)應(yīng)于圖2中的框架內(nèi)存管理模塊230)還包括:

      (1)模塊標(biāo)識(shí)(module id,MID):由于框架內(nèi)存管理模塊是一個(gè)公共的模塊,能夠?qū)Σ煌K的內(nèi)存進(jìn)行管理,如圖7所示,本申請(qǐng)實(shí)施例中業(yè)務(wù)模塊(例如客戶端業(yè)務(wù)模塊),網(wǎng)絡(luò)模塊等分別用不同的MID進(jìn)行表示。

      (2)元數(shù)據(jù)(metadata):分別對(duì)不同的模塊分配一個(gè)全局的元數(shù)據(jù)管理,它的元數(shù)據(jù)結(jié)構(gòu)如下所示:

      struct dsw_mem_meta

      {

      dsw_u8mid;//模塊ID號(hào)

      ...

      ...

      ...

      dsw_u16*fmt_map;//管理不同定長(zhǎng)的內(nèi)存的元數(shù)據(jù)

      };

      其中fmt_map是一個(gè)數(shù)組,每個(gè)元數(shù)據(jù)管理不同長(zhǎng)度大小、定長(zhǎng)的內(nèi)存單元,通常我們?cè)O(shè)計(jì)的定長(zhǎng)的大小為2的指數(shù)級(jí)的增長(zhǎng),如32、64、128、256等字節(jié)長(zhǎng)度的內(nèi)存。如圖7所示,每個(gè)全局的元數(shù)據(jù)的結(jié)構(gòu)中,管理了N個(gè)長(zhǎng)度固定的鏈表。

      (3)fmt_level:是定長(zhǎng)內(nèi)存的索引鏈表值,如32的索引為5,64為6等,能夠方便業(yè)務(wù)線程申請(qǐng)對(duì)應(yīng)長(zhǎng)度內(nèi)存快速的索引。

      (4)fmt_list:系統(tǒng)初始的時(shí)候,業(yè)務(wù)線程首先會(huì)估算IO業(yè)務(wù)過(guò)程中,最大可能需要多少個(gè)這類長(zhǎng)度的內(nèi)存,然后在框架內(nèi)存中注冊(cè)。進(jìn)程啟動(dòng)的時(shí)候,根據(jù)注冊(cè)的個(gè)數(shù),把定長(zhǎng)的內(nèi)存先用鏈表的方式管理起來(lái),構(gòu)成了一個(gè)鏈表大池,如圖7所示包括多個(gè)鏈表大池。每個(gè)定長(zhǎng)的內(nèi)存會(huì)有一個(gè)內(nèi)存的管理單元,管理單元對(duì)內(nèi)存的管理主要有內(nèi)存的使用情況、在使用過(guò)程中的軌跡等消息。定長(zhǎng)的內(nèi)存的管理單元的數(shù)據(jù)結(jié)構(gòu)如下:

      struct dsw_mem_fmt_unit

      {

      dsw_u32mid:6;//模塊ID號(hào)

      dsw_mem_fmt_unit_op_trace_t op_trace;//記錄內(nèi)存軌跡

      dsw_u32index;//長(zhǎng)度的索引

      dsw_u32alloc_time;

      dsw_s64used_flag;/*use flag 0:free,1:alloc;*/

      mem_bs_info;//執(zhí)行小池的實(shí)際的內(nèi)存單元的信息

      ...

      ...

      ...

      char*data_addr;//內(nèi)存實(shí)際分配地址

      };

      另外,每個(gè)管理單元的管理頭實(shí)際指向內(nèi)存的地址為data addr,每個(gè)實(shí)際分配的地址前會(huì)增加13個(gè)字節(jié),如ref cnt用于檢測(cè)當(dāng)前的內(nèi)存是否使用完,當(dāng)ref cnt為1的時(shí)候(系統(tǒng)約定初始化的時(shí)候?yàn)?,后續(xù)申請(qǐng)使用,或者發(fā)送給其它線程的時(shí)候,會(huì)增加1),則說(shuō)明這個(gè)內(nèi)存可以釋放。如果內(nèi)存單元可能涉及跨線程的,則需要鎖,spin lock能夠在解決多個(gè)線程修改ref cnt的時(shí)候使用,詳細(xì)的結(jié)構(gòu)如圖7所示。其中,unit index用于表示當(dāng)前的這個(gè)內(nèi)存單元是屬于哪個(gè)類型長(zhǎng)度的,如32B字節(jié),64字節(jié)等;memid用于指示該內(nèi)存是屬于動(dòng)態(tài)管理的內(nèi)存類型還是靜態(tài)分配管理的類型ID;spin lock用于鎖ref cnt和內(nèi)存管理頭中的op trace的屬性,通過(guò)對(duì)資源進(jìn)行細(xì)分,用兩個(gè)不同的鎖,進(jìn)一步的降低鎖沖突的概率。

      (5)頭鎖(headlock)/尾鎖(tail lock):業(yè)務(wù)線程注冊(cè)內(nèi)存?zhèn)€數(shù)的時(shí)候,會(huì)設(shè)置這類的內(nèi)存是否存在多個(gè)人使用的情況,如果只有一個(gè)業(yè)務(wù)線程使用,則不需要帶鎖的鏈表,如果是多個(gè)業(yè)務(wù)共享這類資源,則需要加鎖;當(dāng)業(yè)務(wù)線程申請(qǐng)內(nèi)存資源時(shí)從隊(duì)列頭分配,用head lock鎖進(jìn)行互斥;當(dāng)業(yè)務(wù)線程需要釋放部分資源到大池中的時(shí)候,采用tail lock進(jìn)行互斥,確保鏈表的安全,不會(huì)因?yàn)槎鄠€(gè)業(yè)務(wù)線程修改鏈表導(dǎo)致鏈表的斷鏈。

      (6)大池(big pool):框架模塊把業(yè)務(wù)線程初始注冊(cè)的內(nèi)存安裝鏈表的方式統(tǒng)一放在這個(gè)鏈表池中,在后續(xù)的描述中將這個(gè)鏈表統(tǒng)稱為大池。

      (7)大池索引(big pool index):在大池鏈表中,由于部分業(yè)務(wù)注冊(cè)的資源比較多,后續(xù)業(yè)務(wù)線程進(jìn)行批量分配的時(shí)候,如果進(jìn)行鎖后面遍歷獲取,則鎖的開(kāi)銷比較大。所以,為了降低鎖的沖突的開(kāi)銷,對(duì)大池的鏈表進(jìn)行索引,確保批量分配的時(shí)候,可以快速的批量分配,且這樣開(kāi)銷只是修改幾個(gè)指針的代價(jià)。

      業(yè)務(wù)模塊/網(wǎng)絡(luò)模塊:圖7中業(yè)務(wù)模塊包括多個(gè)業(yè)務(wù)模塊線程710,網(wǎng)絡(luò)模塊包括多個(gè)網(wǎng)絡(luò)模塊線程720,每個(gè)線程對(duì)應(yīng)私有的指針,這個(gè)指針指向了業(yè)務(wù)線程模塊或者網(wǎng)絡(luò)線程模塊的小池(small pool)的元數(shù)據(jù)管理,小池的元數(shù)據(jù)管理結(jié)構(gòu)如下:

      typedef struct dsw_mem_small_list_s

      {

      dsw_int water_level;//水位(個(gè)數(shù))--正常設(shè)置為總數(shù)的5%(最多20個(gè)線程)--TODO:可配

      dsw_int water_high;//water_level*2

      dsw_list_t unit_list;//單個(gè)格式化鏈

      }dsw_mem_small_list_t;

      線程的私有地址空間指向small pool類型的元數(shù)據(jù)指針,意味著small pool的資源是專門申請(qǐng)給某個(gè)線程私有使用的,當(dāng)業(yè)務(wù)模塊或者網(wǎng)絡(luò)模塊線程需要申請(qǐng)內(nèi)存的時(shí)候,首先從自己本線程的私有空間中的內(nèi)存小池中檢查是否有剩余的內(nèi)存,如果有,則直接分配內(nèi)存空間給業(yè)務(wù)線程;如果業(yè)務(wù)線程的隊(duì)列中沒(méi)有內(nèi)存空間,則需要從框架內(nèi)存中的大池中申請(qǐng),從大池申請(qǐng)的時(shí)候是批量的從申請(qǐng)一定量的內(nèi)存塊個(gè)數(shù),具體的個(gè)數(shù)參考后續(xù)分配注冊(cè)的部分的算法。

      圖8為本申請(qǐng)實(shí)施例提供的內(nèi)存管理的方法的示意圖。

      801,該第一線程模塊接收業(yè)務(wù)數(shù)據(jù)。

      內(nèi)存管理系統(tǒng)包括內(nèi)存管理模塊和多個(gè)第一線程模塊,該內(nèi)存管理模塊可以是圖2中框架內(nèi)存管理模塊230,該第一線程模塊可以是業(yè)務(wù)線程210,也可以是網(wǎng)絡(luò)線程220。

      內(nèi)存管理模塊包括多個(gè)內(nèi)存空間,該多個(gè)內(nèi)存空間分別用于存儲(chǔ)32B、64B或者128B等任一項(xiàng)的定長(zhǎng)內(nèi)存,且每個(gè)內(nèi)存空間中可以包括多個(gè)定長(zhǎng)的內(nèi)存(表示為第一內(nèi)存),例如,多個(gè)內(nèi)存空間中的任意一個(gè)內(nèi)存空間(表示為第一內(nèi)存空間)可以包括多個(gè)32B定長(zhǎng)的內(nèi)存。此外,內(nèi)存管理系統(tǒng)包括的多個(gè)第一線程模塊,每個(gè)第一線程模塊包括一個(gè)私有的內(nèi)存空間(表示為第二內(nèi)存空間),且第二內(nèi)存空間包括至少一個(gè)定長(zhǎng)的內(nèi)存(例如,32B定長(zhǎng)的內(nèi)存)。也就是說(shuō),任意一個(gè)第一線程模塊都可以獲知自己的第二內(nèi)存空間的內(nèi)存容量。

      應(yīng)理解,該第二內(nèi)存空間中的定長(zhǎng)內(nèi)存可以是從內(nèi)存管理模塊的內(nèi)存空間中獲取的,也可以是第一線程模塊原有的內(nèi)存,本申請(qǐng)對(duì)此不進(jìn)行限定。

      還應(yīng)理解,第一內(nèi)存空間中的多個(gè)第一內(nèi)存,以及第二內(nèi)存空間中的至少一個(gè)第一內(nèi)存可以以鏈表的形式存在。

      802,該內(nèi)存管理模塊確定第二內(nèi)存空間是否滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求。

      在第一業(yè)務(wù)線程模塊接收到業(yè)務(wù)數(shù)據(jù)后,先確定該第一線程模塊的第二內(nèi)存空間是否能夠滿足該業(yè)務(wù)數(shù)據(jù)需求的內(nèi)存大小。也就是說(shuō),第一業(yè)務(wù)線程模塊的具有固定大小的內(nèi)存(即第二內(nèi)存空間),多個(gè)業(yè)務(wù)線程模塊中的每個(gè)業(yè)務(wù)線程模塊的第二內(nèi)存空間可以用于獨(dú)立處理業(yè)務(wù)數(shù)據(jù),相互之間不會(huì)造成影響。

      可選地,業(yè)務(wù)線程模塊啟動(dòng)后,可以向內(nèi)存管理模塊注冊(cè)請(qǐng)求(第一注冊(cè)請(qǐng)求)。內(nèi)存管理模塊根據(jù)該第一注冊(cè)請(qǐng)求將第一內(nèi)存空間中的至少一個(gè)第一內(nèi)存發(fā)送給第一線程模塊。第一線程模塊存儲(chǔ)該至少一個(gè)第一內(nèi)存生成第二內(nèi)存空間,這樣業(yè)務(wù)線程可以提前獲取內(nèi)存,進(jìn)而用于處理業(yè)務(wù)數(shù)據(jù),而不需要在需要內(nèi)存時(shí)才從第一內(nèi)存空間中獲取內(nèi)存,節(jié)省業(yè)務(wù)數(shù)據(jù)處理時(shí)延。

      該注冊(cè)請(qǐng)求具體可以包括注冊(cè)定長(zhǎng)的內(nèi)存,其中包括注冊(cè)內(nèi)存的類型、內(nèi)存鏈表包括的內(nèi)存?zhèn)€數(shù)、以及內(nèi)存是否需要配置管理鎖(也可以簡(jiǎn)稱“鎖”)等。其中,內(nèi)存類型可以是大小為32B、64B或者128B等任一項(xiàng)的定長(zhǎng)內(nèi)存;內(nèi)存鏈表包括多個(gè)定長(zhǎng)內(nèi)存;以及內(nèi)存管理模塊用于服務(wù)的線程模塊是單個(gè)還是多個(gè),若是單個(gè)線程模塊,則內(nèi)存鏈表不需要配置管理鎖,若為多個(gè)線程模塊,則內(nèi)存鏈表需要配置管理鎖。

      應(yīng)理解,本申請(qǐng)實(shí)施例中,第一內(nèi)存空間可以表述為“大池”,第二內(nèi)存空間也可以表述為“對(duì)應(yīng)于第一線程模塊的小池”。

      803,在該第二內(nèi)存空間滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),該第一線程模塊根據(jù)該第二內(nèi)存空間,處理該業(yè)務(wù)數(shù)據(jù)。

      在第二內(nèi)存空間能夠滿足業(yè)務(wù)數(shù)據(jù)對(duì)內(nèi)存的需求時(shí),例如,第一線程模塊處理業(yè)務(wù)數(shù)據(jù)需求一個(gè)64B的內(nèi)存,若第二內(nèi)存空間包括一個(gè)64B的內(nèi)存,則該第一線程模塊根據(jù)該64B的內(nèi)存能夠處理該業(yè)務(wù)數(shù)據(jù)。這樣,在業(yè)務(wù)數(shù)據(jù)需要多個(gè)業(yè)務(wù)線程的場(chǎng)景下,多個(gè)線程模塊分別通過(guò)各自的第二內(nèi)存空間處理業(yè)務(wù)數(shù)據(jù),避免了多個(gè)線程模塊同時(shí)處理業(yè)務(wù)數(shù)據(jù)時(shí),內(nèi)存管理模塊想要通過(guò)內(nèi)存鏈表上的管理鎖鎖定第一內(nèi)存空間的所有內(nèi)存造成的鎖沖突,從而減少了鎖開(kāi)銷,提高了系統(tǒng)的并發(fā)能力。

      可選地,作為一個(gè)實(shí)施例,在該第二內(nèi)存空間不滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),該第一線程模塊向內(nèi)存管理模塊發(fā)送內(nèi)存請(qǐng)求,以申請(qǐng)內(nèi)存資源,內(nèi)存管理模塊為第一線程模塊分配內(nèi)存,并將發(fā)送給第一線程模塊,第一線程模塊將接收到的內(nèi)存存儲(chǔ)到該第二內(nèi)存空間。這樣第一線程模塊可以根據(jù)當(dāng)前的(即申請(qǐng)到內(nèi)存后的)第二內(nèi)存空間處理業(yè)務(wù)數(shù)據(jù)。

      需要說(shuō)明的是,內(nèi)存管理模塊接收到第一線程模塊的內(nèi)存請(qǐng)求后,需要確認(rèn)第一內(nèi)存空間是否有剩余內(nèi)存能夠分配給第一線程模塊。若剩余內(nèi)存,則內(nèi)存管理模塊對(duì)第一內(nèi)存空間設(shè)置管理鎖(表示為第一管理鎖),并在向第一線程模塊發(fā)送內(nèi)存后,解開(kāi)該第一管理鎖。這里的第一管理鎖可以是上述描述的互斥鎖。

      應(yīng)理解,第一線程模塊可以不停地向內(nèi)存管理模塊申請(qǐng)內(nèi)存,直到第二內(nèi)存空間中的內(nèi)存能夠滿足業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求。

      可選地,作為另一個(gè)實(shí)施例,內(nèi)存管理模塊可以將第一內(nèi)存空間中的內(nèi)存劃分為多個(gè)內(nèi)存集合(表示為第一內(nèi)存集合),每個(gè)第一內(nèi)存集合包括的內(nèi)存數(shù)目相同。這樣第一線程模塊每次向第一內(nèi)存空間申請(qǐng)內(nèi)存時(shí),可以獲取到一個(gè)或多個(gè)第一內(nèi)存集合,也就是說(shuō),在第一線程模塊需要大量?jī)?nèi)存的情況下,避免了一一遍歷每個(gè)內(nèi)存,從而能夠節(jié)省時(shí)延。

      可選地,作為另一個(gè)實(shí)施例,內(nèi)存管理模塊可以為多個(gè)第一內(nèi)存集合中的每個(gè)第一內(nèi)存集合設(shè)置內(nèi)存索引值,該多個(gè)內(nèi)存索引值可以以列表的形式呈現(xiàn)(例如,索引表)。例如,在內(nèi)存管理模塊確定有剩余內(nèi)存能夠分配為第一線程模塊,則內(nèi)存管理模塊為第一內(nèi)存空間設(shè)置第一管理鎖,然后從第一內(nèi)存空間的索引表中獲取批量的頭節(jié)點(diǎn)和尾節(jié)點(diǎn)指針。在第一線程模塊需要批量獲取內(nèi)存時(shí),可以快速的批量配置內(nèi)存,且只需要修改幾個(gè)指針,節(jié)省了開(kāi)銷。

      應(yīng)理解,內(nèi)存管理模塊設(shè)置第一管理鎖后,第一內(nèi)存空間只能服務(wù)于該第一線程模塊,只有在內(nèi)存管理模塊為第一線程模塊分配內(nèi)存后,才會(huì)解鎖。

      還應(yīng)理解,內(nèi)存管理模塊為第一線程模塊配置內(nèi)存后,需要修改第一內(nèi)存空間中的索引表的指針,以避免鏈表的斷鏈。

      可選地,第一線程模塊根據(jù)第二內(nèi)存空間中的內(nèi)存處理業(yè)務(wù)數(shù)據(jù)具體可以是將業(yè)務(wù)數(shù)據(jù)封裝在當(dāng)前的第二內(nèi)存空間中的內(nèi)存中生成業(yè)務(wù)消息,然后向第二線程模塊發(fā)送該業(yè)務(wù)消息。

      應(yīng)理解,這里的當(dāng)前的第二內(nèi)存空間可以是該第一線程模塊對(duì)應(yīng)的原始的第二內(nèi)存空間,也可以是原始第二內(nèi)存空間不滿足業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求,經(jīng)過(guò)從內(nèi)存管理模塊獲取內(nèi)存后得到的第二內(nèi)存空間。

      可選地,第二線程模塊也可以向內(nèi)存管理模塊發(fā)送注冊(cè)請(qǐng)求(表示為第二注冊(cè)請(qǐng)求),內(nèi)存管理模塊根據(jù)該第二注冊(cè)請(qǐng)求將第一內(nèi)存空間中的至少一個(gè)第一內(nèi)存發(fā)送給第二線程模塊。第二線程模塊存儲(chǔ)該至少一個(gè)第一內(nèi)存生成第三內(nèi)存空間,這樣業(yè)務(wù)線程可以提前獲取內(nèi)存,進(jìn)而用于處理業(yè)務(wù)數(shù)據(jù),而不需要在需要內(nèi)存時(shí)才從第一內(nèi)存空間中獲取內(nèi)存,節(jié)省業(yè)務(wù)數(shù)據(jù)處理時(shí)延。

      應(yīng)理解,內(nèi)存管理系統(tǒng)可以包括多個(gè)第二線程模塊,每個(gè)第二線程模塊都可以按照上述方式獲取第三內(nèi)存空間。此外,第三內(nèi)存空間包括的第一內(nèi)存的數(shù)目可以與第二內(nèi)存空間包括的內(nèi)存數(shù)目相同,也可以不同,本申請(qǐng)對(duì)此不進(jìn)行限定。

      可選地,本申請(qǐng)實(shí)施例中,第一線程模塊可以是業(yè)務(wù)線程模塊,也可以是網(wǎng)絡(luò)線程模塊。其中,當(dāng)?shù)谝痪€程模塊是業(yè)務(wù)線程模塊,第二線程模塊是網(wǎng)絡(luò)線程模塊時(shí),業(yè)務(wù)線程模塊向網(wǎng)絡(luò)線程模塊發(fā)送業(yè)務(wù)消息后,網(wǎng)絡(luò)線程模塊再將業(yè)務(wù)消息發(fā)送給存儲(chǔ)節(jié)點(diǎn)。之后,網(wǎng)絡(luò)線程模塊修改網(wǎng)絡(luò)線程模塊的內(nèi)存空間(即第三內(nèi)存空間)的內(nèi)存使用計(jì)數(shù)和業(yè)務(wù)路徑。該內(nèi)存使用計(jì)數(shù)用于檢測(cè)該業(yè)務(wù)消息占用的內(nèi)存是否使用完成,而業(yè)務(wù)路徑用于在系統(tǒng)內(nèi)存泄露,踩內(nèi)存等異常時(shí),可以快速的定位問(wèn)題。

      例如,假設(shè)系統(tǒng)約定初始化的時(shí)候內(nèi)存使用計(jì)數(shù)(ref cnt)為1,后續(xù)申請(qǐng)使用,或者發(fā)送給其它線程的時(shí)候可以加1。也就是說(shuō),當(dāng)ref cnt取值大于1表示有線程正在使用;若ref cnt取值等于1表示線程模塊使用完成,這時(shí)可以釋放內(nèi)存。

      在業(yè)務(wù)線程模塊向網(wǎng)絡(luò)線程模塊發(fā)送業(yè)務(wù)消息后,網(wǎng)絡(luò)線程模塊為第三內(nèi)存空間設(shè)置管理鎖(表示為第二管理鎖),第二管理鎖用于控制對(duì)內(nèi)存使用計(jì)數(shù)和業(yè)務(wù)路徑的修改,這樣只有一個(gè)線程能夠修改內(nèi)存使用計(jì)數(shù)和業(yè)務(wù)路徑。此外,第二管理鎖不同于第一管理鎖,這樣在滿足內(nèi)存定位等輔助設(shè)計(jì)需求的同時(shí),避免設(shè)置相同的管理鎖造成的鎖沖突。

      具體地,第二管理鎖(即spin lock)的配置結(jié)構(gòu)可以如圖7所示,spin lock用于鎖ref cnt和內(nèi)存管理頭中的業(yè)務(wù)路徑(op trace)的屬性,通過(guò)對(duì)資源進(jìn)行細(xì)分,用兩個(gè)不同的鎖,進(jìn)一步的降低鎖沖突的概率。

      應(yīng)理解,該第二管理鎖可以簡(jiǎn)稱為“小鎖”,該第三內(nèi)存空間也可以表述為“對(duì)應(yīng)于第二線程模塊的小池”,“內(nèi)存使用計(jì)數(shù)”也可以稱為“內(nèi)存引用計(jì)數(shù)”,本申請(qǐng)對(duì)此不進(jìn)行限定。

      可選地,本申請(qǐng)實(shí)施例還可以應(yīng)用于存儲(chǔ)節(jié)點(diǎn)處理業(yè)務(wù)消息后,向用戶反饋結(jié)果信息的場(chǎng)景中,即該處理流程相當(dāng)于業(yè)務(wù)線程模塊到網(wǎng)絡(luò)線程模塊的逆過(guò)程。此時(shí),第一線程模塊是網(wǎng)絡(luò)線程模塊,第二線程模塊是業(yè)務(wù)線程模塊。網(wǎng)絡(luò)線程模塊將結(jié)果信息返回給業(yè)務(wù)線程模塊,業(yè)務(wù)線程模塊將結(jié)果信息發(fā)送給用戶,并修改網(wǎng)絡(luò)線程模塊的內(nèi)存空間的使用計(jì)數(shù)和使用軌跡。該內(nèi)存使用計(jì)數(shù)用于檢測(cè)該業(yè)務(wù)消息占用的內(nèi)存是否使用完成,而業(yè)務(wù)路徑用于在系統(tǒng)內(nèi)存泄露,踩內(nèi)存等異常時(shí),可以快速的定位問(wèn)題。

      應(yīng)理解,從網(wǎng)絡(luò)線程模塊到業(yè)務(wù)線程模塊的過(guò)程,與從業(yè)務(wù)線程模塊到網(wǎng)絡(luò)線程模塊的過(guò)程相同,為避免重復(fù),本申請(qǐng)不再詳細(xì)贅述。

      可選地,第二線程模塊根據(jù)內(nèi)存使用計(jì)數(shù)可以確定是否釋放業(yè)務(wù)消息所占用的內(nèi)存資源。

      可選地,若內(nèi)存使用計(jì)數(shù)的初始預(yù)設(shè)值為1,且所述內(nèi)存使用計(jì)數(shù)在對(duì)應(yīng)的內(nèi)存處于占用狀態(tài)時(shí)加1,處于空閑狀態(tài)時(shí)減1,則在內(nèi)存使用計(jì)數(shù)減到1時(shí),則第二線程模塊可以將業(yè)務(wù)消息占用的內(nèi)存釋放到第三內(nèi)存空間中。該第三內(nèi)存空間包括第一鏈表和第二鏈表,該第一鏈表和第二鏈表用于存儲(chǔ)該第三內(nèi)存空間中的至少一個(gè)第一內(nèi)存。也就是說(shuō),該第三內(nèi)存空間中的至少一個(gè)第一內(nèi)存可以通過(guò)鏈表的形式管理,例如以free list鏈表(表示為第一鏈表)為例,其中在回收的時(shí)候,第二線程模塊可以將釋放的內(nèi)存先放入第三內(nèi)存空間中的free list中,當(dāng)free list鏈表中的內(nèi)存?zhèn)€數(shù)超過(guò)的低水位(表示為第一數(shù)目閾值),即不再放入free list鏈表中,而是放入unit list鏈表中。這樣能夠方便后續(xù)批量回收f(shuō)ree list中的內(nèi)存,提高了回收效率。

      需要說(shuō)明的是,該內(nèi)存使用計(jì)數(shù)對(duì)應(yīng)的內(nèi)存,可以是任意一個(gè)內(nèi)存,即每個(gè)內(nèi)存都可以有對(duì)應(yīng)的內(nèi)存使用計(jì)數(shù)確定將資源是否到第三內(nèi)存空間中;或者是一個(gè)業(yè)務(wù)消息占用的至少一個(gè)內(nèi)存通過(guò)一個(gè)內(nèi)存使用計(jì)數(shù)來(lái)記錄,本申請(qǐng)對(duì)此不進(jìn)行限定。

      應(yīng)理解,低水位可以是內(nèi)存管理模塊出廠時(shí)配置的,也可以是根據(jù)第二內(nèi)存空間內(nèi)的內(nèi)存大小或數(shù)目靈活設(shè)定的,本申請(qǐng)對(duì)此不進(jìn)行限定。

      可選地,內(nèi)存管理模塊可以為第三內(nèi)存空間配置第二數(shù)目閾值(或者可以稱為“高水位”)。內(nèi)存管理模塊在第三內(nèi)存空間中內(nèi)存?zhèn)€數(shù)超過(guò)高水位時(shí),即free list鏈表和unit list鏈表中總共有的內(nèi)存數(shù)目超過(guò)高水位。內(nèi)存管理模塊可以將第三內(nèi)存空間中部分的內(nèi)存回收到第一內(nèi)存空間中,這樣可以避免個(gè)別業(yè)務(wù)線程因?yàn)镮O不均等的問(wèn)題把資源全占用了。

      可選地,內(nèi)存管理模塊將第三內(nèi)存空間中的內(nèi)存回收到第一內(nèi)存空間的過(guò)程中,可以批量的回收,即第二內(nèi)存空間可以批量的將free list中的所有內(nèi)存回收到第二內(nèi)存空間中,從而提高回收效率。

      因此,本申請(qǐng)實(shí)施例的內(nèi)存管理的方法,第一業(yè)務(wù)線程接收業(yè)務(wù)數(shù)據(jù),確定第二內(nèi)存空間是否能夠滿足該業(yè)務(wù)數(shù)據(jù)需求的內(nèi)存大小,在該第二內(nèi)存空間滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),根據(jù)該第二內(nèi)存空間中的內(nèi)存,處理該業(yè)務(wù)數(shù)據(jù)。這樣,在多個(gè)業(yè)務(wù)線程場(chǎng)景下,不同線程模塊分別通過(guò)各自的第二內(nèi)存空間處理業(yè)務(wù)數(shù)據(jù),避免了多個(gè)線程模塊同時(shí)處理業(yè)務(wù)數(shù)據(jù)時(shí),內(nèi)存管理模塊想要通過(guò)內(nèi)存鏈表上的管理鎖鎖定第一內(nèi)存空間的所有內(nèi)存造成的鎖沖突,從而減少了鎖開(kāi)銷,提高了系統(tǒng)的并發(fā)能力。

      圖9為本申請(qǐng)一個(gè)實(shí)施例提供的內(nèi)存管理的方法的交互流程示意圖。本實(shí)施例中的各種術(shù)語(yǔ)的含義與前述各實(shí)施例相同。

      901、業(yè)務(wù)線程模塊啟動(dòng),并向內(nèi)存管理模塊發(fā)送第一注冊(cè)請(qǐng)求。

      902、內(nèi)存管理模塊根據(jù)第一注冊(cè)請(qǐng)求,為該業(yè)務(wù)線程模塊配置至少一個(gè)第一內(nèi)存。該內(nèi)存管理模塊的第一內(nèi)存空間包括多個(gè)第一內(nèi)存。

      903、業(yè)務(wù)線程模塊根據(jù)配置的至少一個(gè)第一內(nèi)存存儲(chǔ)到業(yè)務(wù)線程模塊的私有內(nèi)存空間。

      904、網(wǎng)絡(luò)線程模塊啟動(dòng),并向內(nèi)存管理模塊發(fā)送第二注冊(cè)請(qǐng)求。

      905、內(nèi)存管理模塊根據(jù)第二注冊(cè)請(qǐng)求,為該網(wǎng)絡(luò)線程模塊配置至少一個(gè)第一內(nèi)存。

      應(yīng)理解,該第一注冊(cè)請(qǐng)求與該第二注冊(cè)請(qǐng)求可以相同,也可以不同,本申請(qǐng)對(duì)此不進(jìn)行限定。

      906、網(wǎng)絡(luò)線程模塊將配置的至少一個(gè)第一內(nèi)存存儲(chǔ)到網(wǎng)絡(luò)線程的私有內(nèi)存空間中。

      應(yīng)理解,本申請(qǐng)中業(yè)務(wù)線程和網(wǎng)絡(luò)線程可以同時(shí)申請(qǐng)內(nèi)存,也可以按先后順序申請(qǐng)內(nèi)存,即步驟901~903,與步驟904~906之間的先后順序本申請(qǐng)不進(jìn)行限定。

      907、業(yè)務(wù)線程模塊接收業(yè)務(wù)數(shù)據(jù)。

      該步驟904在步驟901~906之前或之間的任一個(gè)步驟之后,本申請(qǐng)對(duì)此不進(jìn)行限定。

      908、業(yè)務(wù)線程模塊根據(jù)該業(yè)務(wù)數(shù)據(jù),確定業(yè)務(wù)線程的私有內(nèi)存空間是否滿足業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求。

      909、在業(yè)務(wù)線程的私有內(nèi)存空間不滿足業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),第一業(yè)務(wù)線程向內(nèi)存管理模塊發(fā)送內(nèi)存請(qǐng)求。

      若業(yè)務(wù)線程的私有內(nèi)存空間滿足業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求,則直接執(zhí)行步驟913。

      910、內(nèi)存管理模塊將第一內(nèi)存空間劃分為多個(gè)內(nèi)存集合,且根據(jù)內(nèi)存請(qǐng)求為多個(gè)第一內(nèi)存集合配置內(nèi)存索引值,這樣內(nèi)存管理模塊可以根據(jù)內(nèi)存索引值為業(yè)務(wù)線程模塊配置內(nèi)存,即可以一次配置多個(gè)內(nèi)存,不需要一個(gè)一個(gè)遍歷。

      應(yīng)理解,內(nèi)存管理模塊在為業(yè)務(wù)線程模塊配置內(nèi)存的過(guò)程中,也需要設(shè)置第一管理鎖,避免其他線程模塊使用該第一內(nèi)存空間。

      911、內(nèi)存管理模塊為業(yè)務(wù)線程模塊配置至少一個(gè)第一內(nèi)存集合。在發(fā)送內(nèi)存后,解開(kāi)該第一管理鎖。

      912、業(yè)務(wù)線程模塊將該至少一個(gè)第一內(nèi)存集合存儲(chǔ)到第二內(nèi)存空間。

      913、業(yè)務(wù)線程模塊將業(yè)務(wù)數(shù)據(jù)封裝在第二內(nèi)存空間中的內(nèi)存中生成業(yè)務(wù)消息。

      914、業(yè)務(wù)線程模塊向網(wǎng)絡(luò)線程模塊發(fā)送業(yè)務(wù)消息。

      915、網(wǎng)絡(luò)線程模塊將該業(yè)務(wù)數(shù)據(jù)轉(zhuǎn)發(fā)到存儲(chǔ)節(jié)點(diǎn)。

      916、網(wǎng)絡(luò)線程模塊將業(yè)務(wù)數(shù)據(jù)發(fā)出后,修改網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間中的內(nèi)存使用計(jì)數(shù)和使用軌跡。

      917、在內(nèi)存使用計(jì)數(shù)為1時(shí),網(wǎng)絡(luò)線程模塊將業(yè)務(wù)消息占用的內(nèi)存釋放到網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間中的第二鏈表,超過(guò)第二鏈表的第一數(shù)目閾值后,釋放到第一鏈表。當(dāng)?shù)诰W(wǎng)絡(luò)線程模塊的私有內(nèi)存空間中的內(nèi)存超過(guò)第二內(nèi)存數(shù)目閾值后,將第二鏈表的內(nèi)存釋放到內(nèi)存管理模塊的第一內(nèi)存空間中。

      918、內(nèi)存管理模塊接收網(wǎng)絡(luò)線程模塊釋放的內(nèi)存。

      919、內(nèi)存管理模塊修改第一內(nèi)存空間的索引表信息。

      因此,本申請(qǐng)實(shí)施例的內(nèi)存管理的方法,業(yè)務(wù)線程模塊接收業(yè)務(wù)數(shù)據(jù),確定網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間是否能夠滿足該業(yè)務(wù)數(shù)據(jù)需求的內(nèi)存大小,在該網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),根據(jù)該網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間,處理該業(yè)務(wù)數(shù)據(jù)。在網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間不能滿足業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),業(yè)務(wù)線程向內(nèi)存管理模塊申請(qǐng)內(nèi)存,直至網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間能夠滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求,業(yè)務(wù)線程模塊將業(yè)務(wù)數(shù)據(jù)封裝在網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間中的內(nèi)存中生成業(yè)務(wù)消息,并發(fā)送給網(wǎng)絡(luò)線程模塊。這樣,在多個(gè)業(yè)務(wù)線程場(chǎng)景下,不同線程模塊分別通過(guò)各自的私有內(nèi)存空間處理業(yè)務(wù)數(shù)據(jù),避免了多個(gè)線程模塊同時(shí)處理業(yè)務(wù)數(shù)據(jù)時(shí),內(nèi)存管理模塊想要通過(guò)內(nèi)存鏈表上的管理鎖鎖定第一內(nèi)存空間的所有內(nèi)存造成的鎖沖突,從而減少了鎖開(kāi)銷,提高了系統(tǒng)的并發(fā)能力。

      圖10為本申請(qǐng)另一個(gè)實(shí)施例提供的內(nèi)存管理的方法的交互流程示意圖。本實(shí)施例中的各種術(shù)語(yǔ)的含義與前述各實(shí)施例相同。

      1001、網(wǎng)絡(luò)線程模塊啟動(dòng),并向內(nèi)存管理模塊發(fā)送第二注冊(cè)請(qǐng)求。

      1002、內(nèi)存管理模塊根據(jù)第二注冊(cè)請(qǐng)求,向該業(yè)務(wù)線程模塊發(fā)送為該業(yè)務(wù)線程模塊配置的至少一個(gè)第一內(nèi)存。該內(nèi)存管理模塊的第一內(nèi)存空間包括多個(gè)第一內(nèi)存。

      1003、網(wǎng)絡(luò)線程模塊將接收到的至少一個(gè)第一內(nèi)存存儲(chǔ)到網(wǎng)絡(luò)線程模塊的私有空間中。

      1004、業(yè)務(wù)線程模塊啟動(dòng),并向內(nèi)存管理模塊發(fā)送第一注冊(cè)請(qǐng)求。

      1005、內(nèi)存管理模塊根據(jù)第一注冊(cè)請(qǐng)求,為該業(yè)務(wù)線程模塊配置至少一個(gè)第一內(nèi)存。

      應(yīng)理解,該第一注冊(cè)請(qǐng)求與該第二注冊(cè)請(qǐng)求可以相同,也可以不同,本申請(qǐng)對(duì)此不進(jìn)行限定。

      1006、業(yè)務(wù)線程模塊將配置的至少一個(gè)第一內(nèi)存存儲(chǔ)到業(yè)務(wù)線程模塊的私有空間中。

      應(yīng)理解,本申請(qǐng)中業(yè)務(wù)線程和網(wǎng)絡(luò)線程可以同時(shí)申請(qǐng)內(nèi)存,也可以按先后順序申請(qǐng)內(nèi)存,即步驟1001~1003,與步驟1004~1006之間的先后順序本申請(qǐng)不進(jìn)行限定。

      1007、網(wǎng)絡(luò)線程模塊接收響應(yīng)業(yè)務(wù)數(shù)據(jù),例如,業(yè)務(wù)數(shù)據(jù)用于寫(xiě)入操作,則該響應(yīng)業(yè)務(wù)數(shù)據(jù)為寫(xiě)入的結(jié)果信息。

      該步驟1004在步驟1001~1006之前或之間的任一個(gè)步驟之后,本申請(qǐng)對(duì)此不進(jìn)行限定?;蛘?,若該步驟在附圖9對(duì)應(yīng)的實(shí)施例之后執(zhí)行時(shí),該步驟1007可以在918之后執(zhí)行,不需要上述步驟1001~步驟1006。

      1008、網(wǎng)絡(luò)線程模塊根據(jù)該業(yè)務(wù)數(shù)據(jù),確定網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間是否滿足業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求。

      1009、在網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間不滿足業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),網(wǎng)絡(luò)線程模塊向內(nèi)存管理模塊發(fā)送內(nèi)存請(qǐng)求。

      若網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間滿足業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求,則直接執(zhí)行步驟1013。

      1010、內(nèi)存管理模塊將第一內(nèi)存空間劃分為多個(gè)內(nèi)存集合,且為多個(gè)第一內(nèi)存集合配置內(nèi)存索引值,這樣內(nèi)存管理模塊可以根據(jù)內(nèi)存索引值為業(yè)務(wù)線程模塊配置內(nèi)存,即可以依次配置多個(gè)內(nèi)存,不需要一個(gè)一個(gè)遍歷。

      1011、內(nèi)存管理模塊為網(wǎng)絡(luò)線程模塊配置少一個(gè)第一內(nèi)存集合。

      1012、網(wǎng)絡(luò)線程模塊將該至少一個(gè)第一內(nèi)存集合存儲(chǔ)到網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間。

      1013、網(wǎng)絡(luò)線程模塊將業(yè)務(wù)數(shù)據(jù)封裝在網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間中的內(nèi)存中生成業(yè)務(wù)消息。

      1014、網(wǎng)絡(luò)線程模塊向業(yè)務(wù)線程模塊發(fā)送業(yè)務(wù)消息。

      1015、網(wǎng)絡(luò)線程模塊將該業(yè)務(wù)數(shù)據(jù)轉(zhuǎn)發(fā)到用戶。

      1016、網(wǎng)絡(luò)線程模塊將業(yè)務(wù)數(shù)據(jù)發(fā)出后,修改內(nèi)存使用計(jì)數(shù)和使用軌跡。

      1017、在內(nèi)存使用計(jì)數(shù)為1時(shí),業(yè)務(wù)線程模塊將業(yè)務(wù)消息占用的內(nèi)存釋放到網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間中的第一鏈表,超過(guò)第一鏈表的第一內(nèi)存數(shù)目閾值后,釋放到第二鏈表。當(dāng)網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間中的內(nèi)存超過(guò)第二內(nèi)存數(shù)目閾值后,將第一鏈表的內(nèi)存釋放到內(nèi)存管理模塊的第一內(nèi)存空間中。

      1018、內(nèi)存管理模塊接收業(yè)務(wù)線程模塊釋放的內(nèi)存。

      1019,內(nèi)存管理模塊修改第一內(nèi)存空間的索引表信息。

      因此,本申請(qǐng)實(shí)施例的內(nèi)存管理的方法,網(wǎng)絡(luò)線程模塊接收響應(yīng)業(yè)務(wù)數(shù)據(jù),確定網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間是否能夠滿足該業(yè)務(wù)數(shù)據(jù)需求的內(nèi)存大小,在該網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),根據(jù)該網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間中的內(nèi)存,處理該業(yè)務(wù)數(shù)據(jù)。在網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間不能滿足業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),業(yè)務(wù)線程向內(nèi)存管理模塊申請(qǐng)內(nèi)存,直至網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間能夠滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求,業(yè)務(wù)線程模塊將業(yè)務(wù)數(shù)據(jù)封裝在網(wǎng)絡(luò)線程模塊的私有內(nèi)存空間中的內(nèi)存中生成業(yè)務(wù)消息,并發(fā)送給業(yè)務(wù)線程模塊。這樣,在多個(gè)業(yè)務(wù)線程場(chǎng)景下,不同線程模塊分別通過(guò)各自的私有內(nèi)存空間處理業(yè)務(wù)數(shù)據(jù),避免了在內(nèi)存鏈表上配置管理鎖,鎖定第一內(nèi)存空間的所有內(nèi)存,從而減少了鎖沖突,提高了系統(tǒng)的并發(fā)能力。

      上文中詳細(xì)描述了根據(jù)本申請(qǐng)實(shí)施例的內(nèi)存管理的方法,下面將描述根據(jù)本申請(qǐng)實(shí)施例的內(nèi)存管理系統(tǒng)。

      圖11示出了根據(jù)本申請(qǐng)實(shí)施例的內(nèi)存管理系統(tǒng)1100的示意性框圖。該內(nèi)存管理系統(tǒng)包括內(nèi)存管理模塊1110和多個(gè)第一線程模塊1120,該內(nèi)存管理模塊1110用于管理多個(gè)內(nèi)存空間,且多個(gè)內(nèi)存空間中的第一內(nèi)存空間包括多個(gè)第一內(nèi)存,該第一內(nèi)存的容量為定值,該第一線程模塊1120用于管理第二內(nèi)存空間,該第二內(nèi)存空間包括至少一個(gè)該第一內(nèi)存。如圖11所示,該內(nèi)存管理系統(tǒng)1100包括:

      該第一線程模塊1120,用于接收業(yè)務(wù)數(shù)據(jù);

      該第一線程模塊1120,還用于確定該第二內(nèi)存空間是否滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求;

      該第一線程模塊1120,還用于使用該第二內(nèi)存空間中的內(nèi)存,處理該業(yè)務(wù)數(shù)據(jù)。

      可選地,該第一線程模塊1120還用于向該內(nèi)存管理模1110塊發(fā)送內(nèi)存請(qǐng)求,該內(nèi)存請(qǐng)求用于請(qǐng)求從該第一內(nèi)存空間申請(qǐng)內(nèi)存;該內(nèi)存管理模塊1110,用于根據(jù)該內(nèi)存請(qǐng)求,分配內(nèi)存,并對(duì)該第一內(nèi)存空間設(shè)置第一管理鎖,該第一管理鎖用于控制該第一內(nèi)存空間中內(nèi)存的訪問(wèn);該內(nèi)存管理模塊1110為該第一線程模塊配置內(nèi)存,并釋放該第一管理鎖;該第一線程模塊1120,還用于將該配置的內(nèi)存存儲(chǔ)到該第二內(nèi)存空間,以使該第二內(nèi)存空間能夠滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求。

      可選地,該內(nèi)存管理模塊1110具體用于:根據(jù)該內(nèi)存請(qǐng)求,分配該第一內(nèi)存空間中的至少一個(gè)第一內(nèi)存集合,該第一內(nèi)存空間包括多個(gè)第一內(nèi)存集合,該第一內(nèi)存集合包括至少兩個(gè)該第一內(nèi)存;該內(nèi)存管理模塊1110,還用于向該第一線程模塊發(fā)送該至少一個(gè)內(nèi)存集合。

      可選地,該內(nèi)存管理模塊1110,用于為該多個(gè)第一內(nèi)存集合中的每個(gè)第一內(nèi)存集合配置內(nèi)存索引值;該內(nèi)存管理模塊1110具體用于:根據(jù)該內(nèi)存請(qǐng)求和該內(nèi)存索引值,分配該至少一個(gè)第一內(nèi)存集合。

      可選地,該第一線程模塊1120,還用于向該內(nèi)存管理模塊發(fā)送第一注冊(cè)請(qǐng)求,該第一注冊(cè)請(qǐng)求用于向該內(nèi)存管理模塊請(qǐng)求內(nèi)存;該內(nèi)存管理模塊1110,還用于根據(jù)該第一注冊(cè)請(qǐng)求,向該第一線程模塊發(fā)送至少一個(gè)該第一內(nèi)存;該第一線程模塊1120,還用于根據(jù)該至少一個(gè)該第一內(nèi)存,生成該第二內(nèi)存空間。

      可選地,該內(nèi)存管理系統(tǒng)還包括第二線程模塊,該第一線程模塊1120具體用于:將該業(yè)務(wù)數(shù)據(jù)封裝在該第二內(nèi)存空間中的內(nèi)存中生成業(yè)務(wù)消息;該第一線程模塊1120,還用于向該第二線程模塊發(fā)送該業(yè)務(wù)消息。

      可選地,該第二線程模塊,還用于向該內(nèi)存管理模塊發(fā)送第二注冊(cè)請(qǐng)求,該第二注冊(cè)請(qǐng)求用于向該內(nèi)存管理模塊請(qǐng)求內(nèi)存;該內(nèi)存管理模塊1110,還用于根據(jù)該第二注冊(cè)請(qǐng)求,向該第二線程模塊發(fā)送至少一個(gè)該第一內(nèi)存;該第二線程模塊,用于根據(jù)該至少一個(gè)該第一內(nèi)存,生成第三內(nèi)存空間。

      可選地,該第一線程模塊1120為業(yè)務(wù)線程模塊,該第二線程模塊為網(wǎng)絡(luò)線程模塊,該第二線程模塊,還用于向存儲(chǔ)節(jié)點(diǎn)發(fā)送該業(yè)務(wù)消息;該第二線程模塊,還用于向該存儲(chǔ)節(jié)點(diǎn)發(fā)送該業(yè)務(wù)消息之后,為該第三內(nèi)存空間設(shè)置第二管理鎖,并修改該第三內(nèi)存空間的內(nèi)存使用計(jì)數(shù)和業(yè)務(wù)路徑,該第二管理鎖用于控制對(duì)該內(nèi)存使用計(jì)數(shù)和該業(yè)務(wù)路徑的修改,且該第二管理鎖不同于該第一管理鎖。

      可選地,該第一線程模塊1120為網(wǎng)絡(luò)線程模塊,該第二線程模塊為業(yè)務(wù)線程模塊,該第二線程模塊,還用于向用戶發(fā)送該業(yè)務(wù)消息;該第二線程模塊,還用于為該第三內(nèi)存空間設(shè)置第二管理鎖,并修改該第三內(nèi)存空間的內(nèi)存使用計(jì)數(shù)和業(yè)務(wù)路徑,該第二管理鎖用于控制對(duì)該內(nèi)存使用計(jì)數(shù)和該業(yè)務(wù)路徑的修改,且該第二管理鎖不同于該第一管理鎖。

      可選地,該第二線程模塊,還用于根據(jù)該內(nèi)存使用計(jì)數(shù),確定是否釋放該業(yè)務(wù)消息所占用的內(nèi)存。

      可選地,該第三內(nèi)存空間包括第一鏈表和第二鏈表,該內(nèi)存使用計(jì)數(shù)的初始預(yù)設(shè)值為1,且該內(nèi)存使用計(jì)數(shù)在對(duì)應(yīng)的內(nèi)存處于占用狀態(tài)時(shí)加1,處于空閑狀態(tài)時(shí)減1;該第二線程模塊,還用于在該內(nèi)存使用計(jì)數(shù)為1時(shí),將該業(yè)務(wù)消息所占用的內(nèi)存釋放到該第二鏈表中;該第二線程模塊,還用于在該第二鏈表中內(nèi)存?zhèn)€數(shù)超過(guò)第一數(shù)目閾值時(shí),將該業(yè)務(wù)消息所占用的剩余內(nèi)存釋放到該第一鏈表中。

      可選地,該第二線程模塊,還用于在該第三內(nèi)存空間中的內(nèi)存?zhèn)€數(shù)超過(guò)第二數(shù)目閾值時(shí),將該第二鏈表中的內(nèi)存釋放到該第一內(nèi)存空間。

      因此,第一業(yè)務(wù)線程接收業(yè)務(wù)數(shù)據(jù),確定第二內(nèi)存空間是否能夠滿足該業(yè)務(wù)數(shù)據(jù)需求的內(nèi)存大小,在該第二內(nèi)存空間滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),根據(jù)該第二內(nèi)存空間中的內(nèi)存,處理該業(yè)務(wù)數(shù)據(jù)。這樣,線程模塊分別通過(guò)各自的第二內(nèi)存空間處理業(yè)務(wù)數(shù)據(jù),避免了在內(nèi)存鏈表上配置管理鎖,鎖定第一內(nèi)存空間的所有內(nèi)存,從而減少了鎖沖突,提高了系統(tǒng)的并發(fā)能力。

      圖12示出了本申請(qǐng)的實(shí)施例提供的內(nèi)存管理系統(tǒng)的結(jié)構(gòu)示意圖。如圖12所示,該內(nèi)存管理系統(tǒng)包括至少一個(gè)處理器1202(例如具有計(jì)算和處理能力的通用處理器CPU、數(shù)字信號(hào)處理器(DSP)、專用集成電路(ASIC)、現(xiàn)成可編程門陣列(FPGA)等),處理器1202用于對(duì)內(nèi)存管理系統(tǒng)內(nèi)各模塊和器件進(jìn)行管理和調(diào)度。圖11所示的實(shí)施例中的內(nèi)存管理模塊1110、第一線程模塊1120以及第二線程模塊可以通過(guò)處理器1202實(shí)現(xiàn)。該內(nèi)存管理系統(tǒng)還包括至少一個(gè)收發(fā)器1205(接收器/發(fā)送器),存儲(chǔ)器1206。內(nèi)存管理系統(tǒng)的各個(gè)組件通過(guò)內(nèi)部連接通路互相通信,傳遞控制和/或數(shù)據(jù)信號(hào)。

      上述本申請(qǐng)實(shí)施例揭示的方法可以應(yīng)用于處理器1202,或者用于執(zhí)行存儲(chǔ)器1206中存儲(chǔ)的可執(zhí)行模塊,例如計(jì)算機(jī)程序。存儲(chǔ)器1206可能包含高速隨機(jī)存取存儲(chǔ)器(RAM:Random Access Memory),也可能還包括非不穩(wěn)定的存儲(chǔ)器(non-volatile memory),存儲(chǔ)器可以包括只讀存儲(chǔ)器和隨機(jī)存取存儲(chǔ)器,并向處理器提供需要的信令或數(shù)據(jù)、程序等等。存儲(chǔ)器的一部分還可以包括非易失行隨機(jī)存取存儲(chǔ)器(NVRAM)。通過(guò)至少一個(gè)收發(fā)器1205(可以是有線或者無(wú)線)實(shí)現(xiàn)與至少一個(gè)其他網(wǎng)元之間的通信連接。

      在一些實(shí)施方式中,存儲(chǔ)器1206存儲(chǔ)了程序12061,處理器1202執(zhí)行程序12061,用于執(zhí)行以下操作:

      通過(guò)收發(fā)器1205接收業(yè)務(wù)數(shù)據(jù);

      確定該第二內(nèi)存空間是否滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求;

      使用該第二內(nèi)存空間中的內(nèi)存,處理該業(yè)務(wù)數(shù)據(jù)。

      需要說(shuō)明的是,該內(nèi)存管理系統(tǒng)可以具體為圖11所示的實(shí)施例中的內(nèi)存管理系統(tǒng),并且可以用于執(zhí)行圖10所示的方法實(shí)施例中與內(nèi)存管理模塊1110、第一線程模塊1120以及第二線程模塊對(duì)應(yīng)的各個(gè)步驟和/或流程。

      從本申請(qǐng)實(shí)施例提供的以上技術(shù)方案可以看出,第一業(yè)務(wù)線程接收業(yè)務(wù)數(shù)據(jù),確定第二內(nèi)存空間是否能夠滿足該業(yè)務(wù)數(shù)據(jù)需求的內(nèi)存大小,在該第二內(nèi)存空間滿足該業(yè)務(wù)數(shù)據(jù)的內(nèi)存需求時(shí),根據(jù)該第二內(nèi)存空間中的內(nèi)存,處理該業(yè)務(wù)數(shù)據(jù)。這樣,線程模塊分別通過(guò)各自的第二內(nèi)存空間處理業(yè)務(wù)數(shù)據(jù),避免了在內(nèi)存鏈表上配置管理鎖,鎖定第一內(nèi)存空間的所有內(nèi)存,從而減少了鎖沖突,提高了系統(tǒng)的并發(fā)能力。

      本申請(qǐng)實(shí)施例還提供一種計(jì)算機(jī)存儲(chǔ)介質(zhì),該計(jì)算機(jī)存儲(chǔ)介質(zhì)可以存儲(chǔ)用于指示上述任一種方法的程序指令。

      可選地,該存儲(chǔ)介質(zhì)具體可以為存儲(chǔ)器1206。

      另外,本文中術(shù)語(yǔ)“和/或”,僅僅是一種描述關(guān)聯(lián)對(duì)象的關(guān)聯(lián)關(guān)系,表示可以存在三種關(guān)系,例如,A和/或B,可以表示:?jiǎn)为?dú)存在A,同時(shí)存在A和B,單獨(dú)存在B這三種情況。另外,本文中字符“/”,一般表示前后關(guān)聯(lián)對(duì)象是一種“或”的關(guān)系。

      本領(lǐng)域普通技術(shù)人員可以意識(shí)到,結(jié)合本文中所公開(kāi)的實(shí)施例描述的各示例的單元及算法步驟,能夠以電子硬件、計(jì)算機(jī)軟件或者二者的結(jié)合來(lái)實(shí)現(xiàn),為了清楚地說(shuō)明硬件和軟件的可互換性,在上述說(shuō)明中已經(jīng)按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬件還是軟件方式來(lái)執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計(jì)約束條件。專業(yè)技術(shù)人員可以對(duì)每個(gè)特定的應(yīng)用來(lái)使用不同方法來(lái)實(shí)現(xiàn)所描述的功能,但是這種實(shí)現(xiàn)不應(yīng)認(rèn)為超出本申請(qǐng)的范圍。

      所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為了描述的方便和簡(jiǎn)潔,上述描述的系統(tǒng)、裝置和單元的具體工作過(guò)程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過(guò)程,在此不再贅述。

      在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的系統(tǒng)、裝置和方法,可以通過(guò)其它的方式實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另外,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過(guò)一些接口、裝置或單元的間接耦合或通信連接,也可以是電的,機(jī)械的或其它的形式連接。

      所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上。可以根據(jù)實(shí)際的需要選擇其中的部分或者全部單元來(lái)實(shí)現(xiàn)本申請(qǐng)實(shí)施例方案的目的。

      另外,在本申請(qǐng)各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以是兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能單元的形式實(shí)現(xiàn)。

      所述集成的單元如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中?;谶@樣的理解,本申請(qǐng)的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分,或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本申請(qǐng)各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括:U盤、移動(dòng)硬盤、只讀存儲(chǔ)器(ROM,Read-Only Memory)、隨機(jī)存取存儲(chǔ)器(RAM,Random Access Memory)、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。

      以上所述,僅為本申請(qǐng)的具體實(shí)施方式,但本申請(qǐng)的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本申請(qǐng)揭露的技術(shù)范圍內(nèi),可輕易想到各種等效的修改或替換,這些修改或替換都應(yīng)涵蓋在本申請(qǐng)的保護(hù)范圍之內(nèi)。因此,本申請(qǐng)的保護(hù)范圍應(yīng)以權(quán)利要求的保護(hù)范圍為準(zhǔn)。

      當(dāng)前第1頁(yè)1 2 3 
      網(wǎng)友詢問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1