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

📄 unit3.cpp

📁 广东工业大学 洪凌郁 操作系统的课程设计:包括进程管理
💻 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 + -