本文主要是介绍操作系统磁盘管理算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
OS磁盘管理算法
一、算法
#include <bits/stdc++.h>
using namespace std;
#define page 32
#define pageframe 1
const int maxn = 1000;
enum status{Ready,Running,Block,Finish};
//先来先服务
int flag[page];
int process[page];//页号P对应的块号
int page_iddx[page];///对应的地址
int use_size = 0;//已经使用的内存
int pro_num=0;//进程的数目
void init()
{
for(int i=0;i<=page;++i)
{
flag[i]=0;
process[i] = 1000;/// 开始初始化时为不存在的页号
}
}
struct P
{
string s;/// 进程名字
string status; /// 进程当前的状态
int arrive_time; /// 进程到达的时间
int serve_time;/// 服务时间
int remain_time;//剩余时间
int size;//进程大小
int p;//占用内存块数目
}pcb[maxn];
bool cmp(P a,P b)///从小到大
{
return a.arrive_time<b.arrive_time;
}
void put()
{
cout<<"已经使用的内存:"<<use_size<<endl;
for (int i=1;i<=pro_num;++i)
{
cout<<endl;
cout<<"-------------------------------"<<endl;
cout<<"内存中进程数目:"<<pro_num<<endl;
cout<<"内存剩余空间:"<<page-use_size<<endl;
cout<<"内存中进程:"<<pcb[i].s<<"状态"<<pcb[i].status<<endl;
cout<<"进程:"<<pcb[i].s<<"到达时间:"<<pcb[i].arrive_time<<endl;;
cout<<"进程:"<<pcb[i].s<<"剩余所需时间"<<pcb[i].remain_time<<endl;
cout<<"进程:"<<pcb[i].s<<"大小"<<pcb[i].size<<endl;
cout<<"-------------------------------"<<endl;
cout<<endl;
}
cout<<"--------------------------------------------------"<<endl;
cout<<"\t"<<"页号"<<"\t"<<"块号"<<"\t"<<"逻辑地址"<<"\t"<<"物理地址"<<endl;
for (int i=0;i<32;++i)
{
if (process[i]==1000)
cout<<"\t"<<"None"<<"\t"<<i<<"\t"<<"None\t\t"<<i*1024<<endl;
else
cout<<"\t"<<process[i]<<"\t"<<i<<"\t"<<process[i]*1024<<"\t\t"<<i*1024<<endl;
}
cout<<"--------------------------------------------------"<<endl;
}
void run()/// 运行函数
{
int x = 0;/// 代表初始的页号
for (int i=1;i<=pro_num;++i)///进程数目
{
pcb[i].status = "Running";
pcb[i].p = floor(pcb[i].size/pageframe);
if( pcb[i].p>page||use_size>page)/// 判断是否越界
{
cout<<"越界"<<endl;
}
else
{
int l =pcb[i].p;
for (int j=0;j<32;++j)
{
if (flag[j]==0)
{
process[j] = x;/// j代表块号 x代表页号
flag[j] = 1;/// 代表当前这个块被占用
++x;/// 分配给一个块号,页号加1
--l;/// 当前只需要分配这么多的内存
use_size++;
if (use_size==32)
{
cout<<"---------------------内存超限,请等其他程序结束执行--------------------------"<<endl;
break;///内存满了
}
if (!l)break;/// 代表分配完成
}
}
}
while (pcb[i].remain_time)/// 一直运行到当前进程运行完成
{
--pcb[i].remain_time;
put();
}
pcb[i].status = "Finish";
int sum = 0;
for (int k=0;k<i;++k)
{
sum+=pcb[k].p;///开始的块号
}
/// cout<<sum<<endl;
for(int j=0;j<32;++j)
{
if (process[j]>=sum && process[j]<(sum+pcb[i].p))
{
process[j] = 1000;
--use_size;
}
}
put();
/// 运行完成输出运行完成
cout<<"-------------------------------"<<endl;
cout<<"当前进程"<<pcb[i].s<<"已经完成"<<endl;
cout<<"-------------------------------"<<endl;
cout<<"#######################################"<<endl;
}
}
int main()
{
cout<<"请输入总共运行进程的数目"<<endl;
cin>>pro_num;
init();/// 初始化
/// memset(flag,0,sizeof(flag));
for (int i=1;i<=pro_num;++i)/// 进程一般从1开始
{
pcb[i].status = "Ready";/// 开始都处于就绪状态
cout<<"请输入第"<<i<<"个进程的名字:"<<endl;
cin>>pcb[i].s;
cout<<"请输入第"<<i<<"个进程到达的时间:"<<endl;
cin>>pcb[i].arrive_time;
cout<<"请输入第"<<i<<"个进程的服务时间:"<<endl;
cin>>pcb[i].serve_time;
pcb[i].remain_time = pcb[i].serve_time;/// 剩余时间
cout<<"请输入第"<<i<<"个"<<"进程的大小:"<<endl;
cin>>pcb[i].size;
}
sort(pcb+1,pcb+1+pro_num,cmp);/// 先来先服务,进行排序
run();
return 0;
}
二、结果
这篇关于操作系统磁盘管理算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!