📄 unit3.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define getym(type) (type*)malloc(sizeof(type))
#define NULL 0
TForm3 *Form3;
void form3_input();
form3_insert();
void form3_disp();
void form3_runfifo();
void form3_runlru();
void form3_runmain();
struct ym{
int id; //序列序号
int ye_num; //页面号
char state; //进程状态
struct ym *next;
} *hready3=NULL,*p_ye; //hready,为指向就绪和阻塞队列
typedef struct ym YM;
int chu_num,time1Inteval3;
int ya=0,yb=0,yc=0,t1=-1,t2=-1,t3=-1,hit_count=0,instead_count=0,form3_flag;
//---------------------------------------------------------------------------
YM *form3_increat(void)
{ YM *head;
head=NULL;
return(head);
}
//---------------------------------------------------------------------------
YM *form3_insert(YM *head,YM*ym) //带两个指针形参
{YM *pi,*p1;
p1=head;
pi=ym;
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 form3_disp(YM *head)
{YM *p1;
p1=head;
AnsiString str2;
//str2+="\r\n";
if(head!=NULL) //链表非空
{
do
{
str2+=IntToStr(p1->ye_num);
str2+=" , ";
p1=p1->next;
}while(p1!=NULL); //不断输出进程的信息,直到链尾!
} //if
else
{ str2+="序列已经空!" ;}
Form3->Memo1->Lines->Add(str2);
}//disp
//----------------------------------------------------------------------------
void form3_input() //对页面序列进行初始化
{
int i,temp=0;
chu_num=StrToInt (Form3->Edit5->Text); //读取需初始化页面数
time1Inteval3=StrToInt(Form3->Edit6->Text);//读取时间片长度
Form3->Timer1->Interval=time1Inteval3;
for(i=1;i<=chu_num;i++) //初始化页面序列信息,直到到达要初始化个数
{
p_ye=getym(YM);
p_ye->id=i;
p_ye->ye_num=random(7);
p_ye->next=NULL;
if ((p_ye->ye_num)==temp) //如果产生的页号与前一页号相等
{ //则写入就绪队列队尾
if(p_ye->ye_num==7)
{p_ye->ye_num=(p_ye->ye_num)-1;}
else
{p_ye->ye_num=(p_ye->ye_num)+1; }
}//if
temp=p_ye->ye_num;
hready3=form3_insert(hready3,p_ye); //将替换页号插入序列
}//for
form3_disp(hready3);
}//input
//---------------------------------------------------------------------------
YM *form3_runfifo(YM *head) //运行就绪队列的头进程
{
AnsiString str;
YM *p1;
p1=head;
if(p1->next==NULL)
head=form3_increat();
else
{head=p1->next;
}
Form3->Edit1->Text=IntToStr(p1->ye_num); //下一个要替换的序列
switch (p1->id) //前三个页面进行装载
{
case 1 :Form3->Edit2->Text=IntToStr(p1->ye_num);ya++;
str="\t\t装载到页块0#\r\n";
Form3->Memo2->Lines->Add(str);
break;
case 2 :Form3->Edit3->Text=IntToStr(p1->ye_num); ya++;yb++;
str="\t\t装载到页块1#\r\n";
Form3->Memo2->Lines->Add(str);
break;
case 3 :Form3->Edit4->Text=IntToStr(p1->ye_num); ya++;yb++;yc++;
str="\t\t装载到页块2#\r\n";
Form3->Memo2->Lines->Add(str);
break;
default:break;
}
if((p1->id!=1)||(p1->id!=2)||(p1->id!=3))
{ t1=StrToInt(Form3->Edit2->Text);
t2=StrToInt(Form3->Edit3->Text);
t3=StrToInt(Form3->Edit4->Text);
if((p1->ye_num)==t1||(p1->ye_num)==t2||(p1->ye_num)==t3)
{if(p1->ye_num==t1)
{ Form3->Edit2->Color=clYellow;
Form3->Edit3->Color=clMoneyGreen;
Form3->Edit4->Color=clMoneyGreen;
str="\t\t页块 0 #被命中\r\n";
}
if(p1->ye_num==t2)
{ Form3->Edit3->Color=clYellow;
Form3->Edit2->Color=clMoneyGreen;
Form3->Edit4->Color=clMoneyGreen;
str="\t\t页块 1 #被命中\r\n";}
if(p1->ye_num==t3)
{ Form3->Edit4->Color=clYellow;
Form3->Edit2->Color=clMoneyGreen;
Form3->Edit3->Color=clMoneyGreen;
str="\t\t页块 2 #被命中\r\n";}
}
else
{
if(ya==3)
{Form3->Edit2->Text=IntToStr(p1->ye_num);
Form3->Edit2->Color=clRed;
Form3->Edit3->Color=clMoneyGreen;
Form3->Edit4->Color=clMoneyGreen;
ya=0;instead_count++;
str="\t\t页块 0 #被替换\r\n";
}
if(yb==3)
{Form3->Edit3->Text=IntToStr(p1->ye_num);
Form3->Edit3->Color=clRed;
Form3->Edit2->Color=clMoneyGreen;
Form3->Edit4->Color=clMoneyGreen;
str="\t\t页块 1 #被替换\r\n";
yb=0;instead_count++;
}
if(yc==3)
{Form3->Edit4->Text=IntToStr(p1->ye_num);
Form3->Edit4->Color=clRed;
Form3->Edit2->Color=clMoneyGreen;
Form3->Edit3->Color=clMoneyGreen;
yc=0;
str="\t\t页块 2 #被替换\r\n";
instead_count++;
}
ya++;yb++;yc++;
}//else
}//if
Form3->Memo2->Lines->Add(str);
free(p1); //释放当前指针
return(head);
}//running
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
YM *form3_runlru(YM *head) //运行就绪队列的头进程
{ int temp,max;
AnsiString str;
YM *p1;
p1=head;
if(p1->next==NULL)
head=form3_increat();
else
{head=p1->next;
}
Form3->Edit1->Text=IntToStr(p1->ye_num); //下一个要替换的序列
switch (p1->id) //前三个页面进行装载
{
case 1 :{Form3->Edit2->Text=IntToStr(p1->ye_num);ya++;
str="\t\t装载到页块0#\r\n";
Form3->Memo2->Lines->Add(str);
break;}
case 2 :{Form3->Edit3->Text=IntToStr(p1->ye_num); ya++;yb++;
str="\t\t装载到页块1#\r\n";
Form3->Memo2->Lines->Add(str);
break; }
case 3 :{Form3->Edit4->Text=IntToStr(p1->ye_num); ya++;yb++;yc++;
str="\t\t装载到页块2#\r\n";
Form3->Memo2->Lines->Add(str);
break;}
default:break;
}
if((p1->id!=1)||(p1->id!=2)||(p1->id!=3))
{ t1=StrToInt(Form3->Edit2->Text);
t2=StrToInt(Form3->Edit3->Text);
t3=StrToInt(Form3->Edit4->Text);
if((p1->ye_num)==t1||(p1->ye_num)==t2||(p1->ye_num)==t3)
{if(p1->ye_num==t1)
{ Form3->Edit2->Color=clYellow;
Form3->Edit3->Color=clMoneyGreen;
Form3->Edit4->Color=clMoneyGreen;
str="\t\t页块 0 #被命中\r\n";
ya=0;yb++;yc++;
}
if(p1->ye_num==t2)
{ Form3->Edit3->Color=clYellow;
Form3->Edit2->Color=clMoneyGreen;
Form3->Edit4->Color=clMoneyGreen;
str="\t\t页块 1 #被命中\r\n";
ya++;yb=0;yc++;
}
if(p1->ye_num==t3)
{ Form3->Edit4->Color=clYellow;
Form3->Edit2->Color=clMoneyGreen;
Form3->Edit3->Color=clMoneyGreen;
str="\t\t页块 2 #被命中\r\n";
ya++;yb++;yc=0;
}
}
else
{
temp=(ya>yb)?ya:yb;
max=(temp>yc)?temp:yc;
if(ya==max)
{Form3->Edit2->Text=IntToStr(p1->ye_num);
Form3->Edit2->Color=clRed;
Form3->Edit3->Color=clMoneyGreen;
Form3->Edit4->Color=clMoneyGreen;
ya=0;yb++;yc++;instead_count++;
str="\t\t页块 0 #被替换\r\n";
}
else if(yb==max)
{Form3->Edit3->Text=IntToStr(p1->ye_num);
Form3->Edit3->Color=clRed;
Form3->Edit2->Color=clMoneyGreen;
Form3->Edit4->Color=clMoneyGreen;
str="\t\t页块 1 #被替换\r\n";
ya++;yb=0;yc++; instead_count++;
}
else if(yc==max)
{Form3->Edit4->Text=IntToStr(p1->ye_num);
Form3->Edit4->Color=clRed;
Form3->Edit2->Color=clMoneyGreen;
Form3->Edit3->Color=clMoneyGreen;
ya++;yb++;yc=0;instead_count++;
str="\t\t页块 2 #被替换\r\n";
}
}//else
}//if
Form3->Memo2->Lines->Add(str);
free(p1); //释放当前指针
return(head);
}//running
//---------------------------------------------------------------------------
void form3_runmain() //运行的主函数
{
Form3->Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void form3_disp()
{ AnsiString str;
hit_count=chu_num-instead_count;
str="本次模拟页面替换过程中,共替换了:";
str+=IntToStr(instead_count-3);
str+="次,";str+="命中了:"; str+=IntToStr(hit_count);str+="次\r\n";
Form3->Memo2->Lines->Add(str);
}
//---------------------------------------------------------------------------
void form3_runFcfs()
{
if(hready3!=NULL) //如果就绪队列为非空,则不断运行,直到就绪队列为空为止
{
if(form3_flag==0)
{hready3=form3_runfifo(hready3); }
if(form3_flag==1)
{hready3=form3_runlru(hready3);}
}
else
{
Form3->Timer1->Enabled=false;
form3_disp();
}
}
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
Form3->Memo2->Clear();
form3_input();
Form3->Button1->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button3Click(TObject *Sender)
{
Form3->Memo1->Clear();
Form3->Memo2->Clear();
ya=0;yb=0;yc=0;t1=-1;t2=-1;t3=-1;hit_count=0;instead_count=0;
Form3->Button1->Enabled=true;
Form3->Button2->Enabled=true;
Form3->Edit2->Text=IntToStr(-1);
Form3->Edit3->Text=IntToStr(-1);
Form3->Edit4->Text=IntToStr(-1);
Form3->Edit2->Color=clMoneyGreen;
Form3->Edit3->Color=clMoneyGreen;
Form3->Edit4->Color=clMoneyGreen;
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button2Click(TObject *Sender)
{
form3_runmain();
Form3->Button2->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Timer1Timer(TObject *Sender)
{
form3_runFcfs();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::RadioButton1Click(TObject *Sender)
{
if(RadioButton1->Checked)
form3_flag=0;
else if(RadioButton2->Checked)
form3_flag=1;
}
//---------------------------------------------------------------------------
void __fastcall TForm3::RadioButton2Click(TObject *Sender)
{
if(RadioButton1->Checked)
form3_flag=0;
else if(RadioButton2->Checked)
form3_flag=1;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -