📄 pagesys.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 + -