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

📄 unit2.cpp

📁 广东工业大学 超牛逼的课程设计 值得一看
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#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 check();
running();
void testblock();//阻塞队列资源检测
void testnew();
int random();
void runmain();
void runFcfs();
void rescore();
struct pcb{

           int id;     //进程序号
           int ra;     //所需资源A的数量
           int rb;     //所需资源B的数量
           int rc;     //所需资源C的数量
           int ntime;  //所需的时间片个数
           int rtime;  //已经运行的时间片个数
           char state; //进程状态
            struct pcb *next;
          } *form2_hready=NULL,*form2_hblock=NULL,*form2_p; //hready,hblock分别为指向就绪和阻塞队列
          typedef struct pcb PCB;
int m,form2_n,r,a,a1,b,b1,c,c1,h=0,form2_i=1,form2_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);  //读取填入的进程总数
form2_n=StrToInt (Form2->Edit2->Text);  //读取需初始化进程数
a=StrToInt (Form2->Edit3->Text);  //读取A类资源的总数
b=StrToInt (Form2->Edit4->Text);  //读取B类资源的总数
c=StrToInt (Form2->Edit5->Text);  //读取C类资源的总数
form2_time1Inteval=StrToInt(Form2->Edit6->Text);
a1=a;b1=b;c1=c;
Form2->Timer1->Interval=form2_time1Inteval;
r=m-form2_n;
for(form2_i=1;form2_i<=form2_n;form2_i++)             //初始化进程信息,直到到达要初始化个数
{
  form2_p=getpcb(PCB);
  form2_p->id=form2_i;
  str1+=" 产生进程ID:";
  str1+=IntToStr(form2_p->id);
  str1+="\r\n";
  form2_p->ra=(random(a-3)+3);
  str1+=" 所需A类资源数:";
  str1+=IntToStr(form2_p->ra);
  str1+="\r\n";
  form2_p->rb=(random(b));
  str1+=" 所需B类资源数:";
  str1+=IntToStr(form2_p->ra);
  str1+="\r\n";
  form2_p->rc=(random(c-2)+2);
  str1+=" 所需C类资源数:";
  str1+=IntToStr(form2_p->ra);
  str1+="\r\n";
  form2_p->ntime=(random(5)+1);
  str1+=" 所需时间片个数:";
  str1+=IntToStr(form2_p->ntime);
  str1+="\r\n";
  form2_p->rtime=0;
  form2_p->next=NULL;
  if (((a-(form2_p->ra))>=0)&&((b-(form2_p->rb))>=0)&&((c-(form2_p->rc))>=0)) //如果资源符合所需要求
 {                                                            //则写入就绪队列队尾
   a=a-(form2_p->ra);     //当前所剩A类资源数目
     b=b-(form2_p->rb);   //当前所剩B类资源数目
       c=c-(form2_p->rc); //当前所剩C类资源数目
   form2_p->state='W';
   form2_hready=insert(form2_hready,form2_p);   //将进程插入就绪队列
    }//if
 else
  {
   form2_p->state='B';
   form2_hblock=insert(form2_hblock,form2_p);
      }
str1+=" 当前进程状态:";
str1+=(form2_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(form2_hready);
    str2+="*********************************当 前 阻 塞 队 列 的 信 息";
    str2+="*********************************\r\n" ;
    str2+="\r\n";
    str2+="进程ID  进程状态   A资源数   B资源数   C资源数   需要时间片  已运行时间片";
    Form2->Memo1->Lines->Add(str2);
    disp(form2_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=form2_hblock;
 p2=form2_hblock;
 AnsiString str5;
  while((form2_hblock!=NULL)&&(p1!=NULL))
  {
    if((a-(p1->ra)>=0)&&(b-(p1->rb)>=0)&& (c-(p1->rc)>=0)) //如果满足
       {if(p1==form2_hblock)
          {
           form2_hblock=p1->next;
             p1->state='W';
               form2_hready=insert(form2_hready,p1);  //将阻塞的进程插入就绪队列
                  a=a-(form2_p->ra);
                    b=b-(form2_p->rb);
                       c=c-(form2_p->rc);
          str5="\tID号为: " ;
          str5+=IntToStr(p1->id);
          str5+=" 的进程由阻塞队列转入就绪队列!\r\n";
           p1=form2_hblock;
          } //if(p1==hblock)

⌨️ 快捷键说明

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