• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      仿真建模工具內(nèi)存分配優(yōu)化

      2024-08-03 00:00:00喬仕嶺劉晨王學(xué)松孫林丁光亮
      科技創(chuàng)新與應(yīng)用 2024年22期

      摘 要:在一體化仿真建模工具的性能優(yōu)化時,內(nèi)存分配優(yōu)化方面提出內(nèi)存池式分配方式,該分配方式特采用全局內(nèi)存池基礎(chǔ)實(shí)現(xiàn)并加上并行線程內(nèi)存管理的方法來較好地匹配仿真工具的系統(tǒng)多臨時對象和多動態(tài)分配內(nèi)存的應(yīng)用特點(diǎn),性能測試表明,該內(nèi)存池具有良好的空間特性和效率,比傳統(tǒng)的操作系統(tǒng)直接分配內(nèi)存節(jié)省約50.7%的分配時間。

      關(guān)鍵詞:內(nèi)存池;仿真建模工具;分配優(yōu)化;管理模塊;模塊設(shè)計

      中圖分類號:TP391 文獻(xiàn)標(biāo)志碼:A 文章編號:2095-2945(2024)22-0046-04

      Abstract: When optimizing the performance of the integrated simulation modeling tool, the memory pool allocation method is put forward in the aspect of memory allocation optimization. This allocation method is implemented on the basis of global memory pool and the method of parallel thread memory management is used to better match the application characteristics of multi-temporary objects and multi-dynamic memory allocation of the simulation tool. The performance test shows that the memory pool has good space characteristics and efficiency. It saves about 50.7% of the allocation time than the traditional operating system to allocate memory directly.

      Keywords: memory pool; simulation modeling tool; allocation optimization; management module; module design

      當(dāng)前的仿真建模工具是桌面式低代碼拖拽式多專業(yè)一體化的,系統(tǒng)的可操作性、流暢性、實(shí)時性都是系統(tǒng)應(yīng)用要考慮的因素。在這樣架構(gòu)的仿真建模工具中,存在著大量對象的頻繁創(chuàng)建和銷毀,這里的運(yùn)行效率顯然已經(jīng)成為瓶頸。為了保證系統(tǒng)實(shí)時性的同時提升工具的綜合性能,內(nèi)存分配管理尤為關(guān)鍵。完全依賴系統(tǒng)內(nèi)存管理方式難以應(yīng)對頻繁操作對象所帶來的內(nèi)存碎片化問題和效率問題,將影響系統(tǒng)的性能和穩(wěn)定性。因此設(shè)計一個高效的內(nèi)存管理模塊尤為必要。內(nèi)存池式分配模塊能夠優(yōu)化內(nèi)存管理過程,通過池式的管理能夠有效管理臨時對象的生命周期,減少操作系統(tǒng)層面帶來的內(nèi)存管理影響。這種方法不僅能減少內(nèi)存碎片化,提高內(nèi)存利用率,還能降低操作系統(tǒng)開銷,顯著提升仿真建模工具的執(zhí)行效率和實(shí)時性。

      本論文旨在深入探討在多專業(yè)一體化桌面式低代碼仿真建模環(huán)境下,設(shè)計內(nèi)存池模塊的設(shè)計與實(shí)現(xiàn)。通過對內(nèi)存池式管理的設(shè)計理念、實(shí)現(xiàn)機(jī)制以及內(nèi)存分配性能優(yōu)化進(jìn)行研究,旨在為實(shí)時或超實(shí)時仿真環(huán)境系統(tǒng)性能提升提供可行的解決方案。同時,此研究也將探索內(nèi)存池式管理在減少內(nèi)存碎片化、提升系統(tǒng)穩(wěn)定性及執(zhí)行效率方面的價值。

      1 內(nèi)存布局

      進(jìn)程內(nèi)存布局分為Code Segment、Data Segment、BSS(Block started by symbol)、Heap和Stack等區(qū),Code Segment是存放進(jìn)程的機(jī)器碼,Data Segment是存放已初始化的全局或靜態(tài)變量和常量數(shù)據(jù),BSS是存放未初始化的全局和靜態(tài)變量,Heap是在程序中可動態(tài)操作的內(nèi)存區(qū)域,Stack 是由編譯器自動管理,用于函數(shù)的形參,局部變量和函數(shù)的返回變量等,如圖1所示;在程序運(yùn)行時需要頻繁地分配和釋放內(nèi)存,從而引起內(nèi)存的內(nèi)部外部碎片化,內(nèi)部碎片是由于進(jìn)程訪問內(nèi)存為提高效率引入對齊機(jī)制以及系統(tǒng)分配內(nèi)存大于實(shí)際內(nèi)存而未被有效利用,外部碎片主要是由于對象的生命周期不確定,頻繁的分配和釋放操作,以及系統(tǒng)管理內(nèi)存的算法不完善等原因,逐漸會把內(nèi)存變成大大小小的空洞和裂隙而不可用。

      仿真建模工具當(dāng)構(gòu)建的系統(tǒng)對象比較少的時候,軟件的性能沒有明顯的變化,當(dāng)構(gòu)建的仿真模型操作著幾十萬個系統(tǒng)對象時,系統(tǒng)的操作性能和計算性能有著很顯示的下降,這是因?yàn)榉抡孳浖跇?gòu)建一個仿真系統(tǒng)或計算運(yùn)行一個仿真系統(tǒng)時,各自存在著不同的生命周期,有些對象還需要頻繁的構(gòu)建和銷毀,從而造成仿真軟件需要不斷的與操作系統(tǒng)交互操作內(nèi)存需求,因而內(nèi)存分配效率低下,同時也使得內(nèi)存極度碎片化,而仿真系統(tǒng)在執(zhí)行業(yè)務(wù)時既有操作流暢性要求又有計算實(shí)時性需求,在規(guī)模建模仿真時,內(nèi)存的碎片化影響系統(tǒng)可操作性和實(shí)時性,成為仿真軟件大規(guī)模仿真的瓶頸,因此在系統(tǒng)構(gòu)建一個合理的內(nèi)存池,接管系統(tǒng)內(nèi)存分配和對象管理,改善仿真軟件的運(yùn)行效率是非常必要的。

      2 內(nèi)存池設(shè)計

      當(dāng)前的開源的內(nèi)存池庫在一定程度上可以解決內(nèi)存的分配效率,但開源的內(nèi)存池為了使其具有通用性,在一些方面是做了犧牲,像tcmalloc 設(shè)計過于復(fù)雜,會引起額外的依賴性和復(fù)雜性,使其與仿真工具良好的集成和協(xié)作變得困難,仿真工具將變得臃腫而無法發(fā)揮內(nèi)存池的優(yōu)勢提升性能,jemalloc在內(nèi)存的管理模式上并不是完全符合仿真工具的需求,比如一些特定的對象的釋放方式可以通過標(biāo)記模式重復(fù)利用來提高系統(tǒng)性能而非真正的釋放對象。因此應(yīng)結(jié)合自研仿真工具的特性,設(shè)計一套適合自身需求的內(nèi)存池是必要的。

      2.1 內(nèi)存池架構(gòu)設(shè)計

      內(nèi)存池采用分頁管理模式,按照64 KB每頁的大小分配內(nèi)存頁空間,內(nèi)存池將在每頁上連續(xù)分配相應(yīng)的池空間,規(guī)避一定的跨頁性調(diào)度。整體內(nèi)存池通過哈希桶進(jìn)行管理,按照系統(tǒng)內(nèi)存評估所需要的哈希桶數(shù)量,鍵有概率被映射到相同的哈希值,形成哈希沖突。哈希桶可以允許在一個桶中存儲多組數(shù)據(jù)。通過映射函數(shù)定位到哈希桶,可以快速定位存儲數(shù)據(jù)位置,從而利用哈希通實(shí)現(xiàn)高效的數(shù)據(jù)訪問操作。

      哈希桶的索引設(shè)計根據(jù)64位內(nèi)存地址字段來確認(rèn),將地址分為哈希桶索引段、內(nèi)存頁索引段、內(nèi)存池索引號三部分,通過移位及與運(yùn)算來確認(rèn)映射函數(shù),實(shí)現(xiàn)哈希桶的訪問,如圖2所示。

      哈希桶的數(shù)據(jù)結(jié)構(gòu)關(guān)系是通過GlobalHashBucket數(shù)組建立全局哈希數(shù)組,數(shù)組內(nèi)有指向內(nèi)存池PoolInfo索引數(shù)組指針,PoolInfo內(nèi)存池數(shù)組有指向?qū)嶋H的池地址指針,而實(shí)際的內(nèi)存地址則用MemBlock進(jìn)行管理,用于實(shí)際的地址分配,如圖3所示。

      為了便于直接高效管理分配內(nèi)存池,將內(nèi)存池按16 B的長度對齊分類,內(nèi)存池中的塊大小為Size=[24~215],然后通過一個分配AllocSize映射表,通過查表的O(1)的操作,通夠快速找到將所需分配的內(nèi)存映射到PoolTypeArray數(shù)組中的,AllocSize中存放的是所申請內(nèi)存大小所對應(yīng)的PoolTypeArray的索引,索引的計算如下:

      SizeIndex = ((Size +15) >>4);

      PoolTypeArrayIndex= AllocSize [SizeIndex];

      PoolTypeArray中存放的是當(dāng)前不同Size內(nèi)存池的分配信息,CurActiveArray是當(dāng)前所能分配的內(nèi)存,內(nèi)存申請時直接從當(dāng)前的CurActiveArray中分配內(nèi)存;FullPoolArray是已經(jīng)用完的池,在回收的時候優(yōu)化從內(nèi)存空間中回收,如圖4所示。

      2.2 內(nèi)存線程池設(shè)計

      由于仿真系統(tǒng)中存在并行計算模塊,在內(nèi)存池的設(shè)計上需要響應(yīng)并行架構(gòu),因此在全局內(nèi)存池的基礎(chǔ)上進(jìn)行多線程并行管理,每個線程都有自己所管理的內(nèi)存池單元以此減少內(nèi)存池的競爭。線程池也是按照點(diǎn)內(nèi)存池的塊類型進(jìn)行管理,塊的大小與PoolTypeArray的相同,通過這種方式每個線程都管理著全局類型的內(nèi)存池,ThreadBlockArray是線程獨(dú)立的,通過設(shè)計Tls來實(shí)現(xiàn)變量分離,ThreadBlockArray中指向MemBlockArray地址,其中Activelist 是可以分配的內(nèi)存塊BlockList,BlockList又指向?qū)嶋H可以分配的內(nèi)存塊,以及線程可分配的內(nèi)存塊數(shù),MemBlockArray中的FullList則指向本線程已經(jīng)占用的內(nèi)存塊,回收內(nèi)存時,本線程內(nèi)優(yōu)化回收并重復(fù)在本線程內(nèi)利用,如圖5所示。

      3 內(nèi)存池的實(shí)現(xiàn)

      3.1 管理資源初始化

      根據(jù)操作系統(tǒng)的MEMORYSTATUSEX和SYSTEM_INFO 2個結(jié)構(gòu)體數(shù)據(jù),確定進(jìn)程可以使用的內(nèi)存空間及分配的內(nèi)存頁面大小,評估所需要的GlobalHashBucket數(shù)組大小,并初始GlobalHashBucket中的哈希映射索引函數(shù)。通過Tls方法來初步化ThreadBlockArray的獨(dú)立存儲空間,確定線程獨(dú)立內(nèi)存池空間,如圖6所示。

      3.2 內(nèi)存池初步化與內(nèi)存申請實(shí)現(xiàn)

      內(nèi)存池不主動去開辟池空間,當(dāng)有內(nèi)存申請時通過申請驅(qū)動內(nèi)存池空間的初始化。發(fā)起內(nèi)存申請需求時進(jìn)入內(nèi)存線程池,按照16 B對齊確認(rèn)PoolType,查詢當(dāng)前線程內(nèi)存池下是否有可以分配的內(nèi)存,如有可以分配的內(nèi)存,則直接從本線程所管理的內(nèi)存空間中分配內(nèi)存給申請者,如沒有可以分配的內(nèi)存則向總的PoolTypeArray中查找當(dāng)前可以使用的內(nèi)存池,如有則從池中分配一定量的內(nèi)存MemBlock到本線程的BlockList所指向的BlockNode下面,用于下次分配使用,同時返回一個MemBlock給申請者,如當(dāng)前的CurActiveArray中沒有可以用的內(nèi)存池,則先分配一個頁面的MemBlock 并通過哈希映射函數(shù)將這個Memblock指向Poolinfo,把Poolinfo放入GlobalHashBucket中,然后再回到內(nèi)存池的內(nèi)存分配流程,綁定內(nèi)存到線程的ThreadBlockArray下,分配內(nèi)存塊給申請者。經(jīng)過以上的流程就實(shí)現(xiàn)了內(nèi)存池初始化、裝配、線程內(nèi)存池內(nèi)存獨(dú)占和內(nèi)存分配給申請者的全部過程,如圖7所示。

      3.3 釋放內(nèi)存

      當(dāng)需要回收內(nèi)存時進(jìn)入內(nèi)存線程池,通過當(dāng)前內(nèi)存塊的地址獲取當(dāng)前MemBlock的信息判斷回收類型,如是池回收則需MemBlock放入到CurActiveArray所指向的BlockList頭部,如是徹底回收判斷MemBlock所在的內(nèi)存池中是否全部內(nèi)存是無效的,如無效則從ThreadBlockArray中卸載這個PoolInfo指向內(nèi)存池,然后從PoolTypeArray中卸載PoolInfo,從GlobalHashBucket中卸載 PoolInfo,然后調(diào)用系統(tǒng)指令回收內(nèi)存到操作系統(tǒng)。如這個內(nèi)存池中的內(nèi)存有效,則進(jìn)入池回收流程,只將此塊內(nèi)存回收到當(dāng)前內(nèi)存線程池中就結(jié)束流程,如圖8所示。

      除此回收流程外,當(dāng)系統(tǒng)退出的時候,內(nèi)存池配合系統(tǒng)對象回收機(jī)制,檢查是否有內(nèi)存泄露對象,提升程序可靠性同時內(nèi)存池在系統(tǒng)退出前將掃描內(nèi)存池的全部內(nèi)存狀態(tài),調(diào)用操作系統(tǒng)指令回收全部內(nèi)存。

      4 成果與性能提升

      在配置環(huán)境為:【操作系統(tǒng)為64位Win10操作系統(tǒng),CPU為Intel Core i7-8700 K,內(nèi)存為16 G*2 DDR】的環(huán)境上測試,進(jìn)行50次內(nèi)存分配后統(tǒng)計見表1,內(nèi)存池的分配耗時為系統(tǒng)直接分配的50.7%,比系統(tǒng)直接分配約節(jié)省了一半時間,開發(fā)內(nèi)存池式分配系統(tǒng)來代替直接的系統(tǒng)內(nèi)存分配操作是有意義的。

      5 結(jié)束語

      系統(tǒng)采用內(nèi)存池時分配技術(shù),優(yōu)化了仿真工作的操作性能和計算性能,提升了仿真工具的內(nèi)存健壯性,后續(xù)可以再結(jié)合內(nèi)存池增加仿真工具的內(nèi)池使用統(tǒng)計分析,結(jié)合分析數(shù)據(jù)來開發(fā)對象池用于系統(tǒng)進(jìn)一步提升仿真系統(tǒng)性能,同時也由于系統(tǒng)底層的此類完善架構(gòu),也使仿真工具系統(tǒng)具備了良性的迭代能力。

      參考文獻(xiàn):

      [1] 夏立斌,劉曉宇,姜曉巍,等.基于分布式數(shù)據(jù)集的并行計算框架內(nèi)存優(yōu)化方法[J].計算機(jī)工程,2023,49(4):43-51.

      [2] 梁月月.CBase數(shù)據(jù)庫內(nèi)存管理技術(shù)研究與實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),2021.

      [3] 藺佳敏.基于C~(++)的高并發(fā)網(wǎng)絡(luò)編程的研究[J].電子技術(shù),2020,49(8):36-37.

      [4] 楊帆,高國靜,張怡鋒.并行計算框架的內(nèi)存優(yōu)化算法研究[J].信息技術(shù),2020,44(8):132-135,140.

      [5] 陳婷婷.面向分布式異構(gòu)內(nèi)存池的資源抽象和數(shù)據(jù)放置策略設(shè)計與實(shí)現(xiàn)[D].武漢:華中科技大學(xué),2020.

      [6] 吳雪松,李志.機(jī)載數(shù)傳設(shè)備嵌入式應(yīng)用軟件的內(nèi)存池設(shè)計[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2020,20(3):12-15.

      [7] 段宗曜.應(yīng)用內(nèi)存池Socket池構(gòu)建高性能的IOCP服務(wù)器[J].中國新通信,2019,21(12):172-173.

      [8] 薛楠,李斌,王曉華,等.一種基于機(jī)載嵌入式系統(tǒng)內(nèi)存動態(tài)管理方式[J].電腦知識與技術(shù),2019,15(15):281-282.

      [9] 張鑫.面向異構(gòu)內(nèi)存池的RDMA傳輸優(yōu)化機(jī)制[D].武漢:華中科技大學(xué),2019.

      [10] 許健,于鴻洋.一種Linux多線程應(yīng)用下內(nèi)存池的設(shè)計與實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2012,38(11):146-149.

      [11] 郭丙軒,張京莉,張志超.基于內(nèi)存池的空間數(shù)據(jù)調(diào)度算法[J].計算機(jī)工程,2008(6):63-64.

      第一作者簡介:喬仕嶺(1982-),男,助理工程師。研究方向?yàn)橛嬎銠C(jī)科學(xué)與技術(shù)。

      德州市| 香港 | 乌拉特后旗| 龙门县| 甘孜县| 马鞍山市| 靖宇县| 宜兰县| 五峰| 五台县| 肃宁县| 九龙县| 清流县| 井冈山市| 达拉特旗| 徐闻县| 天水市| 河东区| 宣城市| 上思县| 山丹县| 乐昌市| 林周县| 辰溪县| 阿合奇县| 穆棱市| 彭水| 惠来县| 揭西县| 井冈山市| 武陟县| 积石山| 宁远县| 洪泽县| 涪陵区| 庄浪县| 南投县| 嘉荫县| 沿河| 松桃| 尚义县|