操作系统分页管理(C++)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
using namespace std;
#define MAX 64 //定义允许最多进程个数
#define pagememory 1024 //定义页面大小
#define NUM 100 //定义进程最多分100页
#define BLOCKNUM 1000 //定义内存块个数 内存大小为pagememory*BLOCKNUM
typedef struct //页表
{
int pagenum; //记录页数
int page[NUM]; //每一页对应的块儿号
int add; //偏移量
}PageTable;
typedef struct //进程控制块 PCB
{
string name; //进程名字
long memory; //进程内存大小
int starttime; //开始时间
int overtime; //结束时间
PageTable pagetable; //页表
}Pro,Process[MAX];
typedef struct //系统
{
Process process; //进程组
int pronum; //进程个数
int firststarttime; //最早开始的进程时间
int lastovertime; //最后结束的进程时间
}System;
void loadinfo(System &system) /*从文件读取信息*/
{
string str; //读文件字符串
int i =0; //定义进程个数初始化为0个
ifstream infile("info.txt",ios_base::in); //文件输入流
ofstream outfile("info.txt",ios_base::app); //文件输出流
if(infile==0)
{
cout<<"打开文件失败!"<
if(outfile==0)
{
cout<<"打开文件失败!"<
infile.seekg(0,ios_base::beg); //从文件头部开始读数据
getline(infile,str,'\n'); //标题行不读
while(!infile.eof())
{
getline(infile,str,',');
// cout<<"进程名字:"<
getline(infile,str,',');
// cout<<"到达时间:"<
getline(infile,str,',');
// cout<<"结束时间:"<
getline(infile,str,'\n');
// cout<<"所需内存大小:"<
//一些简单的验证 到达时间必须小于结束时间
if(system.process[i].starttime
if(system.process[i].memory>pagememory*NUM) //限定了内存大小
cout<
i++; //系统进程+1
}
else
cout<
if(i>MAX)
cout<<"超过限定个数"<
system.pronum=i; //进程个数
infile.close();
outfile.close();
}
void getinfo(System &system)
{
for(int i=0 ; i < system.pronum ; i++)
cout<<"进程名字:"<
}
void sortinfo(System &system)
{
int firststarttime; //系统中进程最早开始时间
int lastoverttime; //系统中
进程最晚结束时间
cout<<"根据到达时间进行排序:"<
for(int j=0 ; j
if(system.process[j].starttime>system.process[j+1].starttime)
{
Pro temp;
temp = system.process[j];
system.process[j] = system.process[j+1];
system.process[j+1] = temp;
}
}
}
for(i=0 ; i < system.pronum ; i++) //找到最晚一个结束时间
{
if(i==0)
{
firststarttime = system.process[i].starttime;
lastoverttime = system.process[i].overtime;
}
if(lastoverttime
}
system.firststarttime =firststarttime;
stovertime = lastoverttime;
for(i=0 ; i < system.pronum ; i++)
cout<<"进程名字:"<
void destribute(System &system,int *Memory,int blocknum) //内存分配
{
int pagenum; //分页页号 (分了多少页)
int add; //偏移量
int flag=0; //判断是否找到了空的内存块 1表示找到了 0表示未找到
cout<<"从最早进程到达时间开始: "<
//所有进程进行分配 最早开始到最晚结束 秒为单位
for(int i=system.firststarttime;i<=stovertime;i++)
{
cout<<"第"<cout<
for(int j =0 ; j
//对到达进程进行分页算法
if(system.process[j].starttime==i)
{
cout<<"进程"<
add = system.process[j].memory%pagememory; //偏移量
if(add>0)
pagenum++; // 如果偏移量大于0 分页数自加1 (因为页号下标从0开始 所以自加1)
system.process[j].pagetable.pagenum =pagenum;
system.process[j].pagetable.add = add;
cout<<"进程"<
//这里算法可以进行优化,因为只是简单模拟,所以并无考虑性能
for(int m=0;m
for(int n=0;n
if(Memory[n]==0) //如果内存块为空
{
flag=1;
break;
}
}
if(flag==1) //如果分配到内存
{
system.process[j].pagetable.page[m]=n; //把内存块给页号
Memory[n]=1; //内存块为1 表示已被占用
}
else
{
cout<<"内存已满,进程"<
//由于系统只是简单的模拟,很多地方没有过多考虑
//如果内存已满 应该是把当前进程阻塞
//记录已分配内存的页号 等待其它进程的释放内存
//然后把未分配的页号 进行内存分配
//这里为了保证模拟分配的正确性 所以如果内存满就系统退出
}
}
cout<<"进程"<
cout<<"页号:"<
cout<
//对结束进程进程内存收回
if(system.process[j].overtime ==i)
{
cout<<"进程"<
for(int m=0;m
int x = system.process[j].pagetable.page[m]; //找到对应的内存块
Memory[x]=0; //内存块对应为0
cout<<"释放第"<
cout<
}//end for 进程个数
//这里可以添加一些 查看功能
//1.查看当前时刻所有分配的进程
//2.查看当前时刻进程的页表
//3.查看当前时刻的内存分配情况
//4.查看某进程的逻辑空间地址(根据逻辑空间地址找到物理空间地址,只需要求出页号加上偏移量)
//等等
}//end for 时间
}
int main()
{
int Memory[BLOCKNUM]; //定义内存块数组
System system;
loadinfo(system); //导入信息
getinfo(system); //显示信息
sortinfo(system); //排序信息
// getinfo(system);
for(int i =0 ; i
destribute(system,Memory,BLOCKNUM); //分配
return 0;
}
/*
在项目下新建一个 info.txt
进程名,到达时间,结束时间,内存大小//简单模拟,请按照制定顺序进行书写,注意标点符号大小写//
d,6,10,6777
a,1,3,2099
b,2,9,3000
c,4,5,4444
e,1,1,1000
f,6,2,1000
m,1,2,10240000
*/