📄 unit2.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 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 + -