- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                
操作系统
实验二.存储管理
	
班级: 
学号: 
姓名: 
(一)
实验目的:
通过模拟实现内存分配的伙伴算法和请求页式存储管理的几种基本页面置换算法,了解存储技术的特点。掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
实验内容:
实现一个内存管理的伙伴算法,实现内存块申请时的分配和释放后的回收。
实验准备:
用随机函数仿真进程进行内存申请,并且以较为随机的次序进行释放。对其碎片进行统计,当申请分配内存失败时区分实际空间不足和由于碎片而不能满足。
   实现:
申请和释放序列的实现:
采用随机数生成函数产生,1—3之间的随机数,1和2时代表产生申请内存块的指令,3代表产生释放内存块的指令。这样就可以保证产生一个随机的申请释放序列,而且因为申请的概率比释放的概率大1倍,所以肯定能保证申请完内存。
申请的实现
由随机数产生函数产生1到最大申请数量之间的一个值,代表申请的内存块。用一个bool数组储存内存块的使用情况。遍历数组查找是否有符合要求的连续内存块序列。如果有就把对应的数组的元素改为false,并把申请记录到一个矢量中用于释放。
如果申请失败则返回失败的原因,有内存不足和没有足够的连续块两个原因。
释放的实现
由随机数产生函数产生1到申请的总次数之间的一个值,来决定释放哪一次申请的内存。并根据矢量中记录的内存块的位置,和块数修改对应的数组值。
		数据结构及核心函数:
#define PAGENUM 100//总的块数
#define MAXREQ 5//一次最多申请的块数
#define produceNum(num) (rand()%num+1)
class Mem
{
private:
	int memNum;
	bool mem[PAGENUM];//所有内存块
	vectorint* occupied;
public:
	Mem();
	int prodecuReq(void);
	int produceRel(void);
	void run(void);
	void showMem(void);
void Mem::showMem(void);
}
void Mem::run(void)
{
	srand(unsigned(time(0)));
	while (true){
		int op = produceNum(3);
		
		if(op == 1 || op == 2){//这时产生申请块,概率是释放页面的两倍
			int size  = produceNum(MAXREQ);//产生申请块的个数
			cout申请size块;
			bool flag;
			for(int i=0; i=PAGENUM-1; i++){
				if(size  memNum){
					flag = false;
					break;
				}
				flag = true;
				if(mem[i] == true){
					for(int j = 0; j=size-1; j++){//检查是否有足够的连续内存
						if(j+iPAGENUM-1){
							flag = false;
							break;
						}
						if(mem[j+i] == false){
							//i = i + j + 1;
							flag = false;
							break;
						}
					}
					if(flag){
						int* temp = new int[2];
						temp[0] = i;
						temp[1] = size;
						occupied.push_back(temp);
						for(int n = 0; n=size-1; n++)
							mem[i+n] = false;
						break;
					}
				}
			}
			if(flag){
				memNum = memNum - size;
				cout申请成功,剩余memNum块endl;
			}
			else{
				if(memNum  size)
					cout申请失败,内存不足endl;
				else
					cout申请失败,没有足够多的连续块endl;
				showMem();
				return;
			}
		}
		else{//这时释放块
			if(occupied.size() == 0)
				continue;
			int page = produceNum(occupied.size()
                
原创力文档
                        

文档评论(0)