主存空间的分配和回收_第1页
主存空间的分配和回收_第2页
主存空间的分配和回收_第3页
主存空间的分配和回收_第4页
主存空间的分配和回收_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实习二 主存空间的分配和回收一、实习内容模拟主存空闲空间的表示方法,以及模拟实现主存空间的分配和回收。二、实习目的通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。三、实习题目在可变分区管理方式下采用首次适应算法实现主存分配和回收。假定内存大小为128K。空闲区说明表格式为:起始地址指出空闲区的起始地址;长度一个连续空闲区的长度;状态有两种状态,一种是“未分配”状态,另一种是“空表目”状态。本实习我用FBT实现,并且采用首次适应算法FF分配内存。四、程序中所使用的符号说明和数据结构struct FBT自由块表结构体int startdress;自由块表中一个表项的始地址i

2、nt size;自由块表中的一个表项的大小int processid;这个表项所对应的进程号int state;这个表项的状态struct FBT *next;指向下一个自由块表结构体;struct FBT *create() 建立自由块表子函数struct FBT *distribute(struct FBT *head)分配内存空间子函数struct FBT *callback(struct FBT *head)回收内存空间子函数回收内存有下列4种情况,在程序中用条件语句实现:进程i回收区进程j空闲区回收区进程j进程i回收区空闲区空闲区回收区空闲区void print(struct FBT

3、 *head)显示自由块表内容子函数void main()主函数五、流程图链表初始化流程图显示FBT流程图分配内存子函数流程图回收内存子函数流程图六、程序清单#include <stdio.h>#include<malloc.h>struct FBTint startdress;/分区首地址int size;/分区所占内存大小int processid;/所申请内存分区的进程号,本来FBT中没有这一项,但是便于内存的回收我加了这一项int state;/此分区的状态struct FBT *next;/指针,指向下一个结点(分区);struct FBT *create()

4、/建立自由块表struct FBT *head,*p,*q;head=NULL;p=(struct FBT *)malloc (sizeof(struct FBT);/申请一个新的结点,用来存放新的分区q=(struct FBT *)malloc (sizeof(struct FBT);/申请一个新的结点,用来存放新的分区head=p;p->size =5;/系统分区,大小为5p->processid =-1;/1表示操作系统的固定分区p->startdress =0;/开始地址为0p->state =1;/状态为已分配,值为1p->next =q;/指向下一个结

5、点q->size=123;/余下的分区大小为123q->processid=0;/所对应的进程号为0,表示都未分配q->startdress=5;/开始地址为5q->state=0;/状态为未分配,值为0q->next=NULL;/指向下一个分区,因为只有两个分区,所以为空return head;struct FBT *distribute(struct FBT *head)/分配内存子函数int id,neededsize;struct FBT *pretail,*tail,*p;printf("please input the process id:

6、");/输入要申请内存的进程号scanf("%d",&id);printf("please input the needed size:");/输入要申请的内存大小scanf("%d",&neededsize);pretail=tail=head;while (tail!=NULL)if(tail->state =0&&tail->size >=neededsize)/如果此分区没有分配,而且大小大于等于申请的内存大小if(tail->size >neededsi

7、ze)/如果此分区大小大于要申请的大小,分配,并把余下的再分割成一个分区p=(struct FBT *)malloc (sizeof(struct FBT);p->size =neededsize;p->processid =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->start

8、dress =p->startdress+p->size ;tail->size =tail->size -neededsize;break;if(tail->size =neededsize)/如果此分区等于要申请的大小,直接分配即可tail->processid =id;tail->state =1;break; else/否则,指向下一个结点继续判断pretail=tail;tail=tail->next ;if(tail=NULL)/如果遍历完链表都没有找到合适的分区分配,则显示以下信息printf("nSorry,there

9、is not enough memory!n");return head;/返回头指针struct FBT *callback(struct FBT *head)/回收内存子函数int id;struct FBT *pretail,*tail;printf("please input the process's id:");scanf("%d",&id);pretail=tail=head;while(tail!=NULL)/遍历链表if(tail->processid =id)/如果改分区所对应的进程号为要收回分区的进程

10、号,则做以下动作if(tail->next !=NULL)/如果改分区不是最后一个分区,则做以下动作if(pretail->state =1&&tail->next->state =1 )/前一个分区是已分配的且后一个分区也是已分配的tail->state =0;break;if(pretail->state =0&&tail->next->state =1 )/前一个分区是未分配的且后一个分区是已分配的pretail->next =tail->next;pretail->size =tail-&

11、gt;size +pretail->size ;free(tail);break;if(pretail->state =1&&tail->next->state =0 )/前一个分区是已分配的且后一个分区是未分配的if(pretail!=tail)pretail->next =tail->next ;tail->next ->size =tail->next ->size +tail->size;tail->next ->startdress =tail->startdress ;free(ta

12、il);break;else head=tail->next ;tail->next->startdress =0;tail->next->size +=tail->size;break;if(pretail->state =0&&tail->next->state =0 )/前一个分区和后一个分区都是未分配的pretail->next =tail->next->next ;pretail->size =pretail->size +tail->size +tail->next -&

13、gt;size ;free(tail->next);free(tail);break;else/如果改分区是最后一个分区则做以下动作if(pretail->state =1)/如果前一个分区是已分配的tail->state =0;break;else/如果前一个分区是未分配的pretail->next =NULL;pretail->size=pretail->size +tail->size ;free(tail);break;pretail=tail;tail=tail->next ;/遍历下一个分区结点return head;/返回头指针vo

14、id print(struct FBT *head)/显示FBT的内容给用户struct FBT *tail=head;printf("startdresstsizetstatettprocessidtn");tail=head;while(tail!=NULL)if(tail->state=1)printf("%5dtt%5dt%5dtt%5dn",tail->startdress ,tail->size ,tail->state ,tail->processid );elseprintf("%5dtt%5dt%

15、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:&qu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论