操作系统yeshi cunchu.docx

上传人:b****8 文档编号:28265584 上传时间:2023-07-09 格式:DOCX 页数:16 大小:29.73KB
下载 相关 举报
操作系统yeshi cunchu.docx_第1页
第1页 / 共16页
操作系统yeshi cunchu.docx_第2页
第2页 / 共16页
操作系统yeshi cunchu.docx_第3页
第3页 / 共16页
操作系统yeshi cunchu.docx_第4页
第4页 / 共16页
操作系统yeshi cunchu.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

操作系统yeshi cunchu.docx

《操作系统yeshi cunchu.docx》由会员分享,可在线阅读,更多相关《操作系统yeshi cunchu.docx(16页珍藏版)》请在冰豆网上搜索。

操作系统yeshi cunchu.docx

操作系统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<<"作业名:

"<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;;       //计数器数组,在最不频繁使用算法中用到

在何时的地方申请数组。

忘记了,上面说的那个改正方法也是只是先声明全局指针,象上面的样子

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1