操作系统实验三 可变分区存储管理

实验三  可变分区存储管理

一.实验目的和要求

通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。

.实验目的和要求

阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。

编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。

假定系统的内存共640K,初始状态为操作系统本身占用64K。在t1时间之后,有作业A、B、C、D分别请求8K、16K、64K、124K的内存空间;在t2时间之后,作业C完成;在t3时间之后,作业E请求50K的内存空间;在t4时间之后,作业D完成。要求编程序分别输出t1、t2、t3、t4时刻内存的空闲区的状态。

.实验环境

Windows操作系统、VC++6.0

C语言

  • 实验报告内容
  1. 设计思想

模拟内存分配和回收,要设置两个链队列,一个空闲区链和一个占用区链,空闲区链节点有起始地址,大小和指向下一节点的指针等数据域,占用区链节点有起始地址,大小,作业名和指向下一节点的指针等数据域,本实验用最坏适应算法,每次作业申请内存都是从空闲链队头节点分配,如果相等,就删除空闲头结点,如果小于申请的,就不分配,否则就划分内存给作业,剩下的内存大小,重新插入空闲链队,按从大到小,接着把作业占用的内存放到占用区链节点的末尾。每次作业运行完,就要回收其占用的内存大小,把作业节点按从大到小插入到空闲链队中。

2.程序及注释

#include

#include

struct freelink{

int len;

int address;    

struct freelink *next;

};

struct busylink{

char name;   

int len;  //len为分区长度

                 

int address;//    address为分区起始地址

struct busylink *next;

};

struct freelink *free_head=NULL;    //自由链队列(带头结点)队首指针         

struct busylink *busy_head=NULL;   //占用区队列队(带头结点)首指针                 

struct busylink *busy_tail=NULL;   //占用区队列队尾指针

void  start(void)  /* 设置系统初始状态*/

{

struct freelink *p;

    struct busylink *q;

    free_head=(struct freelink*)malloc(sizeof(struct freelink));

    free_head->next=NULL;  // 创建自由链头结点

    busy_head=busy_tail=(struct busylink*)malloc(sizeof(struct busylink));

    busy_head->next=NULL;  // 创建占用链头结点

    p=(struct freelink *)malloc(sizeof(struct freelink));

    p->address=64;

    p->len=640-64;//OS占用了64K

    p->next=NULL;

    free_head->next=p;

    q=(struct busylink *)malloc(sizeof(struct busylink));

    q->name='S';  /*  S表示操作系统占用  */

    q->len=64;  q->address=0;  q->next=NULL;

    busy_head->next=q;  busy_tail=q;

}

void  requireMemo(char  name, int  require) /*模拟内存分配*/

{

freelink *w,*u,*v;

busylink *p;

if(free_head->next->len>=require)

{

p=(struct busylink*)malloc(sizeof(struct busylink));

        p->name=name;

        p->address=free_head->next->address;

        p->len=require;

p->next=NULL;

        busy_tail->next=p;

busy_tail=p;

}

else

printf("Can't allocate");



    w=free_head->next;

    free_head->next=w->next;

    if(w->len==require)

    {

free(w);

}

else

{

w->address=w->address+require;

        w->len=w->len-require;

}

    u=free_head;

    v=free_head->next;

    while((v!=NULL)&&(v->len>w->len))

{   u=v;

v=v->next;

}

   u->next=w;

       w->next=v;

}

void freeMemo(char name) /* 模拟内存回收*/

{

int len;

    int address;

busylink *q,*p;

freelink *w,*u,*v;

q=busy_head;

    p=busy_head->next;

    while((p!=NULL)&&(p->name!=name))

    {   q=p;

        p=p->next;

}

    if (p==NULL)

{

printf("%c is not exist",name);

}

else

    {

if(p==busy_tail)

{   busy_tail=q;

}

        else

{   q->next=p->next;

            len=p->len;

address=p->address;

free(p);

    w=(struct freelink*)malloc(sizeof(struct freelink));

            w->len=len;

            w->address=address;

            u=free_head;

            v=free_head->next;

            while((v!=NULL)&&(v->len>len))

{  u=v;

v=v->next;

}

        u->next=w;

            w->next=v;

}

}

}

void  past(int  time) /* 模拟系统过了time 时间*/

{

printf("过了时间%d后:\n",time);

}

void  printlink()  /* 输出内存空闲情况(自由链的结点) */

{

 freelink *p;

 printf("内存的空闲情况为:\n");

 p=(struct freelink *)malloc(sizeof(struct freelink));

 p=free_head->next;

 while(p!=NULL)

 {   printf("内存的起始地址和内存的大小%5d\t%5d:\n",p->address,p->len);

 p=p->next;

 }

}



int main()

{

  int t1=1,t2=2,t3=3,t4=4;

  start();

  past(t1);

  requireMemo('A',8);

  requireMemo('B',16);

  requireMemo('C',64);

  requireMemo('D',124);

  printlink();

  past(t2);

  freeMemo('C');

  printlink();

  past(t3);

  requireMemo('E',50);

  printlink();

  past(t4);

  freeMemo('D' );

  printlink();

  return 0;

}

 

3.运行结果:

程序分别输出t1、t2、t3、t4时刻内存的空闲区的状态:

操作系统实验三 可变分区存储管理_第1张图片

你可能感兴趣的:(操作系统)