⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 static.cpp

📁 操作系统的固定分区模拟程序。固定分区将内存按用户需求分成若干固定存储区
💻 CPP
字号:
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
#define null 0
#define max 10000
struct PCB{//进程信息块 
       string name;
       int Rtime;
       int size;
       };
struct MemoryTable{//存储区信息块 
       int num;//分区号 
       bool state;//分区状态 
       int size;//分区大小 
       int BePos;//分区起始位置 
       PCB *pcb;
       };
typedef MemoryTable MT;
MT *T; 
int n,m;
void displayMT()//显示分区说明表 
{   PCB *p;
   cout<<"分区说明表:\n";
   cout<<"区号  分区长度  起始地址  状态    |进程  大小  完成时间\n";
   cout<<"__________________________________|____________________\n";
   for(int i=1;i<=n;i++)
     {cout<<right<<setw(4)<<T[i].num<<setw(9)<<T[i].size<<'k'<<setw(9)
          <<T[i].BePos<<'k';
          if(T[i].state==true)
          cout <<"  已分配  |"<<setw(4)<<T[i].pcb->name<<setw(5)
                <<T[i].pcb->size<<'k'<<setw(10)<<T[i].pcb->Rtime<<endl;     
          else cout<<"  未分配  |"<<setw(4)<<"无"<<setw(6)<<"无"<<setw(10)
               <<"无"<<endl; 
     }
     cout<<"\n";
     system("pause");
}
void createMT()//建立分区说明表 
{     
     cout<<"请输入内存分区个数:";
      cin>>n;
      T=new MT[n+1]; 
      T[0].BePos=0;
      T[0].size=0;
      cout<<"输入各个存储区的大小:\n";
      for(int i=1;i<=n;i++)
      {
        T[i].num=i;
        cout<<"分区"<<i<<":";
        cin>>T[i].size; 
        T[i].state=false;
        T[i].BePos=T[i-1].BePos+T[i-1].size;
        T[i].pcb=null;
      }
  displayMT();      
} 
void AssignPCB(PCB *p)//为进程分配存储区 
{ 
     int i;
     for(i=1;i<=n;i++)
     {
        if(T[i].state==false&&T[i].size>=p->size)
           {T[i].pcb=p;T[i].state=true;break;}
     }
     if(i==n+1) {cout<<"进程要求空间过大,无合适分区,释放进程\n";delete p;m--;}
      
}
void applyPCB()//输入请求的进程 
{
   cout<<"输入进程数:";
   cin>>m;
   int j=m;
   PCB *p;
   cout<<"输入各进程的名称、要求空间、完成时间\n"; 
   for(int i=1;i<=j;i++)
   {
      p=new PCB;
      cout<<"NO."<<i<<":";
      cin>>p->name;
      cin>>p->size;
      cin>>p->Rtime;
      AssignPCB(p);//分配内存资源 
   }
  displayMT();
   cout<<"\n\n进程执行中。。。。\n\n" ;
   system("pause");
}
  void reclaim()//进程执行结束,回收内存资源 
  {
     int min,mark;
     cout<<m<<endl;
    for(int i=1;i<=m;i++)
     { 
       min=max;mark=0;   
       for(int j=1;j<=n;j++)
      {
         if(T[j].state==true)
             {
               if(T[j].pcb->Rtime<min) {mark=j;min=T[j].pcb->Rtime;}
             } 
      }
      system("cls");
     cout<<"时刻:"<<min<<"\n\n";
     cout<<"进程"<<T[mark].pcb->name<<"执行结束,回收资源,修改分区说明表\n\n";
     PCB *p=T[mark].pcb;T[mark].pcb=null;T[mark].state=false;
     delete p; 
     displayMT();
     }
    cout<<"\n\n所有进程执行结束,资源全部回收,程序结束\n\n";
  }

int main()//主函数 
{
    createMT();
    applyPCB();
    reclaim();
    system("pause");
    delete []T;
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -