- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
JAVA语言程序设计实验报告一 - Read
操作系统实验报告三
时间:2005.3.10
实验题目:模拟虚拟存储器 年级:2002级 班级:1 姓名:王先平 学号任课教师:林振荣 一.实验要求:
在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。用这种办法扩充的主存储器称为虚拟存储器。通过本实验帮助同学理解在分页式存储管理中怎样实现虚拟存储器。实验应做到模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。
二.解题思路:
定义一个一个进程结构体和一个页表结构体(进代码中);
调用函数CreatTaskList(…)创建任务表,并初始化。调用函数CreatPageList(…)创建页表,并初始化,所以主存块分配给页表中的最前页,直到分完。模拟机器实现时,为了防止主存块重复分配,专门用函数GetStrageMark()来实现合法分配。
顺序执行任务表中的任务,(在此程序模拟中)即实现绝对地址的转化输出。当不对缺页进行处理时,只要简单判断是否缺页,然后进程输出;当用FIFO进行缺页处理时,用到一个Sign[StrageSize]来记忆已分配到主存块的页号,用k指针始终指到在Sign[]中最先分配到主存的那个页号。当缺页时,k中的页调出,当前页调进Sing[],并对标记为temp修改。K指向下一个待调出的页号。
用ShowPageList(…) 和ShowTaskList(…)对两个表输出。
一个程序2个功能函数都实现,先调用不对缺页处理的ChangePosition(...) 和采用FIFO对缺页处理的ChangePosition_Int(…)
三.核心代码:
typedef struct TaskList //页表
{ char ch;
int PageMark;
int CellMark;
}TaskList;
typedef struct PageList //进程
{ int Page;
bool Temp;
int StrageMark;
int Position;
}PageList;
/////////////////
void ChangePosition(TaskList Task,PageList *PageListPtr)
{
if(PageListPtr[Task.PageMark].Temp==TRUE)
{
AbsPosition=PageListPtr[Task.PageMark].StrageMark*CellMarkLen+Task.CellMark;
coutsetw(e)任务Task.ch绝对地址为:
PageListPtr[Task.PageMark].StrageMark * CellMarkLen
+ Task.CellMarksetw(e) = AbsPositionendl;
}
else
coutsetw(e)任务Task.ch * 产生缺页中断 ;
coutendlendl;
}
void ChangePosition_Int(TaskList Process,PageList *PageListPtr)
{
if(PageListPtr[Process.PageMark].Temp==TRUE)
{//非缺页
AbsPosition=PageListPtr[Process.PageMark].StrageMark*CellMarkLen+Process.CellMark;//计算绝对地址
coutsetw(e)任务Process.ch绝对地址为:
PageListPtr[Process.PageMark].StrageMark * CellMarkLen
+ Process.CellMarksetw(e) = AbsPositionendl; //格式输出
}
else
{ //产生缺页,进程对主存块进行先进先出方式的调进调出
PageListPtr[Sign[k]].Temp=FALSE; //调出最先调进的,置标记temp为false实现
Sign[k]=Process.PageMark;
PageListPtr[Sign[k]].Temp=TRUE; //调进当前页号,置标记temp为true实现
PageListPtr[Sign[k]].StrageMark=PageListPtr[k].Strage
文档评论(0)