⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pagesys.cpp

📁 本程序用于模拟内存连续分配与分页式分配的管理
💻 CPP
字号:
//本程序用于模拟内存分页式分配管理
//同学们可以参考本程序代码,重点是理解思想,不能照抄!!!!!!!!
//注释\变量名\函数名\输出的提示信息,乃至语句都要自行重新编写!!!!!
//由于本程序很简单, 所以关键代码不再提供
//!!!!!!!请在最后提交的程序中删除上面所有语句,包括这一句!!!!!!!!

#include "stdafx.h"
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <conio.h> 
#include <time.h>
#include <math.h>

#define re printf("\n")

//----------------系统内部函数------------------------
void _sleep( int n )		//停顿n秒,该函数为VC函数,在不同环境下可能会不同
{	clock_t goal;
	goal = (clock_t)n * CLOCKS_PER_SEC + clock();
	while( goal > clock() );
}

char _keygo()		//停顿,按任意键继续
{	char c;
	printf("按任意键继续......\n");
	c=getch();
  return c;
}

float _getrand()		//产生一个[0, 1]的随机数
{	float f=RAND_MAX;
	return rand()/f;
}

//-----------------实验参数设置------------------------
//可以自行调整
const max = 100;
const blkcount = 24;		//内存总块数
const blksize = 4;		//每块大小为4K
int freenum;		//空闲块数
int usednum;		//已分配块数
int jobs[max];		//作业队列,记录每个作业的大小
int jobtable[max][blkcount+1];	//每个作业分配的块号
//每个作业都对应一个长度为blkcount+1的数组,数组第0个元素记录分配总块数

//上面用数组来创建作业队列与作业块号, 这是很浪费资源的
//同学们可以使用指针创建动态数组, 或者链表.

int jobnum;			//作业数量
int blkstate[blkcount];		//每块状态

void init()	//初始化
{ int i;
	double dtmp;
	srand( (unsigned)time( NULL ) );
	_getrand();	//初始化随机种子,保证后面生成随机数都不同
	freenum = 0;
	for (i=0; i<blkcount; i++)
	{	dtmp = _getrand();
		if (dtmp >=0.5) blkstate[i] = 1;	//已分配
		else
		{	blkstate[i] = 0;	//未分配
			freenum++;
		}
	}
	usednum = blkcount - freenum;
	printf("页面初始化完毕,内存共有%d块,每块大小为%dK.\n", blkcount, blksize);
	printf("其中已分配%d块, 尚有%d块空闲, 未分配块号为:\n", usednum, freenum);
	for (i=0; i<blkcount; i++)
		if (blkstate[i] ==0)	printf("%d--", i);
	printf("END\n");

}

int input() // 输入作业参数
{ int i;
	printf("\n 作业总数为:"); 
	scanf("%d",&jobnum); 
	for(i=0;i<jobnum;i++) 
	{ printf("\n 输入第[%d]号作业的大小:", i); 
		scanf("%d",&jobs[i]); 
	} 
	printf("作业队列为:\n"); 
	for(i=0;i<jobnum;i++) 
		printf("[%d, %dK]---", i, jobs[i]); 
	printf("END\n");
	return jobnum;
} 

bool mem_alloc(int jobno)		//分配内存
{	int i=0, j=0, k=0;
/*
	// 检查当前剩余空间能否满足作业
		if (..... > ......) 
		{	printf("!!!!!当前空闲区还剩%dK, 不能满足作业[%d]的大小%dK!\n", .......);
			return false;
		}
		else
		{	//计算分配的空白块数.....
			//从内存状态表查找空闲块,分配出去,修改状态
			//将分配的块号记录到作业分配中
			//修改空闲块总数减少
			//printf("作业%d分配成功, 共分配%d块, 分配块号为:\n", .......);
		}
	}
*/
	return true;
}

bool job_callback(int jobno)	//昨夜回收
{	//.....添加代码
	//具体操作包括:根据作业分配块号表,修改内存分配表blkstate, 并修改空闲总块数
	//printf("作业%d回收成功, 共释放%d页, 块号为:\n", ....);
	//输出回收的块号
	return true;
}

//----------主程序-------------------
int main(int argc, char* argv[])
{	int i, k;
	init();
	input();
	printf("开始作业分配内存!!\n");
	_keygo();
	for (i=0; i<jobnum; i++)
	{	mem_alloc(i);
		_keygo();
	}
	re;

	printf("开始回收作业存!!\n");
	_keygo();
	printf("\n 输入回收作业号:"); 
	scanf("%d",&k); 
	job_callback(k);



	_keygo();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -