头文件:(类可以用结构体代替)
busylink.h
class busylink//进程
{
public:
char name;//进程名称
int len;//进程长度
busylink* next;
};
freelink.h
class freelink//内存分区情况
{
public:
char name;
int len;//分区长度
int address;//分区起始位置
freelink* next;
};
源文件:
// 分区管理.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
#include"busylink.h"//引用进程类
#include"freelink.h"//引用分区类
//初始化系统状态
//系统分区地址从0开始
busylink* busy_head = new busylink();
busylink* busy_tail = new busylink();
freelink* free_head = new freelink();
//向分区中放入进程,每次放入的都是队列顶端进程
//最坏适应,每次都找最大的块进行分割
//进程队列中取出
void delBusy()
{
busy_head->next = busy_head->next->next;
}
void addFree()
{
freelink* free = free_head;
freelink* free_temp = new freelink();//记录最大空闲分区
int temp = 0;
while (true)
{
if (free->next==free_head)
{
break;
}
if (free->next->name == NULL&&free->next->len>temp)
{
free_temp = free;
temp = free->next->len;
}
free = free->next;
}
//判段最大区间是否可以放的下进程
if (free_temp->next->len > busy_head->next->len)
{
//分割区间
//现在free_temp是最大空闲分区的前一个分区
freelink* target = new freelink();
target->len = busy_head->next->len;//分区长度
target->address = free_temp->address + free_temp->len;//分区起始位置为前一个节点长度加起始位置
target->name = busy_head->next->name;//分区进程名
free_temp->next->len = free_temp->next->len - target->len;
free_temp->next->address = target->address + target->len;
target->next = free_temp->next;
free_temp->next = target;
delBusy();
}
else if (free->next -> len == busy_head->next->len)
{
//空闲区间长度正好相等直接修改空闲区间名称
free->next->name = busy_head->next->name;
delBusy();
}
else
{
cout << "该进程放不下去啊" << endl;
}
}
//删除分区中的进程
void delFreeBusy(char name)//进程名暂时不考虑空闲分区合并
{
freelink* free = free_head;
while (true)
{
if (free->next == free_head)
{
break;
}
if (free->name == name)
{
free->name = NULL;
}
free = free->next;
}
}
//向进程队列中插入进程
void addBusy(char name,int len)
{
busylink* busy = busy_head;
while (true)
{
if (busy->next == busy_tail)
{
break;
}
busy = busy->next;
}
busylink* Busy = new busylink();
Busy->len = len;
Busy->name = name;
Busy->next = busy->next;
busy->next = Busy;
}
//输出分区中的所有空闲分区
void out(string time)
{
cout << time << "时间后" << endl;
freelink* free = free_head;
while (true)
{
if (free->next == free_head)
{
break;
}
if (free->next->name == NULL)
{
cout << "起始位置" << free->next->address << "长度" << free->next->len << endl;
}
free = free->next;
}
}
void start()
{
//分区单向循环列表
//分区链表头中放系统占用内存
freelink* free = new freelink();
free->address = 64;
free->len = 640 - 64;
free->name = NULL;
free->next = free_head;
free_head->name = 'S';
free_head->len = 64;
free_head->address = 0;
free_head->next = free;
busy_head->next = busy_tail;
//向队列中插入进程信息
addBusy('A', 8);
addBusy('B', 16);
addBusy('C', 64);
addBusy('D', 124);
addBusy('E', 50);
}
void outbusy()
{
busylink* busy = busy_head;
while (true)
{
if (busy->next == busy_tail)
{
break;
}
cout << busy->next->name <<1<< endl;
busy = busy->next;
}
}
int main()
{
start();
//t1时间放入分区中的有A、B、C、D
addFree();
addFree();
addFree();
addFree();
out("t1");
//t2时间C完成
delFreeBusy('C');
out("t2");
//t3时间E进入
addFree();
out("t3");
//t4时间D出
delFreeBusy('D');
out("t4");
return 0;
}