操作系统yeshi cunchu.docx
《操作系统yeshi cunchu.docx》由会员分享,可在线阅读,更多相关《操作系统yeshi cunchu.docx(16页珍藏版)》请在冰豆网上搜索。
![操作系统yeshi cunchu.docx](https://file1.bdocx.com/fileroot1/2023-7/9/770ca5e7-a76b-4009-8e14-85505a4d48bc/770ca5e7-a76b-4009-8e14-85505a4d48bc1.gif)
操作系统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;ifor(j=0;jtable[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;ifor(j=0;jfscanf(fp,"%d",&table[i][j]);
if(table[i][j]==1)
freenum++;
}
}
cout<<"初始位示图"<for(i=0;ifor(j=0;jcout<
}
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;ki=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;kn=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;ifor(j=0;jcout<
}
cout<}
cout<<"总空闲块数:
"<}
//显示所有页表函数
voidview_pages()
{
jobs*p;
inti;
p=head->next;
if(p==NULL)cout<<"当前没有用户作业"<else
cout<<"当前所有的用户作业页表情况"<while(p!
=NULL){
cout<<"作业名:
"<jobname<<"所用块数:
"<num<cout<<"本作业所点块的序列是:
"<for(i=0;inum;i++){
cout<nums[i]<<"";
}
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;; //计数器数组,在最不频繁使用算法中用到
在何时的地方申请数组。
忘记了,上面说的那个改正方法也是只是先声明全局指针,象上面的样子
展开阅读全文
相关搜索