OS课程设计模拟内存分配算法MFC实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告设计题目:内存的连续分配算法
班级: 1003
学号:211011023
姓名:
指导老师:
设计时间:2012年8月
摘要
1、主要算法包括:
固定分区分配、动态分区分配、伙伴算法、可重定位分区分配。
2、内容要求:
1)定义与算法相关的数据结构,如PCB,空闲分区表;
2)至少实现两种以上分配算法,且用户可以选择在某次执行过程中使用何种算法;
3)在使用动态分区分配或可重定位分区分配算法时必须实现紧凑和对换功能;
4)动态分区分配和可重定位分区分配必选一个实现。
本系统模拟了操作系统内存分配算法的实现
,实现了固定分区分配和动态分区分配,以及可重定位分区分配算法,采用PCB 定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。内存分区表采用单链表来模拟实现。
关键词:固定分区分配、动态分区分配、可重定位分区分配。
目录
1. 概述 (4)
2. 课程设计任务及要求
2.1 设计任务 (4)
2.2 设计要求 (4)
3. 算法及数据结构
3.1算法的总体思想(流程) (5)
3.2 PCB模块
3.2.1 功能(运算) (5)
3.2.2 数据结构(存储结构) (5)
3.2.3 算法(实现) (5)
3.3 进程队列模块
3.3.1功能 (6)
3.3.2 数据结构 (6)
3.3.3算法 (6)
4. 程序设计与实现
4.1 程序流程图 (7)
4.2 程序说明(代码)
4.3 实验结果 (9)
5. 结论 (10)
6. 参考文献。 (10)
7. 收获、体会和建议。 (10)
一:概述
本系统模拟了操作系统内存分配算法的实现,实现了固定分区分配和动态分区分配,以及可重定位分区分配算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。内存分区表采用单链表来模拟实现。
固定分区实现就是将单链表的每个节点的大小设为固定大小,系统默认如果按固定分区分配的话,只能分成20个相等大小的分区,因此系统只能最多运行20个进程。
动态分区的实现是根据进程所申请的内存大小来决定动态的有系统进行分配内存空间大小,因此分区表里的空闲分区个数是不定的,根据进程数和进程大小决定的。
可重定位分区算法比动态分区算法增加了紧凑和进程对换的功能。
二:课程设计任务及要求
设计任务:
使用C++ MFC实现模拟操作系统内存分配算法的实现,定义结构体数据结构表示进程,定义单链表表示内存分区表。
设计要求:
定义与算法相关的数据结构,如PCB,空闲分区表;
至少实现两种以上分配算法,且用户可以选择在某次执行过程中使用何种算法;
在使用动态分区分配或可重定位分区分配算法时必须实现紧凑和对换功能;
动态分区分配和可重定位分区分配必选一个实现。
三:算法及数据结构
#define free 0 //表示进程状态空闲
#define busy 1 //表示进程状态忙
typedef int Status; //表示进程状态
struct PCB //表示进程PCB结构体
{
CString name; //进程name
Status status; //进程状态busy or free
int lStartAddres; //进程起始地址
int Size; //进程大小
};
struct Node //表示组成链表的结点结构体{
PCB data;
Node *next;
};
class Queue //表示分区表的单链表类
{
public:
Queue();
~Queue(){}
//void Show(); //内存区分配情况显示
int GetLength();
int GetAllFree(); //获得所有空闲分区总大小void InitialMemory(int ); //初始化内存区域大小
void FixedPartitonAlloc(); //固定分区分配初始化空闲内存链表
bool AllocProFixed(CString ,int ); //为进程分配内存(执行固定分区分配算法)
bool AllocProDynamic(CString ,int ); //为进程分配内存(动态分区分配)
bool FreeMemory(CString ); //释放进程内存
bool AllMerge(int); //内存紧凑分区算法
bool Swaping(int ,PCB&); //进程对换算法
Node *GetFirst(); //返回头结点
void Clear(); //链表节点清除
private:
Node *first;
};
#include "StdAfx.h"
#include "Queue.h"
Queue::Queue()
{
//默认头结点数据
first = new Node;
first->data.lStartAddres=0;
first->="";
first->data.Size=0;
first->data.status=busy;
first->next=NULL;
}
int Queue::GetLength()
{
int n=0;
Node *p=first;
while(p->next)
{
p=p->next;
n++;
}
return n;
}