⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 内存管理.cpp

📁 C++编写的内存管理源代码
💻 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 + -