分段存储管理系统
一、课程设计任务、要求、目的
1.1 课程设计任务
建立一个基本分段存储管理系统模型,演示分段存储系统工作流程。
1.2 课程设计目的和要求
首先分配一片较大的内存空间,作为程序运行的可用存储空间;建立应用程序的模型,应该包括相应的分段描述与存储结构;建立进程的基本数据结构及相应算法;建立管理存储空间的基本存储结构。建立管理分段的基本数据结构与算法;设计存储空间的分配与回收算法;提供信息转储功能,可将存储信息存入磁盘,也可从磁盘读入。
1.3 开发环境
Windows 11、DEVC++ 5.12
二、相关原理及算法
2.1 分段地址结构
图 1分段地址结构
将用户作业的逻辑地址空间划分成若干个大小不等的段(由用户根据逻辑信息的相对完整来划分) 。各段有段名(常用段号代替) ,首地址为 0。
2.2 段表地址映射
图 2段表地址映射
段表记录了段与内存位置的对应关系,段表保存在内存中,段表的基址及长度由段表寄存器给出。
访问一个字节的数据/指令需访问内存两次 (段表一次,内存一次),逻辑地址由段和段内地址组成。
2.3 地址变换
段表(起)始地址+段号*段表项长度,得到该表项在段表中的位置,访问它即可得到段长和段始址。检查段内地址是否超过段长,等于或大于产生中断,否则进入下一步。该段始址+段内位移,得到欲访问数据的最终地址,访问它即可得到数据。
图 3段表地址变换
三、系统结构和主要的算法设计思路
3.1 算法思想
首先利用申请动态内存来作为分段存储的空间,然后模拟创建进程,用于作为分段存储的对象,然后编写段的数据结构,以及段表的数据结构,来实现最关键的分段存储功能,在此基础上要对已经分配好的空间中的信息进行访问,删除和回收空间,最终以链表作为存储结构,以结构体作为段和段表的结构。
分配流程
内存回收流程
四、程序实现—主要数据结构
struct Program //进程
{
int pid; // 进程 id
struct Program *next; // 下一个进程的 id
int main_seg_num; //程序段号
int main_length; // 程序段长
int data_seg_num;// 数据段号
int data_length;//数据段长
};
struct Segtable//段表
{
int seg_num; // 段号
int seg_length; // 段长
int base_addr; // 基址
struct Segtable *next; // 下一个段指针
};
struct Memory //内存
{
int addr; // 始址
int length; // 长度
struct Memory *next; // 下一个
};
段、段表、内存空间均为结构体类型,每个单元之间采用链式连接。
五、程序运行的主要界面和结果截图
界面:
申请内存:
创建进程:
进程信息:
进程调入:
内存回收:
证明内存分配正确性:
(申请 pid=4,程序段长 30,数据段长 60 的进程,调入)
可用内存:
保存数据到磁盘: