操作系统存储管理实验 第4页

  class freetable//空闲区说明表

  {  public:

     int length;//从起始地址开始的一个连续空闲区的长度

     int startaddress;//空闲区的主存起始地址

        int statue;}//为时是未分配状态,0时是空表目状态

    freetable  t[max];

       void adjust()//用冒泡法排列,并将状态为未分配的栏放在前部分

       {  int  i=0;

          int  j ;

          int  temp;

          for(;i<max;i++)//是表格紧缩,让空表目集中在表格后面

          {if(t[i].statue==0)

              { j=1;

             for(;(j<max)&&(t[j].statue==0;j++)

                if(j==max)  break;

                t[i].startaddress=t[j].startaddress;

                t[i].length=t[j].lenth;

          t[i].statue=t[j].statue;

                t[j].statue=0;

              }

          }

 

       for(i=0;t[i].state==1;i++)//用冒泡法排序

              i--;

       for(;i>0;i--)

          for(j=0;j<=i-1;j++)

          { if(t[j].startaddress>t[j+1].startaddress)

                     {temp=t[j+1].startaddress;

             t[j+1].startaddress>t[j].startaddress;

             t[j].startaddress=temp;

             temp=t[j+1].lenth;

             t[j+1].startaddress>t[j].lenth;

             t[j].lenth=temp;

    void printtable()   //输出空闲表

       { int j;

            for(i=0;t[i].statue==1;i++)

               {cout<<"t["<<i<<"].startaddress="t[i].startaddress<<endl;

          cout<<"t["<<i<<"].length="t[i].length<<endl;

             cout<<"t["<<i<<"].statue="t[i].statue<<endl;

               }

       }

      

       int FF(int x)//最先适应算法分配主存空间

       {int address;

        int j=0;

        for(;j<max;j++)

        {if(t[j].statue==1)//未分配状态时

              {if(t[j].length==x)//刚好有与作业一样大小的空闲区

                     {t[j].statue==0;//把状态置为空表目

                adjust();

                      cout<<"作业分配后的空闲区说明表:"<<endl;

                      printtable();

                      ruturn(t[j].startaddress);}//返回作业在内存的首地址

                    

             if (t[j].length>x)//当空闲区的大小比作业的大

                {address=t[j].startaddress;//先保存作业在内存的首地址

                 t[j].lenth=t[j].lenth-x;//把空闲区分为两块

           t[j].startaddress=t[j].startaddress+x;

                 adjust();

                 cout<<"作业分配后的空闲区说明表:"<<endl;

                 printtable();

                 return(address);}

else   //当前空闲区不够大时

if(j==max)  {cout<<"作业不能装入"<<endl;return 0;break;}}

else  if(j==max)  {cout<<"作业不能装入"<<endl;return 0;break;}}}

void circle(int l,int s)

{int c,i;

for(c=0;(t[c].statue==1)&&(c<max);c++)

{if((t[c-1].startaddress==s+1)&&(t[c].starataddress+t[c].length==s)&&(c+1<max)//上下都临

{t[c+1].statue=0;     //把下临的空闲表状态置0

t[c].length=t[c].length+t[c+1].length+1;   //把上临的空闲区的长度置为3者之和

break;}

if((t[c].startaddress==s+1//下临

{ t[c].startaddress=s;

t[c].length=1-t[c].length;

break;}

if((t[c].startaddress+t[c].length==s))//上临

{t[c+1].statue=0;

t[c].length=t[c].length+1;

break;}}

if(t[c].statue==0)//上下都不临

for(i=0;i<=mac;i--)  //填入空表目中

if(t[i].statue==0)

{t[j].startaddress=s;

t[j].length=1;

t[i].statue=1;

break;}

adjust();//顺序调整和紧缩空闲区表

printtable();}//最先适应算法回收

void main()

{int i;

int x;

int ad[5];

for(i=0;i<max;i++)

t[i].statue=0;

ad[0]=5;

ad[1]=26;

ad[2]=0;

t[0].startaddress=14;//初始化

t[0].length=12;

t[0].statue=1;

t[1].startaddress=32;

t[1].length=96;

t[1].statue=1;

cout<<”原始表格为”<<endl;

printable();

cout<<”作业长度为”<<endl;

cin>>x;

ad[3]=FF(x);//调用分配函数

cout<<”作业3的归还量:4k”<<endl;

circle(4,ad[2]);//调用回收函数,回收作业3

cout<<”作业2的归还量:6k”<<endl;

circle(6,ad[1]);//调用回收函数,回收作业2

上一页  [1] [2] [3] [4] [5] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有