两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

一種多核并行離散事件仿真的內(nèi)存管理方法

文檔序號(hào):8298920閱讀:1092來(lái)源:國(guó)知局
一種多核并行離散事件仿真的內(nèi)存管理方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及多核并行離散事件仿真系統(tǒng)的內(nèi)存管理方法,尤其是針對(duì)多核并行離散仿真系統(tǒng)的內(nèi)存管理問題,提供一種基于事件包全局虛擬時(shí)間估計(jì)的邏輯進(jìn)程循環(huán)內(nèi)存分配與回收管理方法。
【背景技術(shù)】
[0002]并行離散事件仿真(ParallelDiscrete Event Simulat1n, PDES)由一組邏輯進(jìn)程(Logical Process,LP)構(gòu)成,每個(gè)LP有獨(dú)立的狀態(tài),負(fù)責(zé)自身的模型解算,并且有自己獨(dú)立的仿真邏輯時(shí)間,稱為本地虛擬時(shí)間(Local Virtual Time,LVT)。并行離散事件仿真系統(tǒng)的LP是并行運(yùn)行的。LP之間不共享任何的狀態(tài)變量,僅通過(guò)發(fā)送和接收事件的方式進(jìn)行數(shù)據(jù)傳遞。
[0003]一般地,多核并行離散事件仿真系統(tǒng)是指在一個(gè)或多個(gè)CPU上運(yùn)行的并行離散時(shí)間仿真系統(tǒng),其最主要特征是每個(gè)邏輯進(jìn)程關(guān)聯(lián)到一個(gè)CPU物理核,整個(gè)仿真系統(tǒng)的程序在一個(gè)進(jìn)程空間內(nèi),邏輯進(jìn)程不需要跨進(jìn)程通信。多核并行離散事件仿真系統(tǒng)和分布式并行離散事件仿真系統(tǒng)相比,最大優(yōu)勢(shì)是邏輯進(jìn)程間的通信開銷小、運(yùn)行效率高。但由于操作系統(tǒng)的全局統(tǒng)一分配內(nèi)存需要同步,因此,需要對(duì)多核并行離散事件仿真系統(tǒng)使用的內(nèi)存進(jìn)行管理。多核并行離散事件仿真系統(tǒng)的內(nèi)存管理過(guò)程包括內(nèi)存分配、全局虛擬時(shí)間(Global Virtual Time, GVT)估計(jì)、內(nèi)存回收三個(gè)步驟。
[0004]首先,多個(gè)邏輯進(jìn)程在創(chuàng)建事件時(shí)需要同時(shí)向操作系統(tǒng)申請(qǐng)內(nèi)存空間,邏輯進(jìn)程申請(qǐng)內(nèi)存的操作容易成為仿真系統(tǒng)運(yùn)行性能的瓶頸。需要有合適的內(nèi)存分配方式來(lái)解決多個(gè)邏輯進(jìn)程申請(qǐng)內(nèi)存的競(jìng)爭(zhēng)問題。
[0005]其次,并行離散事件仿真系統(tǒng)的每個(gè)事件都有一個(gè)時(shí)戳(timestamp),時(shí)戳表示事件發(fā)生的仿真邏輯時(shí)間。為了確保仿真因果關(guān)系,每個(gè)LP必須按照事件時(shí)戳的增序關(guān)系順序處理事件,否則仿真系統(tǒng)將出現(xiàn)因果錯(cuò)誤(causality errors)。因此,這樣的并行執(zhí)行機(jī)制和因果關(guān)系要求,使得并行離散事件仿真必須引入時(shí)間同步機(jī)制協(xié)調(diào)LP的運(yùn)行。當(dāng)前,同步機(jī)制主要有保守時(shí)間同步算法和樂觀時(shí)間同步算法。保守時(shí)間同步算法能夠嚴(yán)格的防止出現(xiàn)因果錯(cuò)誤,但會(huì)阻塞LP的運(yùn)行,使得LP的并行性較差。樂觀時(shí)間同步算法,也稱為時(shí)間彎曲(Time Wrap)算法,則不阻塞LP的運(yùn)行,允許因果錯(cuò)誤出現(xiàn)。在樂觀時(shí)間同步機(jī)制下,已處理的事件占用的內(nèi)存空間不能被邏輯進(jìn)程立刻回收。邏輯進(jìn)程將已處理的事件保存起來(lái),當(dāng)檢測(cè)到出現(xiàn)因果錯(cuò)誤時(shí),通過(guò)回滾(rollback)的方式將邏輯進(jìn)程的狀態(tài)恢復(fù)到之前正常的狀態(tài),然后重新按照事件的時(shí)序關(guān)系繼續(xù)執(zhí)行。只有時(shí)戳小于全局虛擬時(shí)間(Global Virtual Time, GVT)的事件才不會(huì)被回滾,其占用的內(nèi)存空間才可以被安全的回收。全局虛擬時(shí)間估計(jì)算法的效率和精度直接影響仿真系統(tǒng)內(nèi)存使用的效率。
[0006]最后,內(nèi)存的回收方式也會(huì)影響內(nèi)存的使用效率。例如,全局內(nèi)存池雖然可以解決內(nèi)存分配競(jìng)爭(zhēng)的問題,但是內(nèi)存回收和內(nèi)存分配還是需要同步操作。
[0007]因此,多核并行離散事件仿真系統(tǒng)的內(nèi)存管理與內(nèi)存分配方式、全局虛擬時(shí)間估計(jì)的精度、內(nèi)存回收方式相關(guān)。仿真系統(tǒng)的內(nèi)存管理直接影響了仿真系統(tǒng)的運(yùn)行效率,已經(jīng)成為仿真領(lǐng)域研宄人員關(guān)心的一個(gè)關(guān)鍵技術(shù)問題。很多研宄人員在這方面做了很多研宄工作,例如全局內(nèi)存池方法、基于線程的內(nèi)存池方法等。這些方法可以部分解決內(nèi)存分配競(jìng)爭(zhēng)的問題,但是沒有和全局虛擬時(shí)間的估計(jì)相結(jié)合,沒有完全解決內(nèi)存是否可回收以及回收方式的問題。

【發(fā)明內(nèi)容】

[0008]本發(fā)明要解決的技術(shù)問題是:提供一種多核并行離散事件仿真的內(nèi)存管理方法,滿足仿真實(shí)驗(yàn)過(guò)程中多個(gè)邏輯進(jìn)程同時(shí)申請(qǐng)內(nèi)存空間的要求,避免內(nèi)存申請(qǐng)同步操作。通過(guò)準(zhǔn)確估計(jì)全局虛擬時(shí)間GVT,快速、精確回收事件占用的內(nèi)存,提高內(nèi)存的使用效率。
[0009]本方法由N個(gè)邏輯進(jìn)程和一個(gè)GVT計(jì)算進(jìn)程實(shí)現(xiàn),其中N為自然數(shù)且滿足N多2。邏輯進(jìn)程用LPi表示,下標(biāo)i為邏輯進(jìn)程的唯一標(biāo)識(shí),I ^ i ^ No GVT計(jì)算進(jìn)程用GP (GVTProcess)表示。每個(gè)邏輯進(jìn)程LPi都有一個(gè)獨(dú)立的內(nèi)存池MemPool i。]^1]1?00]^是一個(gè)先入先出(FIFO)的動(dòng)態(tài)隊(duì)列,隊(duì)列的大小一般取128、256、512、1024幾個(gè)典型值,隊(duì)列的每個(gè)元素是一個(gè)內(nèi)存塊,在一個(gè)內(nèi)存塊上,邏輯進(jìn)程LPi可以創(chuàng)建用于與其他邏輯進(jìn)程間進(jìn)行數(shù)據(jù)交換的事件。事件定義為四元組BE (s, t, ebi, ts, ed),其中BE.s表示發(fā)送該事件的邏輯進(jìn)程的唯一標(biāo)識(shí),BE.t表示接收該事件的邏輯進(jìn)程的唯一標(biāo)識(shí);BE.ebi是事件的索引,為正整數(shù);BE.ts是事件的仿真時(shí)戳,為正實(shí)數(shù);BE.ed是事件攜帶的和具體應(yīng)用相關(guān)的數(shù)據(jù),為通用型指針,如void*。邏輯進(jìn)程LPi有一個(gè)事件緩沖隊(duì)列EventCacheList 1、一個(gè)待處理事件隊(duì)列 UnProEventListjP—個(gè)已處理事件隊(duì)列 ProEventList iD EventCacheListi是一個(gè)線程安全的并發(fā)隊(duì)列,用于接收其他邏輯進(jìn)程發(fā)來(lái)的事件。對(duì)于EventCacheListi,多個(gè)事件的插入和讀取操作可以并行進(jìn)行。UnPr0EventListi用于存放邏輯進(jìn)程LP i的還沒有處理事件,ProEventListi用于存放邏輯進(jìn)程LP ^勺已處理但還沒有回收內(nèi)存的事件。
[0010]此外,所有的邏輯進(jìn)程都包含以下變量,以邏輯進(jìn)程1^為例:用于記錄邏輯進(jìn)程LPi的事件包索引的變量ebi i,ebiiS正整數(shù);事件包的大小EventSize p EventSizei為正整數(shù);邏輯進(jìn)程LPi自身記錄的全局虛擬時(shí)間GVTValue PGVTValueiS正實(shí)數(shù);記錄LPi的仿真結(jié)束時(shí)間的變量StopTimei,正實(shí)數(shù);邏輯進(jìn)程LP ^勺本地虛擬時(shí)間LVT ^ LVTi為正實(shí)數(shù);邏輯進(jìn)程1^發(fā)送的事件的最小時(shí)戳MTS i,MTS^正實(shí)數(shù);邏輯進(jìn)程LP i給其他邏輯進(jìn)程發(fā)送的事件的計(jì)數(shù)器SntCi, SntCiS正整數(shù);記錄邏輯進(jìn)程LP ,收到的其他進(jìn)程發(fā)來(lái)的事件的計(jì)數(shù)器,稱為暫態(tài)事件計(jì)數(shù)器RcvMapi。一個(gè)大小可以動(dòng)態(tài)變化的動(dòng)態(tài)隊(duì)列,隊(duì)列的每個(gè)元素是一個(gè)形如(eventKey、EValue)的二元組,二元組的鍵eventKey是事件的索引,值EValue是邏輯進(jìn)程LPi收到的索引為對(duì)應(yīng)鍵值的事件的數(shù)量。
[0011]所有的邏輯進(jìn)程通過(guò)構(gòu)建自己的事件包消息向GVT計(jì)算進(jìn)程GP發(fā)送估計(jì)GVT所需的數(shù)據(jù)。事件包消息定義為五元組EBR(id,ebi, LVT, MTS, TMMap),其中EBR.1d是發(fā)送該事件包消息的邏輯進(jìn)程的唯一標(biāo)識(shí),若邏輯進(jìn)程LPi*送事件包消息,那么EBR.1d的取值為i。EBR.ebi是事件包消息產(chǎn)生時(shí)對(duì)應(yīng)的邏輯進(jìn)程的事件包索引,若邏輯進(jìn)程LPi發(fā)送事件包消息,那么EBR.ebi取值為eb1- EBR.LVT記錄邏輯進(jìn)程的本地虛擬時(shí)間,EBR.MTS記錄邏輯進(jìn)程發(fā)送的事件的最小時(shí)戳。EBR.TMMap稱為事件包消息的暫態(tài)事件計(jì)數(shù)器,它和邏輯進(jìn)程LPi的暫態(tài)事件計(jì)數(shù)器RcvMap i有相同的數(shù)據(jù)結(jié)構(gòu)。邏輯進(jìn)程LP 送事件包消息時(shí),LP^f RcvMap i的數(shù)據(jù)完全賦值給EBR.TMMap。
[0012]GVT計(jì)算進(jìn)程GP通過(guò)事件包消息緩沖隊(duì)列EBRCacheList儲(chǔ)存所有邏輯進(jìn)程發(fā)來(lái)的事件包消息。EBRCacheList是一個(gè)線程安全的并發(fā)隊(duì)列。多個(gè)邏輯進(jìn)程可以并發(fā)地向一個(gè)GVT計(jì)算進(jìn)程的事件包消息緩沖隊(duì)列插入多個(gè)事件包消息。此外,GP通過(guò)三個(gè)動(dòng)態(tài)隊(duì)列TMCMap, MTSMap和LVTMap記錄所有邏輯進(jìn)程發(fā)來(lái)的每個(gè)事件包消息的數(shù)據(jù)。其中,暫態(tài)消息隊(duì)列TMCMap是大小可以動(dòng)態(tài)變化的隊(duì)列,隊(duì)列的每個(gè)元素是一個(gè)形如(ebKey、EBValue)的二元組,二元組的鍵ebKey是事件包消息的索引,值EBValue是有相同索引的事件的數(shù)量。事件最小時(shí)戳隊(duì)列MTSMap是大小可以動(dòng)態(tài)變化的隊(duì)列隊(duì)列的每個(gè)元素是一個(gè)形如(ebKey、MTValue)的二元組,二元組的鍵ebKey是事件包消息的索引,值MTValue記錄事件包消息的發(fā)送事件的時(shí)戳最小值EBR.MTS ;本地虛擬時(shí)間隊(duì)列LVTMap是大小可以動(dòng)態(tài)變化的隊(duì)列,隊(duì)列的每個(gè)元素是一個(gè)形如(ebKey、TValue)的二元組,二元組的鍵ebKey是事件包消息的索引,值TValue記錄事件包消息記錄的本地虛擬時(shí)間EBR.LVT。此外,GVT計(jì)算進(jìn)程還包含一個(gè)GVTValue變量和一個(gè)StopTime變量。GVTValue變量用于記錄估計(jì)出的GVT時(shí)間,GVTValue是正實(shí)數(shù);變量StopTime記錄仿真結(jié)束時(shí)間,StopTime是正實(shí)數(shù)。
[0013]GP通過(guò)計(jì)算獲得GVT的新的估計(jì)值后,通過(guò)GVT通知消息給其他邏輯進(jìn)程發(fā)送GVT的值,GVT通知消息表示為GN(NewGVTValue),其中GN.NewGVTValue表示新的GVT估計(jì)值,為正實(shí)數(shù)。
[0014]本方法的基本處理過(guò)程是:首先創(chuàng)建N個(gè)邏輯進(jìn)程和一個(gè)GVT計(jì)算進(jìn)程,N個(gè)邏輯進(jìn)程、GVT計(jì)算進(jìn)程同時(shí)進(jìn)行初始化;然后N個(gè)邏輯進(jìn)程并行地處理事件、向自己的內(nèi)存池申請(qǐng)內(nèi)存、發(fā)送事件、接收事件、向GVT計(jì)算進(jìn)程發(fā)送事件包消息;GVT計(jì)算進(jìn)程收集到N個(gè)具有相同索引的事件包消息后計(jì)算GVT的值,然后向所有邏輯進(jìn)程發(fā)送GVT通知消息;最后N個(gè)邏輯進(jìn)程并行地讀取GVT通知消息并獲取GVT的值,再回收時(shí)戳小于全局虛擬時(shí)間的事件占用的內(nèi)存?;厥盏膬?nèi)存放入處理事件的邏輯進(jìn)程的內(nèi)存池,而非內(nèi)存被分配時(shí)所在的內(nèi)存池。例如,邏輯進(jìn)程LPi向MemPool i申請(qǐng)的內(nèi)存,創(chuàng)建事件BE (i,j, ebi, ts, ed)并發(fā)給邏輯進(jìn)程LPj (i Φ j),事件BE(i,j,ebi,tS,ed)占用的內(nèi)存將被邏輯進(jìn)程LPj的內(nèi)存池MemPoolj回收。反之,邏輯進(jìn)程LP」給邏輯進(jìn)程LP i發(fā)送的事件BE(j, i, ebi, ts, ed)占用的內(nèi)存被邏輯進(jìn)程LPi的內(nèi)存池MemPool i回收。這就是循環(huán)內(nèi)存分配與回收方法。
[0015]具體的技術(shù)方案如下:
[0016]第一步:創(chuàng)建N個(gè)邏輯進(jìn)程和一個(gè)GVT計(jì)算進(jìn)程,GVT計(jì)算進(jìn)程進(jìn)行初始化,N個(gè)邏輯進(jìn)程并發(fā)地進(jìn)行初始化并分配內(nèi)存池。1.1,1.2是兩個(gè)并行的步驟。
[0017]1.1:GVT計(jì)算進(jìn)程初始化,具體步驟是:首先給StopTime賦值,如StopTime =5000。StopTime的取值和具體的應(yīng)用相關(guān),可以取任何的正實(shí)數(shù),如5000,單位可以為秒、分鐘、小時(shí)等時(shí)間單位。然后令GVTValue = 0,GVTValue的單位和StopTime的單位相同。最后GVT計(jì)算進(jìn)程轉(zhuǎn)到第四步。
[0018]1.2:N個(gè)邏輯進(jìn)程并行地初始化,邏輯進(jìn)程LPi進(jìn)行初始化的方法是=StopTimei =StopTime,GVTValuei= O, ebi j= I, LVT j = 0,MTS j = 0,SntCi= 0, RcvMap 丨為空,EventSize j的取值為 2P 形式,P 為自然數(shù),EventSize i—般取值為 8、16、32、64、128,EventCacheList $空,ProEventLiSti為空。邏輯進(jìn)程LP i將初始事件插入待處理事件隊(duì)列UnProEventList ^初始事件的個(gè)數(shù)不小于I。N個(gè)邏輯進(jìn)程執(zhí)行第二步。
[0019]第二步:N個(gè)邏輯進(jìn)程并行地處理事件、發(fā)送事件和接收事件。每個(gè)邏輯進(jìn)程通過(guò)自己的并發(fā)事件緩沖隊(duì)列實(shí)現(xiàn)同時(shí)接收多個(gè)事件以及讀取事件所需的同步操作。邏輯進(jìn)程1^處理事件、發(fā)送事件和接收事件的方法為:
[0020]2.1:設(shè)置邏輯進(jìn)程1^的變量,MTSi= OjntCi= 0,RcvMap i為空,令已處理事件計(jì)數(shù)器PEventCoun
當(dāng)前第1頁(yè)1 2 3 4 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
安阳县| 齐齐哈尔市| 竹山县| 山丹县| 嫩江县| 竹溪县| 合阳县| 马尔康县| 榆中县| 盐池县| 徐汇区| 明光市| 日照市| 莎车县| 滦平县| 元江| 曲阳县| 松原市| 山东省| 西乌珠穆沁旗| 连平县| 新野县| 汪清县| 新竹县| 肥乡县| 包头市| 邯郸县| 和硕县| 金塔县| 通海县| 安福县| 岚皋县| 临桂县| 循化| 鄂州市| 龙井市| 葫芦岛市| 临猗县| 盐津县| 广平县| 陵川县|