动态存储管理

题目:

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

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

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

#include<stdio.h> #include<stdlib.h> typedef struct freelink { int len,address;/*len 为分区长度,address为分区起始地址*/ struct freelink *next ; }freelink; typedef struct busylink{ char name; /* 作业或进程名*/ int len , address; struct busylink *next; }busylink; freelink *free_head=NULL; //自由链队列(带头结点)队首指针 busylink *busy_head=NULL; //占用区队列队(带头结点)首指针 busylink *busy_tail=NULL; //占用区队列队尾指针 void start(void); /* 设置系统初始状态*/ void requireMemo(char name, int require); /*模拟内存分配*/ void freeMemo(char name); /* 模拟内存回收*/ void printflink(); /* 模拟系统过了time 时间*/ void printfbusy(); void main() { int n,i,require; char str; n=1; start(); while(n) { system("cls"); printf("/n*********************************************"); printf("/n** 进程存储演示 **"); printf("/n*********************************************"); printf("/n** 1.创建进程并存入内存 **"); printf("/n** 2.查看内存空闲区大小 **"); printf("/n** 3.唤出进程并释放内存 **"); printf("/n** 4.查看内存占用区大小 **"); printf("/n** 5.退出程序 **"); printf("/n*********************************************"); printf("/n请选:(1~5)"); scanf("%d",&i); switch(i) { case 1: printf("输入进程名称:"); scanf("/n%c",&str); printf(" 内存大小:"); scanf("%d",&require); requireMemo(str,require); break; case 2: printflink(); system("pause"); break; case 3: printf("输入唤醒进程名称:"); scanf("/n%c",&str); freeMemo(str); break; case 4: printfbusy(); system("pause"); break; case 5: printf("Welcome!/n"); exit(0); } } } void start(void) { freelink * p; busylink *q; free_head=(freelink*)malloc(sizeof( freelink)); free_head->next=NULL; // 创建自由链头结点 busy_head=busy_tail=(busylink*)malloc(sizeof( busylink)); busy_head->next=NULL; // 创建占用链头结点 p=( freelink *)malloc(sizeof( freelink)); p->address=64; p->len=640-64; //OS占用了64K p->next=NULL; free_head->next=p; q=(busylink *)malloc(sizeof( 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) { if(require<=free_head->next->len) { busylink *q; freelink * w,*v,*u; q=(busylink *)malloc(sizeof( busylink)); q->name=name; q->len=require; q->address=free_head->next->address; q->next=NULL; busy_tail->next=q; busy_tail=q; w=free_head->next; free_head->next=w->next; w->len=w->len-require; w->address=w->address+require; if(w->len==require) { free(w); return ; } 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; } else { printf("Can not allocate/n"); } } void printflink() /* 模拟系统过了time 时间*/ { freelink *w; int i=1; w=free_head->next; while(w) { printf("第%d空闲区的起始地址为: %d/n",i,w->address); printf(" 长度为: %d/n",w->len); w=w->next; i++; } } void printfbusy() /* 模拟系统过了time 时间*/ { busylink *w; int i=1; w=busy_head->next; while(w) { printf("第%d占用区的起始地址为: %d/n",i,w->address); printf(" 长度为: %d/n",w->len); printf(" 名称为: %c/n",w->name); w=w->next; i++; } } /*void freeMemo(char name) { busylink *q1,*q2; freelink *p1,*p2; freelink *u; q1=busy_head; q2=busy_head->next; while(q2) { if(q2->name==name) break ; q1=q2; q2=q2->next; } if(q2==NULL) { printf("不存在该进程/n"); system("pause"); return ; } q1->next=q2->next; p2=(freelink *)malloc(sizeof(freelink)); p2->address=q2->address; p2->len=q2->len; p2->next=NULL; free(q2); u=free_head; p1=free_head->next; while(p1) { if(p1->len>=p2->len) { u=p1; p1=p1->next; continue ; } else { u->next=p2; p2->next=p1; return ; } } if(p1==NULL) { u->next=p2; return ; } }*/ void freeMemo(char name) { busylink *q1,*q2; freelink *p1,*p2,*m1,*m2,*v1,*v2; freelink *u; v1=NULL; v2=NULL; m1=NULL; //标记前驱空闲区间 m2=NULL; //标记后继空闲区间 q1=busy_head; q2=busy_head->next; while(q2) { if(q2->name==name) break ; q1=q2; q2=q2->next; } if(q2==NULL) { printf("不存在该进程/n"); system("pause"); return ; } q1->next=q2->next; p2=(freelink *)malloc(sizeof(freelink)); p2->address=q2->address; p2->len=q2->len; p2->next=NULL; free(q2); p1=free_head->next; v1=free_head; while(p1) //找是否有相邻的前驱空闲区间 { if(p1->address+p1->len==p2->address) { m1=p1; break; } v1=p1; p1=p1->next; } p1=free_head->next; v2=free_head; while(p1) //找是否有相邻的后继空闲区间 { if(p2->address+p2->len==p1->address) { m2=p1; break; } v2=p1; p1=p1->next; } if(m1&&m2) //有前后相邻空闲区 { m1->len=m1->len+m2->len+p2->len; v1->next=m1->next; v2->next=m2->next; u=free_head; p1=free_head->next; while(p1) { if(p1->len>=m1->len) { u=p1; p1=p1->next; continue ; } else { u->next=m1; m1->next=p1; return ; } } if(p1==NULL) { u->next=m1; return ; } } if(m1&&m2==NULL) { v1->next=m1->next; m1->len=m1->len+p2->len; u=free_head; p1=free_head->next; while(p1) { if(p1->len>=m1->len) { u=p1; p1=p1->next; continue ; } else { u->next=m1; m1->next=p1; return ; } } if(p1==NULL) { u->next=m1; return ; } } if(m1==NULL&&m2) { v2->next=m2->next; p2->len=m2->len+p2->len; u=free_head; p1=free_head->next; while(p1) { if(p1->len>=p2->len) { u=p1; p1=p1->next; continue ; } else { u->next=p2; p2->next=p1; return ; } } if(p1==NULL) { u->next=p2; return ; } } if(m1==NULL&&m2==NULL) { u=free_head; p1=free_head->next; while(p1) { if(p1->len>=p2->len) { u=p1; p1=p1->next; continue ; } else { u->next=p2; p2->next=p1; return ; } } if(p1==NULL) { u->next=p2; return ; } } }

 

你可能感兴趣的:(struct,null,存储,System,p2p,作业)