操作系统的第一个作业。。。要求界面的我还不会弄。主体

本文介绍了一个简单的进程调度模拟程序,通过随机生成进程并将其插入不同优先级的队列中,模拟了进程从创建到运行直至结束的整个生命周期。该程序利用C++实现,包括进程结构体定义、队列操作及进程调度算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//http://blog.163.com/wuhaoqing3@126/blog/static/27505172200993111154602/
//随机函数
//http://baike.baidu.com/view/549594.htm?fr=ala0
//邻接表

#include<fstream>
#include<iostream>
#include<iterator>
#include<string>
#include<algorithm>
#include<list>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<iomanip>
#include <time.h>

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;
//////////////////////////////////////////////////////////////////////
//

/*
PCB 结构体;
进程标识符pid、进程的状态标识status、进程优先级priority、
进程的队列指针next、进程生命周期的数据项life。
*/
//进程PCB的结构体
 struct PCBs{
 int pid;//进程标识符
 int status;//进程状态
 int priority;//进程优先级
 int life;//进程生命周期
 PCBs  *next;
};
typedef PCBs PCB;

//队列QUE的结构体
 struct ques{
 PCB *ptpcb;
 ques *next;
};
typedef ques QUE;

//进程pid是否被使用的bool数组
bool pidm[101];
//100个进程的声明
PCB process[101];

//50个就绪队列
PCB *q[50];

QUE quelist[50];

////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void displayall();
void displayque();
void displayopt();
void displayopt()
{
 cout<<"********************************************************************/n";
 cout<<"******************实验名称:进程调度的设计与实现********************/n";
 cout<<"*****操作方法:按键,然后进行对应的操作/n";
 cout<<"*****键盘:f,操作:创建一个进程/n";
 cout<<"*****键盘:r,操作:开始进行进程调度循环/n";
 cout<<"*****键盘:q,操作:退出进程调度循环程序/n";
 cout<<"*****键盘:d,操作:显示当前已创建好的进程/n";
 cout<<endl;
 return;
}
void displayall()
{
 int tempx;
 cout<<"所有的进程分别如下:"<<endl;
 cout<<"进程号  优先级  生命周期"<<endl;
 for(tempx=1;tempx<=100;tempx++)
 {
  if(pidm[tempx]==1)
  {
   cout<<setw(6)<<process[tempx].pid<<"  "<<setw(6)<<process[tempx].priority<<setw(8)<<process[tempx].life<<endl;
  }
 }
 return;
}
void displayque()
{
 int a;
 QUE *ptx;
 cout<<"优先队列中的进程分别如下:"<<endl;
 for(a=49;a>=0;a--)
 {
  if(quelist[a].next!=NULL)
  {
   ptx=quelist[a].next;
   cout<<"优先级为"<<a<<"中有的进程为:"<<endl;
   while(ptx->next!=NULL)
   {
    cout<<"pid:"<<ptx->ptpcb->pid<<" life:"<<ptx->ptpcb->life<<endl;
    ptx=ptx->next;
   }
   cout<<"pid:"<<ptx->ptpcb->pid<<" life:"<<ptx->ptpcb->life<<endl;
  }
 }
 return ;
}

 

int main ()

 char chp,diab;
 //int t;
 int count,createno;
 //
 int prno,xst,noxi;
    int tmpid,tmpr;
 QUE *tmqpt,*pt;
 //
 int ai;
 PCB *ptr;
 QUE *ptq;
 count=0;
 createno=0;
    displayopt();
 cout<<"请选择操作(f,r,d,q):";
 while(cin>>chp)
 {
  if(chp=='f')//输入f则创建进程
  {  
      xst=0;
      srand( (unsigned)time( NULL ) );//srand()函数产生一个以当前时间开始的随机种子
         prno=rand()%101;//产生一个随机pid
   if(prno==0)prno++;
      for(noxi=1;noxi<=100;noxi++)
   {
      if(pidm[noxi]==1)
   xst++;
   }
      if(xst==100){
        cout<<"已经创建了100个进程,请等待一段时间后在创建"<<endl;
           //return ;
   }
      while(pidm[prno]==1)
   {
      prno=rand()%101;
   if(prno==0)prno++;
   }
      pidm[prno]=1;
      process[prno].life=rand()%6;//随机产生生命周期
      if(process[prno].life==0)process[prno].life = 1;//若生命为0则变为1
      process[prno].next=NULL;
      process[prno].pid=prno;
      process[prno].priority = rand()%50;//随机产生优先级
      process[prno].status=1;
   createno++;
   //显示创建的进程信息
   cout<<"第"<<createno<<"个进程的pid为:"<<process[prno].pid;
   cout<<"  life为:"<<process[prno].life<<"  priority为:"<<process[prno].priority<<endl;
   cout<<endl;
     
   //插入到优先队列
      tmpid = process[prno].pid;
      tmpr = process[prno].priority;
      pt = &quelist[tmpr];
   tmqpt = new QUE;
   tmqpt->next = NULL;
   tmqpt->ptpcb = &process[prno];
   while(pt->next != NULL)
   {
    pt = pt->next;
   }
   pt->next = tmqpt;
  }
  
  else
   if(chp=='r')//输入为r则开始进程调度
  {
   for(ai=49;ai>=0;ai--)
   {
    while(quelist[ai].next != NULL)
    {
     ptq=quelist[ai].next;
     
     ptr=ptq->ptpcb;
     ptr->status = 0;//就绪变为run
     
     Sleep(1000);
     
     ptr->life=ptr->life-1;
     ptr->priority = ptr->priority/2;
     
     if(ptr->life>0)
     {
               tmpid = ptr->pid;
               tmpr = ptr->priority;
      ptr->status = 1;
               pt = &quelist[tmpr];
             
               tmqpt = new QUE;
               tmqpt->next = NULL;
               tmqpt->ptpcb = ptr;
               while(pt->next != NULL)
         {
               pt = pt->next;
         }
               pt->next = tmqpt;
      
      quelist[ai].next=ptq->next;
     }
     else
     {
      pidm[quelist[ai].next->ptpcb->pid]=0;
      quelist[ai].next=ptq->next;
     }
    }//while
   }//for
   createno=0;
  }
  else if(chp=='q')
  {
   cout<<"多谢使用!"<<endl;
   break;
  }else
   if(chp=='d')
   {
    cout<<"显示优先队列请按a,显示已创建的进程请按b:";
    cin>>diab;
    if(diab=='b')displayall();
    else if(diab=='a')displayque();
    else {
     displayall();
     displayque();
    }

   }
  cout<<"请选择操作(f,r,d,q):";
 
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值