百度首页 | 百度空间
 
查看文章
 
2008年5月12日操作系统上机考试题目和答案
2008-05-12 22:55
2008年5月12日操作系统上机考试题目和答案

     

很遗憾的是,我没有调试成功,郁闷!!!
但是我的思想应该是正确的,只是算法描述有错误,如果有高人能指点一二,感激不尽!!!
希望这点资料能为后人做点贡献


------------------------------------------------------------------------------------------------------------
/*ü 模拟页式存储管理方案中页面分配
用位示图记录空闲页面。假定内存被分配成256个页面,页面长度为4K。用字长为32位的8个字作为位示图。位示图的初始状态存放在一个.txt中,格式自己定义。其中,1表示该页已被分配,0表示该页是空闲的。
分配方案:只要找到空闲页就将其分配给程序,注意:要求程序连续存放。

程序运行流程:
1. 读入.txt文件中读取数据进行位示图初始化。
2. 提示用户输入“程序长度”(单位:K)。
3. 为该程序寻找空闲页面,找到连续的空闲页面分配给该程序,将对应的位示图中的相应位置为1。
4. 输出分配给程序的物理页面号(用逗号隔开)。
5. 重复2、3、4,直到输入为特殊字符0。
6. 显示当前的位示图情况*/

#include <stdio.h>
#include <iostream.h>
#include <iomanip.h>

const int PAGES=256;
const int WORD=32;
const int WORDCOUNT=PAGES/WORD;

int table[WORDCOUNT][WORD];//位示图
int count;

void init()
{
int i,j;
for(i=0;i<WORDCOUNT;i++)
{
for(j=0;j<WORD;j++)
{
table[j]=0;
}
}
count=0;
}

int read()
{
int i,j;
char fname[50];
FILE * fp;
cout<<"请输入测试文件名:"<<endl;
cin>>fname;
if((fp=fopen(fname,"r"))==NULL)
{
cout<<"错误!文件无法打开!"<<endl;
return 0;
}
else
{
for(i=0;i<WORDCOUNT;i++)
{
for(j=0;j<WORD;j++)
{
fscanf(fp,"%d",&table[j]);
if(table[j]==0)
count++;
}
}
cout<<"读入的初始位示图情况如下:"<<endl;
for(i=0;i<WORDCOUNT;i++)
{
for(j=0;j<WORD;j++)
{
cout<<table[j]<<" ";
}
cout<<endl;
}
cout<<"总共有空闲块数目:"<<count<<endl;
return 1;
}
}

void version()
{
cout<<endl<<endl;
cout<<"/////////////////////////////////////////////////////////////////"<<endl;
cout<<"/ /"<<endl;
cout<<"/ 页式存储管理方案中页面分配模拟程序 /"<<endl;
cout<<"/ 2008.5.12 /"<<endl;
cout<<"/ /"<<endl;
cout<<"/////////////////////////////////////////////////////////////////"<<endl;
cout<<endl<<endl;
}

void bid()
{
int i,j,k,ti,tj,temp,flag1,flag2,num;
cout<<"请输入要申请的程序空间大小:"<<endl;
cin>>num;
if(num%4==0)
num=num/4;
else
num=num/4+1;
if(num>count)
{
cout<<"错误!没有足够的空闲块可以分配!"<<endl;
}
else
{
i=0,j=0,ti=0,tj=0,flag1=1,flag2=1,temp=num;
while(table[j]==1)//首先找到第一个空闲块的位置,ti和tj是为了保证在连续空间检测时下标不会被改变
{
j=0,tj=0;
while((table[j]==1)&&(j<WORD-1))
j++,tj++;
if(table[j]==1)
i++,ti++;
}
while(flag1)
{
if(table[j]==0)
{
temp--;
if(j<WORD-1)
j++;
if(j==WORD-1)
i++,j=0;
if(temp==0)//说明当前有足够的连续空闲块可以分配
flag1=0;
if(i>WORDCOUNT)//没有足够的连续空间可分配
flag2=0;
}
if(flag2==0)
flag1=0;
if(table[j]==1)//如果从当前空闲快开始的连续空闲块数目不够,那么要找到新的空闲块位置
{
while(table[j]==1)
{
if(j<WORD-1)
j++,tj++;
if(j==WORD-1)
i++,ti++,j=0,tj=0;
}
temp=num;
}
}
if(flag2)
{
cout<<"申请到的空闲块情况如下:"<<endl;
for(k=0;k<num;k++)
{
cout<<(ti*32+tj)<<" ";
table[ti][tj]=1;
if(tj<WORD-1)
tj++;
if(tj==WORD-1)
ti++,tj=0;
}
count-=num;
cout<<"申请空间成功!"<<endl;
}
else
cout<<"申请空间失败!"<<endl;
}
}

void view()
{
int i,j;
cout<<"当前空闲表情况如下:"<<endl;
for(i=0;i<WORDCOUNT;i++)
{
for(j=0;j<WORD;j++)
{
cout<<table[j]<<" ";
}
cout<<endl;
}
}
void main()
{
char ch;
int i,flag=1;
init();
i=read();
if(i)
{
while(flag)
{
bid();
view();
cout<<"是否退出?"<<endl;
cin>>ch;
if(ch=='0')
flag=0;
}
}
}


类别:考试 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu