1、操作系统课设内存管理操作系统课程设计说明书班级:_学号:_姓名:_指导教师:_电子与信息工程学院计算机科学系1 设计题目1.2 内存管理设计并实现一个可完整演示操作系统中请求分页系统的内存分配、地址变换、页面置换等过程的演示系统。1.2.1 实验目的通过本设计: 理解内存分页机制 掌握页面置换算法 理解虚拟存储器的实现过程1.2.2 准备知识 程序设计语言(C/C+/Java) 数据结构(结构体、链表、队列等) 基本分页存储管理方式 虚拟存储器概念 请求分页存储管理方式 页面置换算法1.2.3 设计内容 设计和实现基本分页存储管理的数据结构(包括物理块、页、进程空间、页表等的模拟) 实现基于固
2、定分配局部置换策略的分页式存储分配 实现最佳、先进先出、LRU置换算法(栈式和寄存器方式任选其一) 用上面实现的算法以至少三组以上的页面请求序列,从缺页率角度比较页面置换算法的性能 设计必要的UI,接收用户输入的运行参数(页和物理课大小、逻辑和物理地址空间大小、进程驻留集大小、置换算法选择、页面请求序列等),输出运行过程及结果(每个页面请求前后页表情况、快表情况、内存使用情况、被置换页面的选择过程及结果等)。可采用命令行、桌面版或者Web版形式。2 设计思路 经过两天时间仔细研地究题目,我将本次设计划分为两部分,一部分为基本分页存储管理系统的模拟,另一部分为基于固定分配局部置换的页面算法实现。
3、基本分页存储管理系统的模拟,我主要侧重于分页系统的地址变换机构的实现,即输入一个逻辑地址,将其所指向的逻辑空间中数据存入对应的物理地址所指向的空间,逻辑和物理空间大小采用输入逻辑和物理空间的地址大小控制。此外,本程序还用位示图显示内存存储状况,用以显示存入数据的结果。页表方面采用手工输入方式。块表更新采用类似最近最久未使用算法思想。页面置换算法方面参考了计算机操作系统的算法思想。其中属最佳置换算法最难实现,耗费时间最长。先进先出置换算法采用队列结构,最近最久未使用置换算法采用栈结构。最后的UI设计,采用的是VC+6.0自带的程序运行命令行形式。3 功能模块图3.1 opks1.c(基本分页管理
4、系统) 3.2 opks2.c(页面置换算法模拟)4 主要程序流程图opks1.c main()create(): showyb(): showkb():shownc();work():Opks2.c main():creat(): in(); print():OPT(); FIFO(): LRU( ): 5 程序说明5.1 开发及运行环境本程序的开发及运行环境为Microsoft Visual C+ 6.0。5.2 代码结构5.2.1 opks1.c(基本页面存储管理系统) 顶层目录:opks1.c:基本分页存储管理系统 二层目录:int main( ):主函数 三层目录:void Crea
5、tA(); 内存初始化 void showyb(); 显示页表 void showkb(); 显示快表 void shownc(); 显示内存块使用情况5.2.1 opks2.c(页面置换算法模拟) 顶层目录:opks2.c:页面置换算法模拟 二层目录:int main( ):主函数 三层目录: void creat( ); 初始化 void OPT( ); 最佳置换算法 void FIFO( ); 先进先出置换算法 void LRU( ); 最近最久未使用置换算法 void in( ); 数据输入函数 void print( ); 数据输出函数6 主要代码6.1 opks1.c(基本分页管理
6、系统)#include #include #include /#define NULL0int max;/逻辑和物理地址空间大小 int * A;/内存物理块,0:未使用,非0:已使用int count; /记录内存未使用物理块数int kysize;/块页大小int *yb;/页表 struct kb int yh;/页号 int kh;/块号 struct kb *front; struct kb *next;int main() /struct LNode *L = NULL; int i = 0; struct kb a,b,c,d,e,*head; void CreatA(); /内
7、存初始化 void showyb();/显示页表 void showkb();/显示快表 void shownc();/显示内存块使用情况,不分进程 struct kb *work(struct kb *L); CreatA(); a.kh=0;a.yh=0; b.kh=0;b.yh=0; c.kh=0;c.yh=0; d.kh=0;d.yh=0; e.kh=0;e.yh=0; head=&a;a.next=&b;b.next=&c;c.next=&d;d.next=&e;e.next=NULL; a.front=NULL;b.front=&a;c.front=&b;d.front=&c;e.
8、front=&d; printf(n* 基本分页算法 *n); do printf(n*菜单*n); printf( 1 装入n); printf( 2 查看页表n); printf( 3 查看快表n); printf( 4 查看内存n); printf( 5 退出程序n); printf( *n); printf(请输入你的选择(select):); scanf(%d,&i); switch(i) case 1: head=work(head); break; case 2: showyb(); break; case 3: showkb(head); break; case 4: show
9、nc(); break; case 5: printf(谢谢使用nn); exit(0); break; while(i != 0); return 0; /内存初始化void CreatA() int i; printf(请输入逻辑和物理地址空间大小:n); scanf(%d,&max); printf(请输入物理块大小:n); scanf(%d,&kysize); A=(int *)malloc(max-1)*sizeof(int); count=max-1; yb=(int *)malloc(max/kysize)*sizeof(int); printf(请手动输入页表n); for(i
10、=0;i(max/kysize);i+) scanf(%d,&ybi); for(i = 0;iyh!=k1&p-next!=NULL) p=p-next; if(p-yh!=k1) p-front-next=NULL;p-front=NULL;p-next=L;L-front=p;p-yh=k1;p-kh=ybk1; else if(p-yh=k1&p-next=NULL) p-front-next=NULL;p-front=NULL;p-next=L;L-front=p; else if(p-yh=k1&p-front!=NULL) p-front-next=p-next;p-next-f
11、ront=p-front;p-front=NULL;p-next=L;L-front=p; else if(p-front=NULL&p-yh=k1) k3=p-kh*kysize+k2; Ak3=name; return L; k3=p-kh*kysize+k2; Ak3=name; return p;/显示页表void showyb() int i;printf(n*n); printf(| 页表 |n); printf(*n); for(i=0;iyh,p-kh); p=p-next; /显示内存块使用情况,不分进程 void shownc() int i = 0; printf(n*n
12、); printf(| 内存物理块分配情况 |n); printf(*n); for(i = 0; i max; i+) printf(%dt,Ai); if(i%10 = 9) printf(n); 6.2 opks2.c(页面置换算法模拟)#include#includeint znum;/驻留集大小int qnum;/请求序列大小int *zl;/驻留集int *qq;/请求序列int main() int i; void creat();/初始化 void OPT(); void FIFO(); void LRU(); void in(); void print(); creat();
13、 do printf(n*菜单*n); printf( 1 请输入页面请求序列n); printf( 2 请选择最佳(Optimal)置换算法n); printf( 3 请选择先进先出置换(FIFO)置换算法n); printf( 4 请选择最近最久未使用(LRU)置换算法n); printf( 5 退出程序n); printf( *n); printf(请输入你的选择(select):); scanf(%d,&i); switch(i) case 1: in(); break; case 2: OPT(); break; case 3: FIFO(); break; case 4: LRU(
14、); break; case 5: printf(谢谢使用nn); return 0; break; while(i != 0); return 0;/初始化void creat() int i; printf(请输入驻留集大小:n); scanf(%d,&znum); zl=(int *)malloc(znum*sizeof(int); for(i=0;iznum;i+) zli=0;/输入数据void in() int i; printf(请输入页面请求序列大小:n); scanf(%d,&qnum); qq=(int *)malloc(qnum*sizeof(int); printf(请
15、输入页面请求序列:n); for(i=0;iqnum;i+) scanf(%d,&qqi);void print() int i; for(i=0;iznum;i+) printf(%d ,zli); printf(n); void OPT() int cout=0;/记录缺页数 /float v;/缺页率 int i,j,q,max,t,y,z; int bz; int *jl=(int *)malloc(znum*sizeof(int); y=i=0;z=znum; while(iz) for(bz=0,j=0;ji;j+) if(zlj=qqi) bz=1;y-;z+;break; if
16、(bz=0) zly=qqi;cout+;/若缺页 printf(%d: ,qqi); print(); y+; i+; /将前znum个不同的页装入驻留集 for(;iqnum;i+) for(bz=0,j=0;jznum;j+) if(zlj=qqi) bz=1;break; if(bz=0)/若缺页 for(q=i,j=0;jznum;j+)/记录现驻留集中各页将来的最近访问时间 for(;qqnum;q+) jlj=q; if(zlj=qqq) break; for(max=0,q=0;qznum;q+)/找出最大的将来最近访问时间 if(maxjlq) max=jlq; for(q=
17、0;qznum;q+)/找出该最大时间对应的页在数组中的位置 if(jlq=max) t=q;break; zlt=qqi;/将该页换出 cout+; printf(%d: ,qqi); print(); printf(缺页率:%d分之%d,qnum,cout); for(j=0;jznum;j+) zlj=0; void FIFO() int cout=0;/记录缺页数 int i,j,t,y,z; int bz; /int *jl=(int *)malloc(znum*sizeof(int); y=i=0;z=znum; while(iz) for(bz=0,j=0;ji;j+) if(z
18、lj=qqi) bz=1;y-;z+;break; if(bz=0) zly=qqi;cout+;/若缺页 printf(%d: ,qqi); print(); y+; i+; /将前znum个不同的页装入驻留集 for(;iqnum;i+) for(bz=0,j=0;jznum;j+) if(zlj=qqi) bz=1;break; if(bz=0)/若缺页 for(j=1;jznum;j+) t=j-1;zlt=zlj; j=j-1; zlj=qqi; cout+; printf(%d: ,qqi); print(); printf(缺页率:%d分之%d,qnum,cout); for(j=0;jznum;j+) zlj=0;/采用栈操作void LRU() int cout=0;/记录缺页数 int i,j,q,t; int bz; for(i=0;iqnum;i+) bz=0; for(j=0;j0;j-)t=j-1;zlj=zlt;zlj=qqi;cout+;/若缺页 if(bz=1&j!=0)q=zlj;for(;j0;j-)t=j-1;zlj=zlt;zlj=q;/不缺页,且不为栈顶 printf(%d: ,qqi); print(); printf(缺页率:%d分之%d,qnum,cout); for(j=0;jznum;j+) zlj=0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1