内容发布更新时间 : 2024/12/29 14:39:13星期一 下面是文章的全部内容请认真阅读。
利用Nachos操作系统研究和实验虚拟内存
摘要:本文分析和论述了如何利用教学指导型操作系统Nachos研究和实验虚拟内存。通过详细的实例设计与分析,阐述了在Nachos操作系统中如何构建虚拟内存,如何实现虚拟内存的各种调度算法;如何实验和分析虚拟内存的工作过程和性能。对虚拟内存的教学和科研具有一定的指导辅助作用。
关键词:操作系统;虚拟内存;实践教学;Nachos
1引言
虚拟内存的实现和运行同时涉及到内存管理、调度与中断、文件系统等内核诸多方面的问题。因此在操作系统的教学和实验中虚拟内存的讲解和实验是较为棘手和困难的一个问题。为了能够讲清虚拟内存的基本构造和工作原理或想独立实践一下虚拟内存的构造和各种虚拟内存策略,我们可以利用一下教学指导型操作系统Nachos。由于Nachos提供了一个自由构造虚拟内存的框架,可让我们在其上开发和构造自主设计的虚拟内存,辅助我们更好的开展好虚拟内存的教学和研究。
2内存管理和虚拟内存构造机制
Nachos在它的页表机制中仅提供了可让用户构造虚拟内存的基本机制。页表结构是由TranslationEntry 类定义的,该定义在文件machine/translation.h中:
class TranslationEntry {
public:
int virtualPage; //逻辑页号
int physicalPage; //物理页号
bool valid; //有效位
bool readOnly; //只读位
bool use; //引用位
bool dirty; //修改位 };
为了实现虚拟内存的页置换,我们需要在以上类中增加一个该页在文件中的
块偏量:int inFilePage。
原始的Nachos内存无法实现多道程序同时驻留内存,为此可以为其增设了分段式内存管理,从而实现了多道程序同时驻留内存并发执行。增设的段式内存管理
机制的类结构为:
class SegmentEntry { //段表
public:
int segID; //段号
int segBase; //段基址
int segPages; //段页数 } ;
class MemManager{ //段管理器
public:
MemManager();// 段构造
~MemManager(); // 段析构
SegmentEntry * Allocate(int segPages,int pid);//分配一个段
void Deallocate(int Pid); //回收一个段
private:
List *usedList; //已用内存页表链
List *idleList; //空闲内存页表链 };
用户的可执行文件按段装入到模拟机的物理内存中并发执行的过程(无虚拟内存方案)可参见文献[1]。为了构造虚存,设定每个进程一个固定大小的工作集,
限定每进程可用的实存页数,补充了宏定义:
#define MemPages 4; //默认的工作集实存页数
其中的装入构造函数AddrSpace中进行了如下的扩充:
//当进程由shell命令创建时
AddrSpace::AddrSpace(char *filename) {
// 建立页表入口
pageTable = new TranslationEntry [pageTableSize];
//初始化页表项
for (i = 0; i segBase + i;//分配物理页
pageTable[i].valid = TRUE;
inMemPage[i] =i ; }
else{//如果无实存物理页号置为-1
pageTable[i].physicalPage = -1;
pageTable[i].valid = FALSE; } }
//当进程由父进程创建时
AddrSpace::AddrSpace(int pid) {
//获取父进程页表入口