操作系统磁盘管理算法

2022/4/4 17:19:35

本文主要是介绍操作系统磁盘管理算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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;
}

二、结果



这篇关于操作系统磁盘管理算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程