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

📄 unit2.~cpp

📁 系统资源(r1…rm),共有m类
💻 ~CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#pragma hdrstop
#include "Unit2.h"
#pragma package(smart_init)
#pragma link "PERFGRAP"
#pragma resource "*.dfm"
#define getpcb(type) (type*)malloc(sizeof(type))
#define NULL 0
//---------------------------------------------------------------------------
TForm2 *Form2;
 TMemo *Memo1;
        TEdit *Edit1;
        TLabel *Label1;
        TLabel *Label2;
        TEdit *Edit2;
        TLabel *Label3;
        TEdit *Edit3;
        TLabel *Label4;
        TLabel *Label5;
        TEdit *Edit4;
        TEdit *Edit5;
        TButton *Button1;

void input();
creat(void) ;
insert();
void disp();
//void sort();
//int space();
void check();
running();
//void destory();
void testblock();//阻塞队列资源检测
void testnew();
int random();
void runmain();
void runFcfs();
void rescore();
//AnsiString str;
struct pcb{

           int id;     //进程序号
           int ra;     //所需资源A的数量
           int rb;     //所需资源B的数量
           int rc;     //所需资源C的数量
           int ntime;  //所需的时间片个数
           int rtime;  //已经运行的时间片个数
           char state; //进程状态
            struct pcb *next;
          } *hready=NULL,*hblock=NULL,*p; //hready,hblock分别为指向就绪和阻塞队列
          typedef struct pcb PCB;
int m,n,r,a,a1,b,b1,c,c1,h=0,i=1,time1Inteval; //m为要模拟的进程个数,n为初始化进程个数,a,b,c分别为A,B,C
                //三类资源的总量 ,h为时间片运行的次数
//------------------------------------------------------------------------------
//建立一个PCB结构体型的空链表
PCB *increat(void)
{ PCB *head;
  head=NULL;
  return(head);
}
//------------------------------------------------------------------------------
//从链表起始地址开始输出该链表的内容
void disp(PCB *head)
{PCB *p1;
 p1=head;
 AnsiString str2;
  if(head!=NULL)      //链表非空
    {
     do
      {
         str2+="     ";
         str2+=IntToStr(p1->id);
         str2+="           ";
         str2+=(p1->state);
         str2+="               ";
         str2+=IntToStr(p1->ra);
         str2+="                 ";
         str2+=IntToStr(p1->rb);
         str2+="                ";
         str2+=IntToStr(p1->rc);
         str2+="                ";
         str2+=IntToStr(p1->ntime);
         str2+="                    ";
         str2+=IntToStr(p1->rtime);
         str2+="\r\n";
         p1=p1->next;
       }while(p1!=NULL); //不断输出进程的信息,直到链尾!
     } //if
  else
  {  str2+="\t\t该  队  列  中  没  有  进  程!\r\n" ;}

   Form2->Memo1->Lines->Add(str2);
    }//disp
//------------------------------------------------------------------------------
/*将进程插入到链尾*/
PCB *insert(PCB *head,PCB*pcb)  //带两个指针形参
{PCB *pi,*p1;
 p1=head;
 pi=pcb;
 if(head==NULL)
 {head=pi;pi->next=NULL;}
 else
    {while(p1->next!=NULL)
      {p1=p1->next;
       }
     p1->next=pi;
     pi->next=NULL;}
 return(head);
}
void input()  //对进程进行初始化
{
AnsiString str1;
m=StrToInt (Form2->Edit1->Text);  //读取填入的进程总数
n=StrToInt (Form2->Edit2->Text);  //读取需初始化进程数
a=StrToInt (Form2->Edit3->Text);  //读取A类资源的总数
b=StrToInt (Form2->Edit4->Text);  //读取B类资源的总数
c=StrToInt (Form2->Edit5->Text);  //读取C类资源的总数
time1Inteval=StrToInt(Form2->Edit6->Text);
a1=a;b1=b;c1=c;
Form2->Timer1->Interval=time1Inteval;
r=m-n;
for(i=1;i<=n;i++)             //初始化进程信息,直到到达要初始化个数
{
  p=getpcb(PCB);
  p->id=i;
  str1+=" 产生进程ID:";
  str1+=IntToStr(p->id);
  str1+="\r\n";
  p->ra=(random(a-3)+3);
  str1+=" 所需A类资源数:";
  str1+=IntToStr(p->ra);
  str1+="\r\n";
  p->rb=(random(b));
  str1+=" 所需B类资源数:";
  str1+=IntToStr(p->ra);
  str1+="\r\n";
  p->rc=(random(c-2)+2);
  str1+=" 所需C类资源数:";
  str1+=IntToStr(p->ra);
  str1+="\r\n";
  p->ntime=(random(5)+1);
  str1+=" 所需时间片个数:";
  str1+=IntToStr(p->ntime);
  str1+="\r\n";
  p->rtime=0;
  p->next=NULL;
  if (((a-(p->ra))>=0)&&((b-(p->rb))>=0)&&((c-(p->rc))>=0)) //如果资源符合所需要求
 {                                                            //则写入就绪队列队尾
   a=a-(p->ra);     //当前所剩A类资源数目
     b=b-(p->rb);   //当前所剩B类资源数目
       c=c-(p->rc); //当前所剩C类资源数目
   p->state='W';
   hready=insert(hready,p);   //将进程插入就绪队列
    }//if
 else
  {
   p->state='B';
   hblock=insert(hblock,p);
      }
str1+=" 当前进程状态:";
str1+=(p->state);
str1+="\r\n";
str1+="\r\n";
           }//for

Form2->Memo1->Lines->Add(str1);
}//input
//------------------------------------------------------------------------------



//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void check()       //输出就绪队列和阻塞队列的信息
{AnsiString str1,str2,str3;
 str3+="\r\n" ;
 str3+="= = = = = = = = = = = = = = = CPU时间片运行了: "  ;
  str3+=IntToStr(h);
  str3+="  次= = = = = = = = = = = = = = =\r\n";
  Form2->Memo1->Lines->Add(str3);
 str1+="*********************************当 前 就 绪 队 列 的 信 息"  ;
 str1+="*********************************\r\n" ;
 str1+="进程ID  进程状态   A资源数   B资源数   C资源数   需要时间片  已运行时间片";
 Form2->Memo1->Lines->Add(str1);
 disp(hready);
    str2+="*********************************当 前 阻 塞 队 列 的 信 息";
    str2+="*********************************\r\n" ;
    str2+="\r\n";
    str2+="进程ID  进程状态   A资源数   B资源数   C资源数   需要时间片  已运行时间片";
    Form2->Memo1->Lines->Add(str2);
    disp(hblock);

    }//check
//---------------------------------------------------------------------------
PCB *running(PCB *head)   //运行就绪队列的头进程
{
PCB *p1;
 p1=head;
AnsiString str4;
 if(p1->next==NULL)
    head=increat();
   else
    {head=p1->next;
     }
 p1->state='R';        //进程状态由就绪转向运行
 (p1->rtime)++;
 h++;

 str4+="~~~~~~~~~~~~~~~~ 当前正在运行的进程ID是: ";
 str4+=IntToStr(p1->id);
 str4+=" ~~~~~~~~~~~~~~~~~~\r\n";
 str4+="进程ID  进程状态   A资源数   B资源数   C资源数   需要时间片  已运行时间片\r\n";
 str4+="     ";
         str4+=IntToStr(p1->id);
         str4+="          ";
         str4+=(p1->state);
         str4+="              ";
         str4+=IntToStr(p1->ra);
         str4+="                 ";
         str4+=IntToStr(p1->rb);
         str4+="                ";
         str4+=IntToStr(p1->rc);
         str4+="                ";
         str4+=IntToStr(p1->ntime);
         str4+="                     ";
         str4+=IntToStr(p1->rtime);
         str4+="                  ";
  Form2->Memo1->Lines->Add(str4);
 if(p1->ntime==p1->rtime)    //如果已经运行的时间片到达所需次数
    {
     str4+="\r\n\r\n\t\tID号为:";
     str4+=IntToStr(p1->id);
     str4+=" 的进程已经完成!!!";
     Form2->Memo1->Lines->Add(str4);
     a=a+(p1->ra);
     b=b+(p1->rb);
     c=c+(p1->rc);
     free(p1);   //释放当前指针
     }
 else
   {
   p1->state='W';

      head=insert(head,p1);
     }
 return(head);
    }//running
//---------------------------------------------------------------------------

void testblock() //检测当前资源数目是否满足阻塞队列里进程的需求
{PCB *p1,*p2;
 p1=hblock;
 p2=hblock;
 AnsiString str5;
  while((hblock!=NULL)&&(p1!=NULL))
  {
    if((a-(p1->ra)>=0)&&(b-(p1->rb)>=0)&& (c-(p1->rc)>=0)) //如果满足
       {if(p1==hblock)
          {
           hblock=p1->next;
             p1->state='W';
               hready=insert(hready,p1);  //将阻塞的进程插入就绪队列
                  a=a-(p->ra);
                    b=b-(p->rb);
                       c=c-(p->rc);
          str5="\tID号为: " ;
          str5+=IntToStr(p1->id);
          str5+=" 的进程由阻塞队列转入就绪队列!\r\n";
           p1=hblock;
          } //if(p1==hblock)
          else
          {p2->next=p1->next;
            p1->state='W';
              hready=insert(hready,p1);
             str5="\tID号为: " ;
               str5+=IntToStr(p1->id);
                  str5+=" 的进程由阻塞队列转入就绪队列!\r\n";
              p1=p2->next;
          }//else
      } //大if
        else
       {p2=p1;
        p1=p1->next;
       } //else
       Form2->Memo1->Lines->Add(str5);
} //whlie



}//block
//---------------------------------------------------------------------------
 void testnew()   //检测是否有新的进程产生
 {
 int t;
 AnsiString str6;
 if(r>0)
 {
 t=random(9);         //生成随机数
 if(t<=7)               //如果随机数小于等于7,则产生新进程,否则不产生
 {
  p=getpcb(PCB);
  str6+="有新的进程申请加入:\r\n" ;
  p->id=i++;
  str6+="进程ID:";
  str6+=IntToStr(p->id);
  str6+="\r\n";
  p->ra=(random(a-3));
  str6+="所需A类资源数:";
  str6+=IntToStr(p->ra);
  str6+="\r\n";
  p->rb=(random(b-3));
  str6+="所需B类资源数:";
  str6+=IntToStr(p->ra);
  str6+="\r\n";
  p->rc=(random(c-3));
  str6+="所需C类资源数:";
  str6+=IntToStr(p->ra);
  str6+="\r\n";
  p->ntime=(random(5)+1);
  str6+="所需时间片个数:";
  str6+=IntToStr(p->ntime);
  str6+="\r\n";
  p->rtime=0;
  p->next=NULL;
  if (((a-(p->ra))>=0)&&((b-(p->rb))>=0)&&((c-(p->rc))>=0))
 {                           //进程满足要求,进入阻塞队列
   a=a-(p->ra);
     b=b-(p->rb);
       c=c-(p->rc);
   p->state='w';
   str6+="当前进程状态:";
str6+=(p->state);
str6+="\r\n";
   hready=insert(hready,p);
   str6+="资源满足新进程需求,该进程进入就绪队列!";
    }//if
 else                        //进程不满足要求,进入阻塞队列
  {
   p->state='B';
   hblock=insert(hblock,p);
str6+="当前进程状态:";
str6+=(p->state);
str6+="\r\n";
str6+="资源不能满足新进程需求,该进程进入阻塞队列!" ;
          }//else
  }//for

Form2->Memo1->Lines->Add(str6);


  
    }//if(r>0)
    r--;
       }//testnew
//---------------------------------------------------------------------------
void runmain()   //运行的主函数
{
 AnsiString str,str1;
input();
Form2->Timer1->Enabled=true;
  str+="\r\n";
}
//---------------------------------------------------------------------------
void rescore()
{
   if(a>a1) {Form2->Edit7->Text=IntToStr(a1);}
   if(a<0)  {Form2->Edit7->Text=0;}
   if(a>=0&&a<a1) {Form2->Edit7->Text=IntToStr(a);}
   if(b>b1) {Form2->Edit8->Text=IntToStr(b1);}
   if(b<0)  {Form2->Edit8->Text=0;}
   if(b>=0&&b<=b1) {Form2->Edit8->Text=IntToStr(b); }
   if(c>c1) {Form2->Edit9->Text=IntToStr(c1);}
   if(c<0)  {Form2->Edit9->Text=0;}
   if(c>=0&&c<=c1) {Form2->Edit9->Text=IntToStr(c); }
}
//------------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


//button
//---------------------------------------------------------------------------





void __fastcall TForm2::Button1Click(TObject *Sender)  //开始模拟按钮
{
  runmain();
  Button1->Enabled=false;
  Form2->Edit1->Enabled=false;
  Form2->Edit2->Enabled=false;
  Form2->Edit3->Enabled=false;
  Form2->Edit4->Enabled=false;
  Form2->Edit5->Enabled=false;
  Form2->Edit6->Enabled=false;

  }
//---------------------------------------------------------------------------









void __fastcall TForm2::Button2Click(TObject *Sender)    //清除屏幕按钮
{




    Form2->Memo1->Clear();
    Button1->Enabled=true;
    h=0;
  Form2->Edit1->Enabled=true;
  Form2->Edit2->Enabled=true;
  Form2->Edit3->Enabled=true;
  Form2->Edit4->Enabled=true;
  Form2->Edit5->Enabled=true;
  Form2->Edit6->Enabled=true;
}
//---------------------------------------------------------------------------






void __fastcall TForm2::Button1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
          Form2->Memo1->Clear();
    Button1->Enabled=true;
    h=0;
  Form2->Edit1->Enabled=true;
  Form2->Edit2->Enabled=true;
  Form2->Edit3->Enabled=true;
  Form2->Edit4->Enabled=true;
  Form2->Edit5->Enabled=true;
  Form2->Edit6->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Button1KeyPress(TObject *Sender, char &Key)
{
    Form2->Memo1->Clear();
    Button1->Enabled=true;
    h=0;
  Form2->Edit1->Enabled=true;
  Form2->Edit2->Enabled=true;
  Form2->Edit3->Enabled=true;
  Form2->Edit4->Enabled=true;
  Form2->Edit5->Enabled=true;
  Form2->Edit6->Enabled=true;
}
//---------------------------------------------------------------------------


void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
        runFcfs();
}

void runFcfs()
{ AnsiString str;
if(hready!=NULL)    //如果就绪队列为非空,则不断运行,直到就绪队列为空为止
{
   check();
  hready=running(hready);

  testblock();
  testnew();
  rescore() ;
   }

else
{
  Form2->Timer1->Enabled=false;
  Form2->Edit7->Text=IntToStr(a1);
  Form2->Edit8->Text=IntToStr(b1);
  Form2->Edit9->Text=IntToStr(c1);
  str+="\r\n\r\n<<<<<<<<<<<<<<<所 有 的 进 程 都 已 经 成 功 运 行 结 束 !>>>>>>>>>>>>>>";
  Form2->Memo1->Lines->Add(str);

}
}

//---------------------------------------------------------------------------

void __fastcall TForm2::N2Click(TObject *Sender)
{
   runmain();
  Button1->Enabled=false;
}
//---------------------------------------------------------------------------

void __fastcall TForm2::N8Click(TObject *Sender)
{
    if(Form2->SaveDialog1->Execute())
   {
     FILE* fp=fopen(Form2->SaveDialog1->FileName.c_str(),"w");
     if(fp==NULL)
     {
       MessageBox(NULL,"打开文件出错","信息",MB_OK);
       return;
       }
  for(int i=0;i<Form2->Memo1->Lines->Count;i++)
  {  fputs(Form2->Memo1->Lines->Strings[i].c_str(),fp);
  fputc('\n',fp);
  }
  fclose(fp);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm2::N7Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------




⌨️ 快捷键说明

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