操作系统实验一可变分区存储管理(含代码)
时间:2025-07-14
时间:2025-07-14
实验一 :可变分区存储管理
(一) 实验题目
(二) 实验目的
1.加深对可变分区的存储管理的理解;
2.提高用C语言编制大型系统程序的能力,特别是掌握C语言编程的难点:指针和指针作为函数参数;
3.掌握用指针实现链表和在链表上的基本操作。
(c)
(a)
(b)
(d)
图2-9释放区与前后空闲区相邻的情况
(三)程序代码 #include<malloc.h> #include<stdio.h> #include<string.h>
#define new(type) (type *)malloc(sizeof(type))
typedef struct _map {
unsigned int size; char *address; struct _map *next; struct _map *prev; } map;
typedef map *pmap;
typedef struct _mem {
unsigned int totalSize;
char* space; pmap head; pmap cMap; } mem;
typedef mem *pmem;
pmem createMem(unsigned int to_size) //创建内存区域 {
pmem newMem=new(mem); pmap newHead=new(map); newMem->totalSize=to_size; newHead->size=to_size;
newHead->address=newMem->space; newHead->next=newHead; newHead->prev=newHead; newMem->head=newHead; newMem->cMap=newHead; return newMem; }
void freeMem(pmem m) {
pmap map,cMap; pmap head=m->head; free(map->address);
for(map=head;map->next!=head;) {
cMap=map;
map=cMap->next; free(cMap); }
free(m); }
char* lmalloc(pmem cMem,unsigned int size) { if(size>1000){ printf("内存容量超出范围!\n"); 际空间时出错 }else{
pmap p=cMem->cMap; char* rAddr; if(size==0) return NULL;
//分配函数 //当需要分配的内存空间已经大于实
while(p->size<size) {
if(p->next==cMem->cMap) return NULL; p=p->next; }
rAddr=p->address; p->size-=size; p->address+=size; if(p->size==0) {
p->prev->next=p->next; p->next->prev=p->prev; cMem->cMap=p->next; if(cMem->head==p) cMem->head=p->next; if(p->next!=cMem->head) free(p); } else {
cMem->cMap=p; }
return rAddr; } }
void lfree(pmem m,unsigned int size,char* addr) //释放函数 {
pmap nextMap,prevMap,newMap;
if(addr<m->space || addr>=m->space+m->totalSize) {
fprintf(stderr,"地址越界\n"); //释放空间时,大小输入出错 return; }
nextMap=m->head;
while(nextMap->address<addr) {
nextMap=nextMap->next; if(nextMap==m->head) break; }
prevMap=nextMap->prev;
if(nextMap!=m->head && prevMap->address+prevMap->size==addr) //第一种情况
prevMap->size+=size;
if(addr+size==nextMap->address) //第二种情况 {
prevMap->size+=nextMap->size; prevMap->next=nextMap->next; prevMap->next->prev=prevMap; if(nextMap==m->cMap) {
m->cMap=prevMap; }
free(nextMap); nextMap=NULL; } } else {
if(addr+size==nextMap->address) {
nextMap->address-=size; nextMap->size+=size; }
else //第四种情况 {
newMap=new(map); newMap->address=addr; newMap->size=size; prevMap->next=newMap; newMap->prev=prevMap; newMap->next=nextMap; nextMap->prev=newMap; if(nextMap==m->head) m->head=newMap; } } }
void printMem(pmem m) {
pmap map=m->head; printf("\
空闲内存空间:\n\ -----------------------\n\
大小 起始地址\n");
//第三种情况 //打印函数
{
if(map==m->cMap) printf("-> "); else
printf(" ");
printf("%10u %10u\n",map->size,map->address); map=map->next;
}while(map!=m->head);
printf("-----------------------\n"); }
void main() //主函数 {
printf("--------------------------------------------------------\n");
printf("请选择操作:分配内存(m) or 释放内存(f) or 打印内存表(p)\n"); printf("--------------------------------------------------------\n");
typedef enum{cmdMalloc,cmdFree,cmdPrint,cmdHelp,cmdQuit,cmdInvalid} cmdType; pmem m=createMem(1000); char cmd[20]; char *addr;
unsigned int size; cmdType type; while(1) {
scanf("%s",cmd); if(cmd[1]=='\0') {
switch(cmd[0]) {
case 'm': case 'M':
type=cmdMalloc; break; case 'f': case 'F':
type=cmdFree; break; case 'p': case 'P':
type=cmdPrint; break; } }
{
if(!strcmp(cmd,"malloc")) type=cmdMalloc;
else if(!strcmp(cmd,"free")) type=cmdFree;
else if(!strcmp(cmd,"print")) type=cmdPrint; }
switch(type) {
case cmdMalloc: scanf("%u",&size); lmalloc(m,size); printMem(m); break;
case cmdFree:
scanf("%u %u",&size,&addr); lfree(m,size,addr); printMem(m); break;
case cmdPrint: printMem(m); break; return; } } }
(四)程序结果
…… 此处隐藏:1429字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:自动控制原理课后习题答案