?? 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 + -