📄 内存管理.cpp
字号:
// 内存管理.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct LNode//存储资源表结构(已分区表)
{
int address; //首地址
int size; //内存分区大小
int state; //状态:0表示空闲,1表示已经装入作业
int PID; //装入的作业号,0号是系统占用
LNode *Next;
}LNode,*mem_list;
typedef struct LMap //空闲分区表
{
mem_list P;//存储资源表结构地址
int size;//存储空闲分区大小
LMap *Next;
}LMap,*mem_map;
void Init(mem_list &L,int size,int add) //初始化空间段
{
mem_list p = new LNode;
p->address = add;
p->size = size;
p->state = 0;
p->PID = 0;
p->Next = NULL;
L->Next = p;
}
void setfree(mem_list &L) //找出连续的空闲资源,回收空闲空间
{
mem_list p=L->Next,q = p->Next;
while(p && q)
{
if(p->state == 0 && q->state == 0) //如果空间连续,则回收
{
p->size += q->size;
p->Next = p->Next->Next;
delete q;
q=p->Next;
}
else
{
p = q;
q = q->Next;
}
}
cout<<"回收成功"<<endl;
}
void Display(const mem_list L) //显示作业
{
int count=1;
mem_list p = L->Next;
cout<<endl<<"已分配表..................\n分区号 始地址 作业 长度 状态"<<endl;
while(p)
{
if(p->PID)
{
cout<<count++ <<"> "<<p->address<<" "<<p->PID<<" "<<p->size<<" ";
if(p->state)
cout<<"1";
else
cout<<"0";
cout << endl;
}
p = p->Next;
}
p = L->Next;
count = 1;
cout<<endl<<"空闲表..................\n分区号 始地址 长度 状态"<<endl;
while(p)
{
if(!(p->PID))
{
cout<<++count << "> "<<p->address<<" "<<p->size<<" ";
if(p->state)
cout<<"1";
else
cout<<"0";
cout << endl;
}
p = p->Next;
}
cout <<endl;
}
void AddTask(mem_list &L) //添加作业
{
int new_size;
int new_name;
mem_list p = L->Next, best = NULL;
cout<<"请输入新任务(1、2、3....):";
cin>>new_name;
cout<<"请输入新任务的大小:";
cin>>new_size;
if (new_size<=0)
{
cout<<endl<<"申请的空间不能小于1"<<endl;
exit(-1);
}
while(p)//查找第一个满足空间分配的节点
{
if(p->state==0 && p->size >= new_size)
{
best=p;
break;
}
p=p->Next;
}
if(!p)
{
cout<<"作业"<<new_name<<"内存分配不成功"<<endl;
exit(1);
}
p=L;
while(p)//查找最佳适应节点
{
if(p->state==0 && p->size >= new_size && best->size > p->size)
best = p;
p = p->Next;
}
mem_list q = new LNode;
q->size = best->size - new_size;
q->address = best->address + new_size;
q->state = 0;
q->PID=0;
best->size = new_size;
best->state = 1;
best->PID = new_name;
q->Next = best->Next;
best->Next = q;
p=L;
while(p) //删除大小为0的结点,当分配空间完时会出现0结点
{
if(p->size == 0)
{
q->Next = q->Next->Next;
delete p;
p = q->Next;
}
else
{
q = p;
p = p->Next;
}
}
}
int main()
{
mem_list L=new LNode; //mem_list
int N,A;
char flag;
cout<<"请初始化空间的大小:";
cin>>N;
cout<<"内存首址:";
cin>>A;
Init(L,N,A); //初始化大小为N,首址为A的内存空间
do
{
AddTask(L); //添加作业
Display(L); //显示作业
cout <<"请选择是否继续添加作业(继续请按'Y'或'y',否则回收空间结束)...:";
cin >> flag;
cout << endl;
}while(flag =='Y'||flag == 'y');
setfree(L);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -