计算机操作系统 内存动态分配和回收模拟实现.doc_第1页
计算机操作系统 内存动态分配和回收模拟实现.doc_第2页
计算机操作系统 内存动态分配和回收模拟实现.doc_第3页
计算机操作系统 内存动态分配和回收模拟实现.doc_第4页
计算机操作系统 内存动态分配和回收模拟实现.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机操作系统 内存动态分配和回收模拟实现计算机操作系统 内存动态分配和回收模拟实现.txt一个人一盒烟一台电脑过一天一个人一瓶酒一盘蚕豆过一宿。永远扛不住女人的小脾气,女人永远抵不住男人的花言巧语。/COPYRIGHT 2010 tragedy ring finger. ALL RIGHTS RESERVED.#include #include using namespace std;/空闲分区20个,已分配分区20个struct empty/空闲分区表int address_of_start; /起始地址int size_of_empty; /空闲大小int next;int yesorno; /是否空闲,1 空闲,有效 Empty20;struct not_empty/已分配分区表int pid;int address_of_start;int size_of_notempty;int next;int yesorno; /是否分配,1 分配 有效 Not_Empty20;int CountOfEmpty=1,CountOfNotEmpty=0; /从 0 开始计数int Min_Size = 2; /不可分割的最小分区int Max_Size = 300; /最大空间300 X 300 = 90000int Num_Of_Row = 30; /显示时,横排个数int Num_Of_Area = 20; /空闲分区 和 分配分区 的最大分区数int enough(int Size_Of_NotEmpty) /是否有足够的空闲空间int i;for (i=0;i= Size_Of_NotEmpty + Min_Size)return i;return -1;int where(int num ,int a) /找到起始地址为num的区域的下标,a0 = -1,则在Not_Empty中,下标为a1;a1 = -1 在Empty中,下标为a0int i=0;while (i Num_Of_Area)if (Emptyi.address_of_start = num & Emptyi.yesorno = 1)a0 = i;a1 = -1;return 0;if (Not_Emptyi.address_of_start = num & Not_Emptyi.yesorno = 1)a0 = -1;a1 = i;return 0;i += 1;return -1;int fenpei()int temp,i;CountOfNotEmpty += 1;Not_EmptyCountOfNotEmpty.yesorno = 0;for (i=0;iCountOfNotEmpty;i+)if (Not_Emptyi.yesorno = 0)cout输入进程ID (0 99),占用空间大小(0 Max_SizeNot_Emptyi.pidNot_Emptyi.size_of_notempty;if (Not_Emptyi.pid 99)CountOfNotEmpty -= 1;cout进程号 0 99n;return -1;for (int ii=0;iiCountOfNotEmpty;ii+)if (Not_Emptyi.pid = Not_Emptyii.pid & i!= ii)CountOfNotEmpty -= 1;cout= 0) /找到能满足请求的空闲分区Not_Emptyi.address_of_start = Emptytemp.address_of_start;Not_Emptyi.yesorno = 1;Emptytemp.address_of_start += Not_Emptyi.size_of_notempty;Emptytemp.size_of_empty -= Not_Emptyi.size_of_notempty;else CountOfNotEmpty -= 1;cout未找到足够大的空闲分区n;return -1;return 0;int front(int i,int& a) /i 为待回收区在 Not_Empty 中的下标。a存对应下标for (int ii=0;iiCountOfEmpty;ii+) /确定待回收区前一个分区是否是空闲分区,及返回空闲分区的下标if (Not_Emptyi.address_of_start = Emptyii.address_of_start + Emptyii.size_of_empty& Emptyii.yesorno = 1)a = ii;return 0;a = i; /如果前一分区不是空闲,则前一分区是已分配,或待回收区是第一个分区。return -1;int back(int i,int& a) /i 为待回收区在 Not_Empty 中的下标。a存对应下标for (int ii= 0;iiCountOfEmpty;ii+)if (Emptyii.address_of_start = Not_Emptyi.address_of_start + Not_Emptyi.size_of_notempty & Emptyii.yesorno = 1)a = ii;return 0;a = i;return -1;void swap(int i ,int j,int sign)if (sign = 0)empty temp;temp = Emptyi;Emptyi = Emptyj;Emptyj = temp;elsenot_empty temp;temp = Not_Emptyi;Not_Emptyi =Not_Emptyj;Not_Emptyj = temp;void decrease_CountOfEmpty()int i;for (i=0;iCountOfEmpty;i+)if (Emptyi.yesorno = 0)swap(i,CountOfEmpty-1,0);CountOfEmpty -= 1;break;void decrease_CountOfNotEmpty()int i;for (i=0;iCountOfNotEmpty;i+)if (Not_Emptyi.yesorno = 0)swap(i,CountOfNotEmpty-1,1);CountOfNotEmpty -= 1;break;int huishou()int pid,i,a,b;cout输入要回收的进程号pid;for (i=0;iCountOfNotEmpty;i+)if (Not_Emptyi.pid = pid)if (front(i,a) = 0) /待回收分区前面是空闲分区Emptya.size_of_empty += Not_Emptyi.size_of_notempty;Not_Emptyi.yesorno = 0;if (back(i,b) = 0) /待回收区后面是空闲分区Emptya.size_of_empty += Emptyb.size_of_empty;Emptyb.yesorno = 0;/空满空 回收之后 空 decrease_CountOfNotEmpty();decrease_CountOfEmpty();else /待回收分区后面没分区,或后面是已分配分区/空满 回收之后 空/空满满 回收之后 空满decrease_CountOfNotEmpty();else /待回收分区前面没分区,或前面是已分配分区if (back(i,b) = 0) /待回收区后面是空闲分区Emptyb.address_of_start = Not_Emptyi.address_of_start;Emptyb.size_of_empty += Not_Emptyi.size_of_notempty;Emptyb.yesorno = 1;Not_Emptyi.yesorno = 0;/满满空 回收之后 满空/满空 回收之后 空decrease_CountOfNotEmpty();else /待回收分区后面没分区,或后面是已分配分区a = -1;for (int ii=0;iiCountOfEmpty;ii+) /if (Emptyii.yesorno = 0) /找一个没用的空闲分区表,将下表分给a,如果都有用,就扩大空闲分区表的大小a = ii;break;if (a = -1)CountOfEmpty += 1; /找一个没用的空闲分区表,将下表分给a,如果都有用,就扩大空闲分区表的大小a = CountOfEmpty - 1; /Emptya.address_of_start = Not_Emptyi.address_of_start;Emptya.size_of_empty = Not_Emptyi.size_of_notempty;Emptya.yesorno = 1;Not_Emptyi.yesorno = 0;/满满满空/满 回收之后 空/满满满满空满/ 满满空满decrease_CountOfNotEmpty();/CountOfNotEmpty -= 1;回收之后让已分配分区数减一,但是没考虑到对应情况会使空闲和分配区数量变或不变return 0;void qsort_empty_address_of_start(empty a,int low,int high)int i = low,j = high;empty temp=alow;while(ij)while(ij & temp.address_of_start= aj.address_of_start) j-;if(ij)ai = aj;i+;while (ij & ai.address_of_start temp.address_of_start) i+;if(ij)aj = ai;j-;ai = temp;if(lowi) qsort_empty_address_of_start(a,low,i-1);if(ihigh) qsort_empty_address_of_start(a,j+1,high);void show()int a2,num = 0,i,count = 0,times=0;coutn* Memory State *nendl;while (count a1)for (i=0;iEmptya0.size_of_empty;i+)cout;count += 1;if (count)% Num_Of_Row = 0)coutendl;num += Emptya0.size_of_empty;elsecoutsetw(2)Not_Emptya1.pid;count += 1;if (count)% Num_Of_Row = 0)coutendl;for (i=1;iNot_Emptya1.size_of_notempty;i+)cout;count += 1;if (count)% Num_Of_Row = 0)coutendl;num += Not_Emptya1.size_of_notempty;times += 1;coutendl;void show_empty()int i;coutn空闲分区列表n;for (i=0;iCountOfEmpty;i+)if (Emptyi.yesorno = 1)coutEmptyi.address_of_start Emptyi.size_of_emptyendl;int main()Empty0.address_of_start = 0;Empty0.size_of_empty = Max_Size ;Empty0.yesorno = 1;int i;cout*Memory Size: Max_Size *nendl;couti)switch(i)case 1:if (fen

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论