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

📄 cpp1.cpp

📁 计算机操作系统
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<iostream.h>
#define M 5 /*进程数*/
#define N 3 /*资源数*/
//系统可用资源向量
int Available[N] = {3,3,2};
//最大需求向量
int Max[M][N] = {
         {7,5,3},
         {3,3,2},
         {9,0,2},
         {2,2,2},
		 {4,3,3},
  };
//资源分配向量
int Allocation[M][N] = {
   {0,1,0},
   {2,0,0},
   {3,0,2},
   {2,1,1},
   {0,0,2},   };
//需求向量
int Need[M][N] = {
  {7,4,3},
  {1,2,2},
  {6,0,0},
  {0,1,1},
  {4,3,1},
  };
//比较两个一维数组
//判断 a >= b ?
bool compare(int *a,int *b,int n)
{
 int i=0;
 for(i=0;i<n;i++)
 {
  if(a[i]<b[i])
  {
   return false;
  }
 } 
 return true;
}
//一维数组加法
//a = a + b
void add(int *a,int *b,int n)
{
 int i=0;
 for(i=0;i< n;i++)
 {
  a[i]+=b[i];
 }
}
//一维数组减法
//a = a - b
void subtract(int *a,int *b,int n)
{
 int i=0;
 for(i=0;i<n;i++)
 {
  a[i]-=b[i];
 }
}
//将数组b的值赋给a,n为数组的大小
void assign(int *a,int *b,int n)
{
 int i=0;
 for(i=0;i<n;i++)
 {
  a[i]=b[i];
 }
}
//sl 记录安全序列
bool safe(int *sl)
{
 int i;
 int count=0; /*记录finish[i] = true 的个数*/
 int n=0;
 int work[N];
 bool finish[M];
 //work = av;
 assign(work,Available,N);
 //初始化标记 finish
 for(i=0;i<M;i++)
 {
  finish[i]=false;
 }
 //n为进程的个数
 //循环最多执行n次
 n=M;
 while(n--)
 {
     for(i=0;i<M;i++)
     {
      //判断是否安全
      if(count>=M)
      {
       //全部进程都可安全执行(finish = true)
       return true;
      }
      //判断能否满足进程i的要求
      //work >= Need[i] ?
      if(finish[i]==false&&compare(work,Need[i],N))
      {
       //分配,待进程完成后再释放
       add(work,Allocation[i],N);
       finish[i]=true;     
       //记录安全路径
       sl[count]=i;
       //能满足的进程数+1       
       count++;
      }
     }
 }
 if(count>=M) { return true;} 
else{ return false;} 
}
//请求分配
//pid进程,r请求向量,n资源个数
bool request(int pid,int *r,int n)
{
 int i;
 //记录安全路径
 int sl[5]; 
 if(compare(Need[pid],r,n)==true &&
        compare(Available,r,n))
 {
  //尝试分配资源
  subtract(Available,r,N);
  add(Allocation[pid],r,N);
  subtract(Need[pid],r,N);  

  //判断是否是安全状态
  if(safe(sl))
  {
   //打印安全路径
   cout<<"安全序列为:"<<endl;  
   for(i=0;i<M;i++)
   {
    printf("p%d",sl[i]);
   }
   cout<<endl;
   //可以分配
   return true;
  }
  else
  {
   //不分配
   //恢复到分配前的状态
   add(Available,r,N);
   subtract(Allocation[pid],r,N);
   add(Need[pid],r,N);
   return false;
  }
 }
 else
 { //error
  return false;
 }
}
//打印一维数组
void print(int *a,int n)
{
 int i;
 for(i=0;i<n;i++)
 {cout<<" "<<a[i]; }
cout<<endl;
}
//显示系统信息
void init()
{
 int i;
 cout<<"该系统共有进程5个,"<<'\n'<<"其对资源的需求和分配情况分别是:"<<endl;
 for(i=0;i<M;i++)
 {
 cout<<"进程"<<i<<"资源最大需求:";
  print(Max[i],N);
 }
cout<<endl;
 for(i=0;i<M;i++)
 {
cout<<"进程"<<i<<"已经分配资源:";
  print(Allocation[i],N);
 }
 cout<<endl;
 cout<<"系统可用资源数量:"<<'\n'<<'\t'<<endl;
 print(Available,N);
}
//输入
void input(int *r,int n,int *id)
{
 char ch;
 cout<<"请输入进程的id(0 ~ 4):"<<endl;
 ch=getche();
 *id=ch-0x30;


 cout<<"\n请输入对0类资源的申请数量:"<<endl;
 ch=getche();
 r[0]=ch-0x30;


cout<<"\n请输入对1类资源的申请数量:"<<endl;
 ch=getche();
 r[1]=ch-0x30;


 cout<<"\n请输入对2类资源的申请数量:"<<endl;
 ch=getche();
 r[2]=ch-0x30;


 printf("\n您输入的是:Request[%d](%d,%d,%d)\n",*id,r[0],r[1],r[2]);
}
//检查输入
bool check(int id,int r1,int r2,int r3)
{
 if(id>4||id<0||r1<0||r2<0||r3<0)
 { return false; }
 else { return true;}
}
int main()
{
 //进程id
 int id;
 //控制字符
 int r[3];
 char es;
 char control;
 //显示开始信息
 init();
      //输入申请信息
      input(r,N,&id);
   { //检查输入
      if(check(id,r[0],r[1],r[2]) == false)
      {
      cout<<"输入错误请检查后重新输入!"<<endl;
       //continue;
   }
      //执行    
      if(request(id,r,N))
      {
       cout<<"资源分配成功!"<<endl;
      }
      else
      {
       cout<<"资源分配失败!"<<endl;
      }         
  //显示当前系统资源和进程情况
  cout<<"系统可用资源:"<<endl;
  print(Available,N);
  cout<<"进程"<<id<<"的最大资源需求:"<<endl;
  print(Max[id],N);
 cout<<"进程"<<id<<"已经分配资源:"<<endl;
  print(Allocation[id],N); 
  cout<<"是否继续输入?(Y/N)"<<endl;
  control=getch();
  if(control=='Y'||control=='y')
  es=main();
 return 0;
}
} 

⌨️ 快捷键说明

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