操作系统yeshi cunchu.docx
- 文档编号:16014734
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:16
- 大小:29.73KB
操作系统yeshi cunchu.docx
《操作系统yeshi cunchu.docx》由会员分享,可在线阅读,更多相关《操作系统yeshi cunchu.docx(16页珍藏版)》请在冰点文库上搜索。
操作系统yeshicunchu
∙页式存储管理方案
位示图
2002(?
)的北京大学主考的上机试题
内存被划分成2048块(页)。
用32位字长的字存放位示图,为0的位表示该块尚未分配,为1的位表示该块已分配?
实习检查:
1、运行程序,由检查教师给出文件名,该文件中存有内存目前状况的位示图的数据(0和1的文件)。
(程序应做提示,界面友好)。
2、你所编制的程序应读入数据,存放在相应的数据结构中。
3、显示友好的用户界面,由检查教师输入内存申请(总块数)。
4、根据申请和位示图状态,为用户分配内存,并建立页表。
5、输出位示图和页表。
本程序包括主要实现位示图算法,比较简单
VC++调试通过
(C)copyrightbyNeo
欢迎大家测试请问题请Email:
sony006@
*/
#include
#include
#include
constintPAGES=256;//定义总块数
constintWORD=32;//定义字长
constintWORDNUM=PAGES/WORD;//定义总字数
typedefstructnode{
charjobname[20];
intnum;
intnums[PAGES];
structnode*next;
}jobs;
inttable[WORDNUM][WORD];
intfreenum=0;
jobs*head;
//初始化函数
voidinitial(){
inti,j;
jobs*p;
//初始化位示图
for(i=0;i for(j=0;j table[i][j]=0; } } //初始化作业表头 p=newjobs; strcpy(p->jobname,"null"); p->num=0; p->next=NULL; head=p; } //读入位示图初始数据 voidreadData() { inti,j; FILE*fp; charfname[20]; cout<<"请输入初始位示图数据文件名: "< cin>>fname; if((fp=fopen(fname,"r"))! =NULL){ for(i=0;i for(j=0;j fscanf(fp,"%d",&table[i][j]); if(table[i][j]==1) freenum++; } } cout<<"初始位示图"< for(i=0;i for(j=0;j cout< } cout< } cout<<"总空闲块数: "< } else{ cout<<"文件不能打开"< } } //新加入作业函数 voidadd() { charjobname[20]; intnum; jobs*p; inti,j,k=0; cout<<"请输入新增的作业名: "; cin>>jobname; cout<<"新增作业所需页数: "; cin>>num; if(num<=freenum){ freenum-=num; p=newjobs; strcpy(p->jobname,jobname); p->num=num; for(k=0;k i=0; j=0; while(table[i][j]==1){ j=0; while(table[i][j]==1)j++; if(table[i][j]==1) i++; } p->nums[k]=i*WORD+j; table[i][j]=1; } p->next=head->next; head->next=p; } else{ cout<<"错误,当前剩余页数小于所需页数,请稍候再试: )"< } } //完成作业函数 voidfinish() { charjobname[20]; jobs*p,*q; intn,i,j,num,k; cout<<"请输入完成的作业名: "; cin>>jobname; p=head->next; q=head; while(p! =NULL){ if(strcmp(p->jobname,jobname)){ q=q->next; } p=p->next; } p=q->next; num=p->num; for(k=0;k n=p->nums[k]; i=n/WORD; j=n%WORD; table[i][j]=0; } freenum+=num; q->next=p->next; deletep; } //显示当前位示图函数 voidview_table() { inti,j; cout<<"当前位示图"< for(i=0;i for(j=0;j cout< } cout< } cout<<"总空闲块数: "< } //显示所有页表函数 voidview_pages() { jobs*p; inti; p=head->next; if(p==NULL)cout<<"当前没有用户作业"< else cout<<"当前所有的用户作业页表情况"< while(p! =NULL){ cout<<"作业名: "< "< cout<<"本作业所点块的序列是: "< for(i=0;i cout< } cout< p=p->next; } } //显示版权信息函数 voidversion() { cout< cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━┓"< cout<<"┃ 页式内存管理系统模拟程序 ┃"< cout<<"┠───────────────────────┨"< cout<<"┃ (c)AllRightReservedNeo ┃"< cout<<"┃ sony006@ ┃"< cout<<"┃ version2004build1122 ┃"< cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━┛"< cout< } voidmain() { intt=1,chioce; version(); initial(); readData(); while(t==1){ cout< cout<<"页式内存管理系统模拟程序"< cout<<"==========================================="< cout<<"1.加入新作业2.完成作业3.显示当前内存位示图4.显示所有作业页表0.退出"< cout<<"请选择: "; cin>>chioce; switch(chioce){ case1: add(); break; case2: finish(); break; case3: view_table(); break; case4: view_pages(); break; case0: t=0; break; default: cout<<"选择错误"< } } } 22222222 分页式存储管理中除了解决页表映射问题外,还必须解决内外存间的页面交换问题。 当主存空间已被装满而又要调入新页时,就必须把已在主存中的页面淘汰。 分页式存储管理的页面淘汰算法有: 先进先出算法,最近最久未使用算法,最不频繁使用算法等几种。 现要求选择其中的一种淘汰算法实现页式虚拟存储的过程。 编程要求: 输入文件名为: input.txt。 在该文件中共有四行。 第一行,一个整数M,表示系统分配给某作业的物理块数;第二行一个整数N,表示该作业的最大页号;第三行为整数P,表示该作业的页面走向数目;第四行共有P个整数,为该作业的页面走向。 输出文件名为: output.txt。 输出为该作业在程序执行过程中的页面淘汰次序。 下面是代码: #include using namespace std; int M; //物理块数 int P; //最大页号 int N; //页面走向数目 int Q; int *page=new int[N]; //页面走向数组 int *block=new int[M]; //记录物理块的实时信息 int *arithmometer=new int[M]; //计数器数组,在最不频繁使用算法中用到 void input() //输入信息 { cout<<"输入该作业的物理块数: "< cin>>M; cout<<"输入该作业的最大页号: "< cin>>P; cout<<"输入页面走向数目"< cin>>N; cout<<"输入页面走向信息: "< for(int i=0;i { cin>>page[i]; /*if(page[i]>P) { cout<<"' page[i] '输入有误,请重输! "< i--; }*/ } } void InAr() //初始化计数器 { for(int i=0;i { arithmometer[i]=0; } } void initialize() //初始化内存物理块 { int m=0,n=0; for(int i=0;i { if(page[m]==block[i]) { m++; arithmometer[i]++; //这里用到计数器数组 } else { block[n]=page[m]; m++; n++; } } Q=m-1; } void FIFO() //先进先出算法 { cout<<"先进先出算法页面淘汰次序: "< int a,m=Q,n=0; for(int j=Q;j { for(int i=0;i { if(page[m]==block[i]) { a=1; } else { a=0; } } if(a==1) { m++; } else { n=n%M; cout< block[n]=page[m]; m++; n++; } } cout< } void LRU() //最近最久未使用算法 { cout<<"最近最久未使用算法页面淘汰次序: "< int a,m=Q; for(int i=Q;i { for(int j=0;j { if(page[m]==block[j]) { a=1; } else { a=0; } } if(a==1) { m++; } else { for(int k=0;k { if(block[k]==page[m-M]) { cout< block[k]=page[m]; m++; } } } } cout< } void LFU() //最不频繁使用算法 { cout<<"最不频繁使用算法页面淘汰次序: "< int a,q,m=Q; for(int i=Q;i { for(int j=0;j { if(page[m]==block[j]) { a=1; arithmometer[j]++; //这里用到计数器数组 } else { a=0; } } if(a==1) { m++; } else { int min=arithmometer[0]; for(int k=0;k { if(arithmometer[k] { min=arithmometer[k]; q=k; } } cout< block[q]=page[m]; m++; } } cout< } void main() { input(); //输入信息 InAr(); //初始化计数器数组 initialize(); //初始化内存块 FIFO(); //先进先出算法 initialize(); LRU(); //最近最久未使用算法 InAr(); initialize(); LFU(); //最不频繁使用算法 delete []page; delete []block; delete []arithmometer; } 请大家看看怎么实现;在此先谢过了。 ∙对我有用[0] ∙丢个板砖[0] ∙引用 ∙举报 ∙管理 ∙TOP 回复次数: 4 ∙ ∙K ∙ ∙ ∙等 级: ∙ #1楼得分: 10回复于: 2005-11-0615: 15: 54 哪里出问题了? 用c++为什么不用class? ∙对我有用[0] ∙丢个板砖[0] ∙引用 ∙举报 ∙管理 ∙TOP 精华推荐: 牛逼程序与君共赏 ∙ ∙jdx_25 ∙(未来不是梦) ∙ ∙等 级: ∙ #2楼得分: 0回复于: 2005-11-0616: 57: 13 就是在用数字测试的时候出了点问题,楼上的能不能把他调试一下看 ∙对我有用[0] ∙丢个板砖[0] ∙引用 ∙举报 ∙管理 ∙TOP 精华推荐: 谈谈C++的缺陷: 一辆公共汽车是一辆汽车,一堆公共汽车却不是一堆汽车 ∙ ∙ugg ∙(逸学堂(hehexiao.co) ∙ ∙等 级: ∙3 #3楼得分: 30回复于: 2005-11-0812: 04: 02 是数组越界了! 设计方式不正确 放到 void main() { input(); //输入信息 int *page=new int[N]; //页面走向数组 int *block=new int[M]; //记录物理块的实时信息 int *arithmometer=new int[M]; //计数器数组,在最不频繁使用算法中用到 InAr(); //初始化计数器数组 。 。 } cout<<"输入页面走向信息: "< for(int i=0;i { cin>>page[i]; /*if(page[i]>P) { cout<<"' page[i] '输入有误,请重输! "< i--; }*/ } 放到 void InAr() //初始化计数器 来 ∙对我有用[0] ∙丢个板砖[0] ∙引用 ∙举报 ∙管理 ∙TOP 精华推荐: 对于VTune性能分析以及ThreadProfiler的疑问? ∙ ∙ugg ∙(逸学堂(hehexiao.co) ∙ ∙等 级: ∙3 #4楼得分: 60回复于: 2005-11-0812: 10: 52 int M; //物理块数 int P; //最大页号 int N; //页面走向数目 int Q; int *page=new int[N]; //页面走向数组 int *block=new int[M]; //记录物理块的实时信息 int *arithmometer=new int[M]; //计数器数组,在最不频繁使用算法中用到 看看问题,所在吧 声明全局N,但是并没有给N初始化,这时候N的值是一个随机值,如果是一负数 int *page=new int[N]; //页面走向数组 就完全错误了。 及时N的初始值为0 这时候你是int *page = new int[0]; 并没有分配数据阿! 而你在 cout<<"输入该作业的物理块数: "< cin>>M; 这时候你可以new一个M的数组对象, cout<<"输入该作业的最大页号: "< cin>>P; cout<<"输入页面走向数目"< cin>>N; 只声明全局指针。 int *page;//页面走向数组 int *block;; //记录物理块的实时信息 int *arithmometer;; //计数器数组,在最不频繁使用算法中用到 在何时的地方申请数组。 忘记了,上面说的那个改正方法也是只是先声明全局指针,象上面的样子 如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。