[发明专利]一种多核并行离散事件仿真的内存管理方法有效
申请号: | 201510093402.5 | 申请日: | 2015-03-01 |
公开(公告)号: | CN104615492B | 公开(公告)日: | 2017-12-19 |
发明(设计)人: | 彭勇;姚新宇;杨妹;秦龙;查亚兵;尹全军;鞠儒生;刘晓铖;段伟 | 申请(专利权)人: | 中国人民解放军国防科学技术大学 |
主分类号: | G06F9/46 | 分类号: | G06F9/46;G06F9/50 |
代理公司: | 国防科技大学专利服务中心43202 | 代理人: | 郭敏 |
地址: | 410073 湖*** | 国省代码: | 湖南;43 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | 本发明公开了一种多核并行离散事件仿真的内存管理方法,目的是解决仿真实验过程中多个逻辑进程同时申请内存空间的要求,避免内存申请同步操作。技术方案是首先创建N个逻辑进程和一个GVT计算进程;N个逻辑进程并行地处理事件、向自己的内存池申请内存、发送事件、接收事件、向GVT计算进程发送事件包消息;GVT计算进程计算GVT的值,向所有逻辑进程发送GVT通知消息;N个逻辑进程读取GVT通知消息并获取GVT的值,回收时戳小于全局虚拟时间的事件占用的内存。回收的内存放入处理事件的逻辑进程的内存池,而非内存被分配时所在的内存池。采用本发明可避免单个内存池既分配又回收带来的同步问题和多逻辑进程竞争内存的问题,提高了内存的使用效率。 | ||
搜索关键词: | 一种 多核 并行 离散 事件 仿真 内存 管理 方法 | ||
【主权项】:
一种多核并行离散事件仿真的内存管理方法,其特征在于包括以下步骤:第一步:创建N个逻辑进程和一个全局虚拟时间计算进程即GVT计算进程,GVT计算进程进行初始化,同时N个逻辑进程并发地进行初始化并分配内存池,其中N为自然数且满足N≥2:GVT计算进程初始化的方法是:首先给仿真结束时间变量StopTime赋值,StopTime为正实数,单位为秒或分钟或小时;然后令全局虚拟时间变量GVTValue=0,GVTValue的单位和StopTime的单位相同;事件包消息缓冲队列EBRCacheList置为空,EBRCacheList是一个线程安全的并发队列,它的元素是事件包消息;GVT计算进程转到第四步;N个逻辑进程并行地进行初始化,第i个逻辑进程用LPi表示,i为逻辑进程LPi的唯一标识,1≤i≤N;逻辑进程LPi进行初始化的方法是:LPi的仿真结束时间变量StopTimei=StopTime,LPi的全局虚拟时间变量GVTValuei=0,LPi的事件包索引变量ebii=1,LPi的本地虚拟时间变量LVTi=0,LPi的发送事件最小时戳变量MTSi=0,LPi的已发送事件计数器SntCi=0,LPi的事件包大小变量EventSizei的取值为2p形式,p为自然数;LPi的暂态事件计数器RcvMapi为空,RcvMapi是一个大小可以动态变化的动态队列,队列的每个元素是一个形如(eventKey、EValue)的二元组,二元组的键eventKey是事件的索引,值EValue是逻辑进程LPi收到的索引为对应键值的事件的数量,事件BE(s,i,ebi,ts,ed)是一个五元组,其中BE.s表示发送该事件的逻辑进程的唯一标识,BE.i表示接收该事件的逻辑进程的唯一标识;BE.ebi是事件的索引,为正整数;BE.ts是事件的仿真时戳,为正实数;BE.ed是事件携带的和具体的应用相关的数据,为通用型指针;LPi的事件缓冲队列EventCacheListi置为空,队列的元素为事件;EventCacheListi是一个线程安全的并发队列,用于接收其他逻辑进程发来的事件;LPi的已处理事件队列ProEventListi为空,队列的元素为事件;逻辑进程LPi将初始事件插入待处理事件队列UnProEventListi,队列的元素为事件,初始事件的个数不小于1;N个逻辑进程执行第二步;第二步:N个逻辑进程并行地处理事件、发送事件和接收事件,方法为:2.1:设置逻辑进程LPi的变量,MTSi=0,SntCi=0,RcvMapi为空,令已处理事件计数器PEventCounti=0,PEventCounti是逻辑进程LPi的局部变量,为自然数;2.2:判断逻辑进程LPi的UnProEventListi中是否有事件,如果没有,则转到2.4;如果有,则进行处理,步骤如下:2.2.1:从逻辑进程LPi的UnProEventListi中取出第一个事件BE(s,i,ebi,ts,ed),PEventCounti加1,即PEventCounti=PEventCounti+1;2.2.2:如果LPi的本地虚拟时间LVTi小于事件的时戳BE.ts,令LVTi=BE.ts;2.2.3:逻辑进程LPi将事件BE(s,i,ebi,ts,ed)插入到已处理事件队列ProEventListi;2.3逻辑进程LPi给其他的一个逻辑进程LPj发送事件BE(s,t,ebi,ts,ed),其中j为正整数,满足1≤j≤N且j≠i,每个值的选取概率为1/(N‑1),发送的事件插入逻辑进程LPj的事件缓冲队列EventCacheListj中;2.4:判断逻辑进程LPi的EventCacheListi中是否有事件,如果没有,则转到2.5;如果有,则进行如下处理:2.4.1:从EventCacheListi取出第一个事件BE(s,i,ebi,ts,ed),在RcvMapi中增加事件记录RcvMapi[BE.ebi]=RcvMapi[BE.ebi]+1;2.4.2:将事件插入到待处理事件队列UnProEventListi;2.5:判断处理的事件计数器PEventCounti是否大于EventSizei,如果PEventCounti<EventSizei,则转到2.2,否则执行第三步;第三步:N个逻辑进程并行地向GVT计算进程的事件包消息缓冲队列EBRCacheList插入事件包消息,事件包消息定义为五元组EBR(id,ebi,LVT,MTS,TMMap),其中EBR.id是发送该事件包消息的逻辑进程的唯一标识,若逻辑进程LPi发送事件包消息,则EBR.id的取值为i;EBR.ebi是事件包消息的索引,若逻辑进程LPi发送事件包消息,则EBR.ebi取值为ebii,EBR.LVT记录逻辑进程的本地虚拟时间,EBR.MTS记录逻辑进程发送的事件的最小时戳,EBR.TMMap称为事件包消息的暂态事件计数器,它和逻辑进程LPi的暂态事件计数器RcvMapi有相同的数据结构,逻辑进程LPi发送事件包消息时,LPi将RcvMapi的数据完全赋值给EBR.TMMap;转到第五步;第四步:GVT计算进程GP计算GVT的最新值,并分别向N个逻辑进程发送GVT通知消息,具体步骤如下:4.1:GVT计算进程查询包消息缓冲队列EBRCacheList是否有事件包消息,如果没有,则继续查询EBRCacheList;如果有,则进行如下处理:4.1.1:从事件包消息缓冲队列EBRCacheList取出第一个事件包消息EBR(id,ebi,LVT,MTS,TMMap),然后记录事件包消息的暂态事件的数量,具体步骤如下:4.1.1.1:令临时计数变量k=0,若k<EBR.TMMap的大小则转到4.1.1.2,否则转到4.1.2;4.1.1.2:令GVT计算进程的暂态消息队列TMCMap[k]=TMCMap[k]+EBR.TMMap[k],k=k+1,若k<EBR.TMMap的大小则转到4.1.1.2,否则转到4.1.2;暂态消息队列TMCMap是大小可以动态变化的队列,队列的每个元素是一个形如(ebKey、EBValue)的二元组,二元组的键ebKey是事件包消息的索引,值EBValue是有相同索引的事件的数量;4.1.2:判断GVT计算进程的事件最小时戳队列MTSMap是否有键值为EBR.ebi的记录,如果没有,则MTSMap[EBR.ebi]=EBR.MTS,如果有且满足MTSMap[EBR.ebi]>EBR.MTS,则MTSMap[EBR.ebi]=EBR.MTS;事件最小时戳队列MTSMap是大小可以动态变化的队列,队列的每个元素是一个形如(ebKey、MTValue)的二元组,值MTValue记录事件包消息的发送事件的时戳最小值EBR.MTS;4.1.3:判断GVT计算进程的本地虚拟时间队列LVTMap是否有键值为EBR.ebi的记录,如果没有,则LVTMap[EBR.ebi]=EBR.LVT,如果有且满足LVTMap[EBR.ebi]>EBR.LVT,则LVTMap[EBR.ebi]=EBR.LVT;本地虚拟时间队列LVTMap是大小可以动态变化的队列,队列的每个元素是一个形如(ebKey、TValue)的二元组,值TValue记录事件包消息记录的本地虚拟时间EBR.LVT;4.2:判断是否收到N个索引为同一个EBR.ebi的事件包消息,如果是,转到4.3,否则转到4.1;4.3:计算GVT的值并赋给全局虚拟时间变量GVTValue,判断GVTValue是否小于仿真结束时间StopTime,如果是,则转到第四步,否则转到第七步;第五步:N个逻辑进程并行地分别从自己的事件缓冲队列中取出GVT通知消息GN(NewGVTValue),GVT通知消息GN(NewGVTValue)含一个变量GN.NewGVTValue,GN.NewGVTValue表示新的GVT估计值,为正实数;逻辑进程LPi取出GVT通知消息并获取GVT的值的方法是:5.1:判断逻辑进程LPi的EventCacheListi的第一个事件是不是GVT通知消息,如果是,转到5.2,否则转到第二步;5.2:逻辑进程LPi从EventCacheListi取出GVT通知消息GN(NewGVTValue),并将GVT的最新值GN.NewGVTValue赋给逻辑进程LPi的GVTValuei变量,即GVTValuei=GN.NewGVTValue;第六步:N个逻辑进程并行地回收自己的已处理事件队列中事件占用的内存,LPi回收自己的已处理事件队列中事件占用的内存的方法为:6.1:对于逻辑进程LPi的已处理事件队列ProEventListi中的每个事件BE(s,i,ebi,ts,ed),判断事件的时戳BE.ts是否小于逻辑进程记录的GVTValuei;如果BE.ts<GVTValuei,则将事件BE(s,i,ebi,ts,ed)从ProEventListi中取出,并将事件占用的内存块插入到逻辑进程内存池MemPooli的队尾;6.2:判断仿真运行是否结束,如果逻辑进程LPi的GVTValuei小于仿真结束时间StopTimei,则转到第二步,否则转到第七步;第七步:结束。
下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国人民解放军国防科学技术大学,未经中国人民解放军国防科学技术大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/patent/201510093402.5/,转载请声明来源钻瓜专利网。