C++模拟动态内存管理 您所在的位置:网站首页 分区内存管理模拟c C++模拟动态内存管理

C++模拟动态内存管理

2023-09-22 17:49| 来源: 网络整理| 查看: 265

使用链表对进程进行存储,每个节点记录、 下一个进程的占用内存的大小 起始地址 执行时间 下一个进程的地址 随机生成进程(空间大小、执行时间) 先执行连续内存分配,若内存分配到最后位置,则在之前产生的碎片中找可以容纳该进程的碎片放入。 若没有找到这样的碎片就等待已经占用内存的进程退出空间之后再进入。

代码如下

/** * title :C++模拟动态内存管理 * author : liyunhao * date:2018.05.17 * time : 0:26 */ #include #include #include #include #include using namespace std; /公用函数 //控制输出的位置 void gotoxy(short x, short y) { static COORD cd; HANDLE g_hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); cd.X = (short)(x return 0; }else{ return a + rand()%range; } } class Memory{ public: int *p; int len; int CurrPos; Memory(int n=500){ len = n; CurrPos = 0; p = new int [n]; memset(p,0,4*n); } / int findAPos(int proLen){ int pos = CurrPos; int start; int end; start = pos; while(p[start]==1 && start end++; } if(end-start > proLen && end for(int i=s;i return false; } } return true; } bool writeMemo(int s,int len){ for(int i=s;i for(int i=s;i gotoxy(1,1); for(int i=0;i cout this->pid = pid; this->meSize = meSize; this->time = time; } }; class MemoMange{ public: Memory * Memory1; vector ProcVector; MemoMange(){ Memory1 = new Memory; } int FindRoomForPro(int proLen){ vector::iterator iter; if(ProcVector.size() ==0 && proLenlen){ return 0; } iter =ProcVector.end()-1; if(Memory1->MemoCanBeWrote( (*iter)->nextPro,proLen )){ return (*iter)->nextPro; }else{ for(iter=ProcVector.begin();iter!=ProcVector.end()-1;iter++){ if(Memory1->MemoCanBeWrote( (*iter)->nextPro,proLen )){ return (*iter)->nextPro; } } return -1; } } bool ProInComing(Process * pro){ if(pro){ int startOfNewPro = FindRoomForPro(pro->meSize); if(startOfNewPro >= 0){ Memory1->writeMemo(startOfNewPro, pro->meSize); pro->meStart = startOfNewPro; pro->nextPro = startOfNewPro + pro->meSize; pro->nextPro %= Memory1->len; //Memory1->CurrPos += pro->meSize; ProcVector.push_back(pro); gotoxy(1,7); cout cout //在vector中查找指定元素 vector::iterator iter; vector::iterator shortestIter; if(ProcVector.size() if( (*iter)->time vector::iterator iter=ProcVector.begin(); while(iter!=ProcVector.end()) cout int randLen = getRandom(10,30); int action = getRandom(0,10); int randTime = getRandom(10,30); if(action MemoMange1.ShortestProLeaving(); } Sleep(1000); i++; } return 0; }

运行结果: ①起始状态 这里写图片描述

②进程不断加入产生碎片,出现无法写入的情况,

这里写图片描述

③一些进程退出,可以再次写入进程

这里写图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有