计算机操作系统课程设计大作业.docx

上传人:b****5 文档编号:4759024 上传时间:2022-12-08 格式:DOCX 页数:12 大小:119.69KB
下载 相关 举报
计算机操作系统课程设计大作业.docx_第1页
第1页 / 共12页
计算机操作系统课程设计大作业.docx_第2页
第2页 / 共12页
计算机操作系统课程设计大作业.docx_第3页
第3页 / 共12页
计算机操作系统课程设计大作业.docx_第4页
第4页 / 共12页
计算机操作系统课程设计大作业.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

计算机操作系统课程设计大作业.docx

《计算机操作系统课程设计大作业.docx》由会员分享,可在线阅读,更多相关《计算机操作系统课程设计大作业.docx(12页珍藏版)》请在冰豆网上搜索。

计算机操作系统课程设计大作业.docx

计算机操作系统课程设计大作业

华南理工大学

“计算机操作系统”课程设计大作业

1)给出数据定义和详细说明;

structblock_s{

/*

该块的实际长度,不包括block_s的大小。

*/

intlength;

/*

申请该块的作业,为0表示该块空闲。

*/

intowner;

/*

当该块是空闲块时,offset表示下一空闲块的偏移,offset为TOTAL_BYTE表示该块是最后一个空闲块。

当该块非空闲块时,offset表示作业实际申请的大小。

|

*/

intoffset;

};

2)给出实现思想和设计流程;

该算法遍历空闲链表,找第一个大小能满足要求的块。

然后,若找到的块足够大,再把该块切成两块,返回第一块给调用者;把第二块加到空闲区链表中。

@

<

 

该算法遍历整个空闲链表,找一个大小能满足要求的块。

并且该块是所有能满足要求的空闲块中,大小最小的块。

然后,若找到的块足够大,再把该块切成两块,返回第一块给调用者;把第二块加到空闲区链表中。

 

 

|

3)调试完成源程序;

#include""

#include<>

#include<>

#definen10/*假定系统允许的最大作业为n,假定模拟实验中n值为10*/

#definem10/*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/

#defineminisize100

struct

{

floataddress;/*已分分区起始地址*/

floatlength;/*已分分区长度,单位为字节*/

intflag;/*已分配区表登记栏标志,用"0"表示空栏目*/

}used_table[n];/*已分配区表*/

struct

{

floataddress;/*空闲区起始地址*/

floatlength;/*空闲区长度,单位为字节*/

intflag;/*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/

}free_table[m];/*空闲区表*/

allocate(charJ,floatxk)

{

/*采用最优分配算法分配xk大小的空间*/

inti,k;

floatad;

k=-1;

for(i=0;i

   if(free_table[i].length>=xk&&free_table[i].flag==1)

if(k==-1||free_table[i].length

k=i;

if(k==-1)/*未找到可用空闲区,返回*/

{

  printf("无可用空闲区\n");

  

  return0;

}

/*找到可用空闲区,开始分配:

若空闲区大小与要求分配的空间差小于msize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配*/

if(free_table[k].length-xk<=minisize)

{

   free_table[k].flag=0;

ad=free_table[k].address;

xk=free_table[k].length;

}

else

{

free_table[k].length=free_table[k].length-xk;

ad=free_table[k].address+free_table[k].length;

}

/*修改已分配区表*/  

i=0;

while(used_table[i].flag!

=0&&i

  i++;

if(i>=n)/*无表目填写已分分区*/

{

printf("无表目填写已分分区,错误\n");

/*修正空闲区表*/

if(free_table[k].flag==0)

/*前面找到的是整个空闲分区*/

free_table[k].flag=1;

$

else

{/*前面找到的是某个空闲分区的一部分*/

   free_table[k].length=free_table[k].length+xk;

   

return1;

}

}

else

{/*修改已分配表*/

used_table[i].address=ad;

used_table[i].length=xk;

used_table[i].flag=J;

}

return1;

}/*主存分配函数结束*/

reclaim(charJ)

{

/*回收作业名为J的作业所占主存空间*/

inti,k,j,s,t;

floatS,L;

/*寻找已分配表中对应登记项*/

s=0;

while((used_table[s].flag!

=J||used_table[s].flag==0)&&s

   s++;

if(s>=n)/*在已分配表中找不到名字为J的作业*/

{

printf("找不到该作业\n");

return0;

}

/*修改已分配表*/

used_table[s].flag=0;

/*取得归还分区的起始地址S和长度L*/

S=used_table[s].address;

L=used_table[s].length;

j=-1;k=-1;i=0;

/*寻找回收分区的空闲上下邻,上邻表目k,下邻表目j*/

while(i

{

  if(free_table[i].flag==1)

  {

   if(free_table[i].address+free_table[i].length==S)k=i;/*找到上邻*/

   if(free_table[i].address==S+L)j=i;/*找到下邻*/

  }

  i++;

}

if(k!

=-1)

  if(j!

=-1)

/*上邻空闲区,下邻空闲区,三项合并*/

?

  {

   free_table[k].length=free_table[j].length+free_table[k].length+L;

   free_table[j].flag=0;

  }

  else

/*上邻空闲区,下邻非空闲区,与上邻合并*/

free_table[k].length=free_table[k].length+L;

  else

   if(j!

=-1)

/*上邻非空闲区,下邻为空闲区,与下邻合并*/

   {

    free_table[j].address=S;

    free_table[j].length=free_table[j].length+L;

   }

   else

/*上下邻均为非空闲区,回收区域直接填入*/

   {

/*在空闲区表中寻找空栏目*/

    t=0;

    while(free_table[t].flag==1&&t

!

     t++;

    if(t>=m)/*空闲区表满,回收空间失败,将已分配表复原*/

    {

     printf("主存空闲表没有空间,回收空间失败\n");

     used_table[s].flag=J;

     return0;

    }

    free_table[t].address=S;

$

    free_table[t].length=L;

    free_table[t].flag=1;

   }

   return1;

}/*主存回收函数结束*/

main()

{

inti,a;

floatxk;

charJ;

/*空闲分区表初始化:

*/

/

free_table[0].address=10240;

free_table[0].length=102400;

free_table[0].flag=1;

for(i=1;i

  free_table[i].flag=0;

/*已分配表初始化:

*/

for(i=0;i

  used_table[i].flag=0;

while

(1)

{

  printf("选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");

  printf("选择功项(0~3):

");

  scanf("%d",&a);

  switch(a)

  {

  case0:

exit(0);break;

  case1:

/*a=1分配主存空间这一句后面需要代码*/

        printf("请输入作业名请输入作业大小:

");

        scanf("%c%f\n",&J,&xk);

        

        allocate(J,xk);

                

        

  case2:

/*a=2回收主存空间这一句后面需要代码*/

             printf("需要回收的作业:

");

          scanf("%c\n",&J);

    reclaim(J);

        

  case3:

/*a=3显示主存情况*/

   /*输出空闲区表和已分配表的内容*/

   printf("输出空闲区表:

\n起始地址分区长度标志\n");

   for(i=0;i

    printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length,free_table[i].flag);

   printf("按任意键,输出已分配区表\n");

   getch();

   printf("输出已分配区表:

\n起始地址分区长度标志\n");

   for(i=0;i

    if(used_table[i].flag!

=0)

     printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length,used_table[i].flag);

    else

     printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length,used_table[i].flag);

    break;

  default:

printf("没有该选项\n");

  }/*case*/

}/*while*/

}/*主函数结束*/

4)屏幕观察运行结果;

5)总结自己的设计体会;

通过这次课程设计,不仅让我了解了模型机的硬件结构和怎么去设计微程序,更重要的还让我学会了、或者说是验证了“做事一定要有次序和对事物的总体把握”这句话。

开始,我没有按照步骤先设计机器指令格式,而是一下子就开始去设计微程序,这使我对整个课程设计没有什么总体把握,也不知道接下来要干什么。

后来我问了蒋老师,在他热心耐心的指导下,我终于明白要严格按照实验步骤来做。

我自己的思路也慢慢清晰了,我设计好机器指令格式,马上请教蒋老师,在确认我的机器指令格式正确的基础上,我开始用老师的仿真软件编写微指令,这时我碰到了怎样去设计此设计中02次地址,发现很巧妙而又富有随意性,看到其他同学一贯的雷同现象,我决定还是应该自己动脑筋换成别的地址。

况且只是地址上的一次改变,其他也不费工夫,那为什么不做呢!

通过努力,微程序和机器指令测试程序都已经完成,我开始调试,居然一边就成功了,我开始不感相信,我再一次找来蒋老师来帮我看了一下做好的设计,结果真是另人开心。

此时此刻,我心里多了些成就感。

在这里,我如果不说感谢的话,不知道要说些什么好;首先感谢学校和父母,然后更重要的是感谢蒋老师的教导。

“活到老,学到老”,这也是我整个学习过程中的一次经验、一次总结,我相信它肯定会给我今后的学习有所启示和指导作用。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1