当前位置:文档之家› 操作系统分页管理(C++)

操作系统分页管理(C++)

#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<<"进程名字:"<system.process[i].name=str;


getline(infile,str,',');
// cout<<"到达时间:"<system.process[i].starttime=atoi(str.c_str());


getline(infile,str,',');
// cout<<"结束时间:"<system.process[i].overtime=atoi(str.c_str());


getline(infile,str,'\n');
// cout<<"所需内存大小:"<system.process[i].memory=atol(str.c_str());

//一些简单的验证 到达时间必须小于结束时间
if(system.process[i].starttime{
if(system.process[i].memory>pagememory*NUM) //限定了内存大小
cout<else
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<<"进程名字:"<<<" 结束时间:"<cout<

}

void sortinfo(System &system)
{
int firststarttime; //系统中进程最早开始时间
int lastoverttime; //系统中

进程最晚结束时间
cout<<"根据到达时间进行排序:"<for(int i=0 ; i{
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(lastoverttimelastoverttime = system.process[i].overtime;

}

system.firststarttime =firststarttime;
https://www.doczj.com/doc/4313797453.html,stovertime = lastoverttime;

for(i=0 ; i < system.pronum ; i++)
cout<<"进程名字:"<<<" 结束时间:"<cout<cout<<"最早到达进程时间:"<cout<}

void destribute(System &system,int *Memory,int blocknum) //内存分配
{
int pagenum; //分页页号 (分了多少页)
int add; //偏移量
int flag=0; //判断是否找到了空的内存块 1表示找到了 0表示未找到

cout<<"从最早进程到达时间开始: "<cout<
//所有进程进行分配 最早开始到最晚结束 秒为单位
for(int i=system.firststarttime;i<=https://www.doczj.com/doc/4313797453.html,stovertime;i++)
{
cout<<"第"<cout<//所有进程循环 找到到达进程
for(int j =0 ; j{

//对到达进程进行分页算法
if(system.process[j].starttime==i)
{
cout<<"进程"<pagenum= system.process[j].memory/pagememory; //分页
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<<"进程"<cout<<"进程"<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<<"内存已满,进程"<exit(0);
//由于系统只是简单的模拟,很多地方没有过多考虑
//如果内存已满 应该是把当前进程阻塞
//记录已分配内存的页号 等待其它进程的释放内存
//然后把未分配的页号 进行内存分配
//这里为了保证模拟分配的正确性 所以如果内存满就系统退出
}

}

cout<<"进程"<for(m=0;m{
cout<<"页号:"<}

cout<}

//对结束进程进程内存收回
if(system.process[j].overtime ==i)
{
cout<<"进程"<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 ; iMemory[i]=0;
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

*/

相关主题
文本预览
相关文档 最新文档