📄 pagesys_full.cpp
字号:
//本程序用于模拟内存分页式分配管理
//同学们可以参考本程序代码,重点是理解思想,不能照抄!!!!!!!!
//注释\变量名\函数名\输出的提示信息,乃至语句都要自行重新编写!!!!!
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#include <math.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define NIL 999999
#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 (jobs[jobno] > (blksize*freenum) )
{ printf("!!!!!当前空闲区还剩%dK, 不能满足作业[%d]的大小%dK!\n", freenum*blksize, jobno, jobs[jobno]);
return false;
}
else
{ jobtable[jobno][0] = (int)ceil(jobs[jobno] / float(blksize));
j=1;
for (i=0; i<blkcount; i++)
{ if (blkstate[i] == 0)
{ blkstate[i] = 1;
freenum--; //内存块分配出去
jobtable[jobno][j] = i; //内存块号与作业内的页号对应
j++;
if (j > jobtable[jobno][0]) //分配完毕
{ printf("作业%d分配成功, 共分配%d块, 块号为:\n", jobno, j-1);
for (k=1; k<=jobtable[jobno][0]; k++)
printf("%d--", jobtable[jobno][k]);
printf("END\n");
return true;
}
}
}
}
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 + -