操作系统实习报告2

上传人:ZJ****1 文档编号:57898615 上传时间:2018-10-25 格式:DOC 页数:9 大小:377KB
返回 下载 相关 举报
操作系统实习报告2_第1页
第1页 / 共9页
操作系统实习报告2_第2页
第2页 / 共9页
操作系统实习报告2_第3页
第3页 / 共9页
操作系统实习报告2_第4页
第4页 / 共9页
操作系统实习报告2_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《操作系统实习报告2》由会员分享,可在线阅读,更多相关《操作系统实习报告2(9页珍藏版)》请在金锄头文库上搜索。

1、实习二 主存空间的分配和回收一、实习内容模拟主存空闲空间的表示方法,以及模拟实现主存空间的分配和回收。二、实习目的通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。3、实习题目在可变分区管理方式下采用首次适应算法(首次适应算法(First Fit):从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区)实现主存分配和回收。假定内存大小为128K。空闲区说明表格式

2、为:起始地址指出空闲区的起始地址;长度一个连续空闲区的长度;状态有两种状态,一种是“未分配”状态,另一种是“空表目”状态。本实习我用 FBT 实现,并且采用首次适应算法 FF 分配内存。四、程序中所使用的符号说明和数据结构struct FBT自由块表结构体 int startdress;自由块表中一个表项的始地址 int size;自由块表中的一个表项的大小 int processid;这个表项所对应的进程号 int state;这个表项的状态 struct FBT *next;指向下一个自由块表结构体 ; struct FBT *create() 建立自由块表子函数 struct FBT *

3、distribute(struct FBT *head)分配内存空间子函数 struct FBT *callback(struct FBT *head)回收内存空间子函数 回收内存有下列 4 种情况,在程序中用条件语句实现:void print(struct FBT *head)显示自由块表内容子函数 void main()主函数 进程 i回收区进程 j 空闲区回收区进程 j 进程 i回收区空闲区 空闲区回收区空闲区五、流程图开始;tail=head 打印这个结点tail=null结束tail=tail-next;NY将余下的空闲内 存设为一个空闲 区间返回头指针head=null将第一个内存

4、分 区分配给操作系 统申请一个新的内 存区间q申请一个新的内 存区间p链表初始化流程图显示 FBT 流程图开始输入要申请的 进程号和内存 大小 neededsizetail=null此分区未分配且足够大 tail=0 p-state=1;大小刚刚等于申请内 存大小 tail-state=1; tail- processid=id;指向下一个结点 pretail=tail tail=tail-next;返回头指针显示没有足够 的内存空间够 分配修改所剩分区的大小和起始地址 tail-size=tail-size-neededsize; tail-startdress=tail- startdre

5、ss+neededsize;将P插入到链表 中NYYYNN分配内存子函数流程图开始输入要回收的进程号id显示没有此进程tail=nulltail-processid=id;tail-next=null;pretail-state=1pretail-state =0 tail=tail-next;Ytail-state=0;将两个分区和为一个 ,分区 置状态为0YN将状态置为0即可 tail-state=0;Y将此分区与前一个 分区合并并修改状 态将此分区与后一个 分区合并并修改状 态将此分区与前后两 个分区合并并修改 状态YY回收内存子函数流程图六、程序清单#include #includes

6、truct FBTint startdress;/分区首地址int size;/分区所占内存大小int processid;/所申请内存分区的进程号,本来 FBT 中没有这一项,但是便于内存的回收我加了这一项int state;/此分区的状态struct FBT *next;/指针,指向下一个结点(分区);struct FBT *create()/建立自由块表struct FBT *head,*p,*q;head=NULL;p=(struct FBT *)malloc (sizeof(struct FBT);/申请一个新的结点,用来存放新的分区q=(struct FBT *)malloc (s

7、izeof(struct FBT);/申请一个新的结点,用来存放新的分区head=p;p-size =5;/系统分区,大小为 5p-processid =-1;/1 表示操作系统的固定分区p-startdress =0;/开始地址为 0p-state =1;/状态为已分配,值为 1p-next =q;/指向下一个结点q-size=123;/余下的分区大小为 123q-processid=0;/所对应的进程号为 0,表示都未分配q-startdress=5;/开始地址为 5q-state=0;/状态为未分配,值为 0q-next=NULL;/指向下一个分区,因为只有两个分区,所以为空return

8、 head;struct FBT *distribute(struct FBT *head)/分配内存子函数int id,neededsize;struct FBT *pretail,*tail,*p;printf(“please input the process id:“);/输入要申请内存的进程号scanf(“%d“,printf(“please input the needed size:“);/输入要申请的内存大小scanf(“%d“,pretail=tail=head;while (tail!=NULL)if(tail-state =0p-size =neededsize;p-pr

9、ocessid =id;p-startdress =tail-startdress ;p-state =1;if(head!=tail)pretail-next =p;p-next =tail;pretail=p;else p-next =tail;head=p;tail-next =NULL;tail-startdress =p-startdress+p-size ;tail-size =tail-size -neededsize;break;if(tail-size =neededsize)/如果此分区等于要申请的大小,直接分配即可tail-processid =id;tail-state

10、 =1;break; else/否则,指向下一个结点继续判断pretail=tail;tail=tail-next ;if(tail=NULL)/如果遍历完链表都没有找到合适的分区分配,则显示以下信息printf(“nSorry,there is not enough memory!n“);return head;/返回头指针struct FBT *callback(struct FBT *head)/回收内存子函数int id;struct FBT *pretail,*tail;printf(“please input the processs id:“);scanf(“%d“,pretai

11、l=tail=head;while(tail!=NULL)/遍历链表if(tail-processid =id)/如果改分区所对应的进程号为要收回分区的进程号,则做以下动作if(tail-next !=NULL)/如果改分区不是最后一个分区,则做以下动作if(pretail-state =1break;if(pretail-state =0pretail-size =tail-size +pretail-size ;free(tail);break;if(pretail-state =1tail-next -size =tail-next -size +tail-size;tail-next

12、-startdress =tail-startdress ;free(tail);break;else head=tail-next ;tail-next-startdress =0;tail-next-size +=tail-size;break;if(pretail-state =0pretail-size =pretail-size +tail-size +tail-next -size ;free(tail-next);free(tail);break;else/如果改分区是最后一个分区则做以下动作if(pretail-state =1) /如果前一个分区是已分配的tail-state

13、 =0;break;else/如果前一个分区是未分配的pretail-next =NULL;pretail-size=pretail-size +tail-size ;free(tail);break;pretail=tail;tail=tail-next ;/遍历下一个分区结点return head;/返回头指针void print(struct FBT *head)/显示 FBT 的内容给用户struct FBT *tail=head;printf(“startdresstsizetstatettprocessidtn“);tail=head;while(tail!=NULL)if(tai

14、l-state=1)printf(“%5dtt%5dt%5dtt%5dn“,tail-startdress ,tail-size ,tail-state ,tail-processid );elseprintf(“%5dtt%5dt%5dn“,tail-startdress ,tail-size ,tail-state );tail=tail-next ;void main()/主函数int choice=1;struct FBT *head;head=create();while(choice!=0)/显示选择菜单,供用户选择printf(“t1.distribute the memoryn“);printf(“t2.callback the memoryn“);printf(“t0.exitn“);printf(“tplease choose:“);scanf(“%d“,switch (choice)case 1:head=distribute(head);print(head);break;/选择 1,则做内存分配case 2:head=callback(head);print(head);break; /选择 2,则做内存回收case 0:break;default :printf(“input is error!n“);/否则显示选择错误

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号