报告.docx
《报告.docx》由会员分享,可在线阅读,更多相关《报告.docx(20页珍藏版)》请在冰豆网上搜索。
报告
燕山大学课程设计说明书
课程设计名称:
操作系统
题目:
模拟页面置换算法运行
姓名:
周良凯
学号:
110120010054
自评成绩:
A
班级:
软件工程2班
课题开发日期:
2014年1月17日
目录
1.概述....................................................2
1.1设计要求............................................2
1.2设计目的............................................2
1.3开发工具............................................2
1.4解决的主要问题......................................2
2.总体设计................................................2
2.1确定基本技术路线....................................2
2.2确定软件的总体结构..................................3
2.3确定软件的总体流程..................................3
2.4确定要创立的线程....................................3
3.详细设计................................................5
3.1使用的结构体........................................5
3.2使用的线程..........................................6
4编码设计................................................14
4.1开发环境的设置与建立...............................14
4.2程序设计时要注意的事项.............................14
4.3关键构件的特点和使用...............................14
5.总结...................................................14
用户使用说明书...........................................16
模拟页面置换算法运行
1概述
1.1设计要求
通过使用程序设计语言设计一个程序,模拟页式存储管理中FIFO、LRU、LFU、OPT四页面置换算法运行的过程。
基本要求如下:
(1)采用四个线程同时完成每个算法;
(2)能够设定驻留内存页面的个数、内存的存取时间、缺页中断的时间、快表的时间,并提供省缺值;
(3)能够随机输入存取的逻辑页面的页号序列;
(4)能够随机产生存取的逻辑页面的页号序列;
(5)能够设定页号序列中页面个数和范围;
(6)提供良好图形界面,同时能够展示四个算法运行的结果。
(7)计算每种页面置换算法每个页面的存取时间。
(8)能够将每次的实验输入和实验结果存储起来,下次运行时或以后可查询;
(9)完成多次不同设置的实验,总结实验数据,看看能得出什么结论。
1.2设计目的
通过本次操作系统课程设计,使我能够进一步掌握页面置换的方法,理解并学会使用MFC来完成界面化的功能;并借此机会提高自己的问题抽象能力、解决问题能力,以及程序编写能力和程序调试能力和归纳总结能力。
1.3开发工具
本次课程设计使用的开发工具是MicrosoftVisualVC++6.0。
并使用其下的MFC平台进行本次的课程设计。
1.4解决的主要问题
一、对四个页面算法的编写,由于需要用线程的方式完成,所以需要对之前作业中的工作进行改编为用线程的方式;
二、针对界面编程,由于之前完全没有使用过MFC,所以对于其中的函数用法等都完全不清楚,所以花费了很多的时间来看老师给的范例,并且请教同学来帮助,以达到需要清楚和合理的管理界面和变量的关联关系,最后能运用MFC中消息映射等机制解决;
三、针对多道程序中的线程的使用,这是本次编程的核心部分。
既然是多道程序,主要要解决的问题就是对临界资源的使用,必须有相应的技术进行支持,本次课程设计中使用了实现进程(线程)的同步,可以实现同时显示四个页面算法的置换过程;
四、由于需要流程图,所以需要解决作图的工作,需要在完成程序后,对程序有深刻的了解后,根据要求完成流程图的绘制。
2总体设计
2.1确定基本技术路线
本次课程设计的基本技术路线是:
面向对象程序设计。
2.2确定软件的总体结构
软件总体结构图详见(图1.软件总体结构)
图1.软件总体结构
2.3确定软件的总体流程
软件总体流程图详见(图2.软件总体流程图)
图2.软件总体流程图
2.4确定要创立的线程
本次所要用到四个页面置换算法都要用到线程,分别为FIFO线程,LRU线程,LFU线程,OPT线程,这四个线程需要可以共同完成,实现在LIST中的显示,并且,加入了对于时间的参数变量,加入了快表时间(m_fasttime),中断时间(m_breaktime),内存时间(m_memorytime),可以完成每次页面置换所需的时间;加入内存页面数(m_nSize1)和逻辑页面数(m_nSize2)完成对输入序列数字的长度控制。
总算法的流程图(如图3.总算法的流程图)
图3.总算法流程图
2.4.1FIFO线程
建立一个关于内存页面的数组,先进行初始化,用来测试是否发生缺页与缺页后进行置换,再建立一个关于时间的数组,初始化,当其发生缺页时,其时间可以设为m_breaktime+m_memorytime*3;不发生缺页时,其时间为m_fasttime+m_memorytime即可。
对于FIFO线程,在内存数组中,若其有没有赋值的变量时,即为初始化的数据时,发生缺页中断;若内存数组中所有的数据都已赋值,则要进行对比,若内存数组中的数据与要加入的数据相同,则不发生缺页中断,内存数组中的数据不发生变化;若内存数组中的数据与要加入的数据不相同,则发生缺页中断,内存数组中的数据发生变化,要进行缺页置换,每次将位于内存数组中的第一个数据溢出,其他数据依次向前移动,空下的位置来加入新的页面数。
一直进行判断,直到没有页面序列为止。
2.4.2LRU线程
建立一个关于内存页面的数组,先进行初始化,用来测试是否发生缺页与缺页后进行置换,再建立一个关于时间的数组,初始化,当其发生缺页时,其时间可以设为m_breaktime+m_memorytime*3;不发生缺页时,其时间为m_fasttime+m_memorytime即可。
对于LRU线程,在内存数组中,若其有没有赋值的变量时,即为初始化的数据时,发生缺页中断;若内存数组中所有的数据都已赋值,则要进行对比,若内存数组中的数据与要加入的数据相同,则不发生缺页中断,但内存数组中的数据却发生变化,将相同的数据移动到最后的一位,其他依次向前移动;若内存数组中的数据与要加入的数据不相同,则发生缺页中断,内存数组中的数据发生变化,要进行缺页置换,每次将位于内存数组中的第一个数据溢出,其他数据依次向前移动,空下的位置来加入新的页面数。
一直进行判断,直到没有页面序列为止。
可以使此LRU算法运行更加简单。
2.4.3LFU线程
建立一个关于内存页面的数组,先进行初始化,用来测试是否发生缺页与缺页后进行置换,再建立一个关于时间的数组,初始化,当其发生缺页时,其时间可以设为m_breaktime+m_memorytime*3;不发生缺页时,其时间为m_fasttime+m_memorytime;并加入了一个关于页面出现次数的数组,每次当有相同的数据出现时,就会进行加一,并且按照在内存页面内的每个数据的出现次数进行缺页置换。
在内存数组中,若其有没有赋值的变量时,即为初始化的数据时,发生缺页中断,此时出现的每个数据都为其出现次数为1;若内存数组中所有的数据都已赋值,则要进行对比,若内存数组中的数据与要加入的数据相同,则不发生缺页中断,内存数组中的数据不发生变化,此时出现的每个数据都为其出现次数加1;若内存数组中的数据与要加入的数据不相同,则发生缺页中断,内存数组中的数据发生变化,要进行缺页置换,每次将位于内存数组中的第一个数据溢出,其他数据依次向前移动,空下的位置来加入新的页面数,要注意是否有已经出现过的数据,有则次数加一,无则新建,从零变到一。
一直进行判断,直到没有页面序列为止。
2.4.4OPT线程
建立一个关于内存页面的数组,先进行初始化,用来测试是否发生缺页与缺页后进行置换,再建立一个关于时间的数组,初始化,当其发生缺页时,其时间可以设为m_breaktime+m_memorytime*3;不发生缺页时,其时间为m_fasttime+m_memorytime即可。
对于LOPT线程,在内存数组中,若其有没有赋值的变量时,即为初始化的数据时,发生缺页中断,直接将数据加入内存数组;若内存数组中所有的数据都已赋值,则要进行对比,若内存数组中的数据与要加入的数据相同,则不发生缺页中断,内存数组中的数据不发生变化;若内存数组中的数据与要加入的数据不相同,则发生缺页中断,内存数组中的数据发生变化,要进行缺页置换,依次向后查找,看是否有与内存页面中的数据相同的,有则不置换,都有则找最后相同的那个数据进行置换,每次都是加入到最后的内存数组的位置。
直进行判断,直到没有页面序列为止。
3详细设计
3.1使用的结构体
typedefstruct//结构体,para参数,用来给线程传递参数
{
UINTSIZE1;//内存页面数
UINTSIZE2;//逻辑页面数
CStringmsEdit4;//页面序列数
UINTfasttime;//快表时间
UINTbreaktime;//中断时间
UINTmemorytime;//内存时间
}para;
3.2使用的线程
3.2.1FIFO线程
DWORDWINAPIThreadFifo(LPVOIDlpParameter)//FIFO线程
{
para*p=(para*)lpParameter;
CListBox*pshuchu=(CListBox*)(AfxGetApp()->m_pMainWnd->GetDlgItem(IDC_FIFOLIST));
UINTFIFO[MAXPAGENUM];
inti=0;
for(i=0;i{
FIFO[i]=0;
}
intx=0;//记录缺页次数
UINTtime[MAXTASKNUM];
for(i=0;i{
time[i]=0;
}
UINTk=0;
for(k=0;kSIZE2;k++)
{
UINTnk=(UINT((p->msEdit4).GetAt(k)))-48;//输入的序列
UINTj=0;
while(jSIZE1)
{
if(FIFO[j]==nk)
{
time[k]=p->fasttime+p->memorytime;
break;
}
else
{
j++;
time[k]=p->memorytime*3+p->breaktime;
}
}
if(j==p->SIZE1)
{
UINTa=0;
for(a=0;aSIZE1;a++)
FIFO[a]=FIFO[a+1];
FIFO[p->SIZE1-1]=nk;
x++;
}
//显示
UINTF=0;
CStringstrr="";
for(F=0;FSIZE1;F++)
{
if(FIFO[F]!
=0)
{
charch1=FIFO[F]+48;
strr+=ch1;
strr+='';
}
//project[0].str[F]=strr;
}
//project[0].str[F]=strr;
project[0].str[k]=strr;
strr+="#";
strr+=p->msEdit4.GetAt(k);
project[0].page[k]=p->msEdit4.GetAt(k);
strr+="Time:
";
project[0].time[k]=time[k];
chartemp[100];
itoa(time[k],temp,10);
strr+=temp;
//AfxMessageBox(strr);
pshuchu->AddString(strr);
Sleep(300);
}
doublednum=double(x)/p->SIZE2;
CStringstr;
str.Format("%f",dnum);
AfxGetApp()->m_pMainWnd->SetDlgItemText(IDC_FIFO_BREAK,str);
return0;
}
3.2.2LRU线程
DWORDWINAPIThreadLru(LPVOIDlpParameter)//LRU线程
{
para*p=(para*)lpParameter;
CListBox*pshuchu=(CListBox*)(AfxGetApp()->m_pMainWnd->GetDlgItem(IDC_LRULIST));
UINTLRU[MAXPAGENUM];
inti=0;
for(i=0;i{
LRU[i]=0;
}
intx=0;//记录缺页次数
UINTtime[MAXTASKNUM];
for(i=0;i{
time[i]=0;
}
UINTk=0;
chartemp;
for(k=0;kSIZE2;k++)
{
UINTnk=(UINT((p->msEdit4).GetAt(k)))-48;//输入的序列
UINTj=0;
while(jSIZE1)//判断是否缺页
{
if(LRU[j]==nk)//不缺页
{
temp=LRU[j];
for(j;jSIZE1-1;j++)
LRU[j]=LRU[j+1];
LRU[p->SIZE1-1]=temp;
time[k]=p->fasttime+p->memorytime;
break;
}
else
{
j++;
time[k]=p->memorytime*3+p->breaktime;
}
}
if(j==p->SIZE1)//缺页置换
{
UINTa=0;
for(a=0;aSIZE1-1;a++)
LRU[a]=LRU[a+1];
LRU[p->SIZE1-1]=nk;
x++;
}
UINTF=0;//显示
CStringstrr="";
for(F=0;FSIZE1;F++)
{
if(LRU[F]!
=0)
{
charch1=LRU[F]+48;
strr+=ch1;
strr+='';
}
}
project[1].str[k]=strr;
project[1].page[k]=p->msEdit4.GetAt(k);
project[1].time[k]=time[k];
strr+="#";
strr+=p->msEdit4.GetAt(k);
strr+="Time:
";
chartemp[100];
itoa(time[k],temp,10);
strr+=temp;
//AfxMessageBox(strr);
pshuchu->AddString(strr);
Sleep(300);
}
doublednum=double(x)/p->SIZE2;
CStringstr;
str.Format("%f",dnum);
AfxGetApp()->m_pMainWnd->SetDlgItemText(IDC_LRU_BREAK,str);
return0;}
3.2.3LFU线程
DWORDWINAPIThreadLfu(LPVOIDlpParameter)
{
para*p=(para*)lpParameter;
CListBox*pshuchu=(CListBox*)(AfxGetApp()->m_pMainWnd->GetDlgItem(IDC_LFULIST));
UINTLFU[MAXPAGENUM];
inti=0;
for(i=0;i{
LFU[i]=0;
}
UINTLFUnum[MAXTASKNUM];//记录每个序列号出现次数
for(i=0;i{
LFUnum[i]=0;
}
intx=0;//记录缺页次数
UINTtime[MAXTASKNUM];
for(i=0;i{
time[i]=0;
}
UINTk=0;
//chartemp;
for(k=0;kSIZE2;k++)
{
UINTnk=(UINT((p->msEdit4).GetAt(k)))-48;//输入的序列
UINTj=0;//,g;
while(jSIZE1)//检查是否缺页
{
if(LFU[j]==nk)
{
LFUnum[j]++;
time[k]=p->fasttime+p->memorytime;
break;
}
else
{
j++;
time[k]=p->memorytime*3+p->breaktime;
}
}
if(j==p->SIZE1)//缺页置换
{
if(kSIZE1)
{x++;LFU[k]=nk;}
else
{
x++;
UINTtemp=100;intp1=0;
for(UINTs=0;sSIZE1;s++)
{
if(LFUnum[s]{temp=LFUnum[s];p1=s;}
}
LFU[p1]=nk;
}
}//显示
UINTF=0;
CStringstrr="";
for(F=0;FSIZE1;F++)
{
if(LFU[F]!
=0)
{
charch1=LFU[F]+48;
strr+=ch1;
strr+='';
}
}
project[2].str[k]=strr;
project[2].page[k]=p->msEdit4.GetAt(k);
project[2].time[k]=time[k];
strr+="#";
strr+=p->msEdit4.GetAt(k);
strr+="Time:
";
chartemp[100];
itoa(time[k],temp,10);
strr+=temp;
pshuchu->AddString(strr);
Sleep(300);
}
doublednum=double(x)/p->SIZE2;
CStringstr;
str.Format("%f",dnum);
AfxGetApp()->m_pMainWnd->SetDlgItemText(IDC_LFU_BREAK,str);
return0;
}
3.2.4OPT线程
DWORDWINAPIThreadOpt(LPVOIDlpParameter)//OPT线程
{
para*p=(para*)lpParameter;
CListBox*pshuchu=(CListBox*)(AfxGetApp()->m_pMainWnd->GetDlgItem(IDC_OPTLIST));
UINTOPT[MAXPAGENUM];
inti=0;
for(i=0;i{
OPT[i]=0;
}
intx=0;//记录缺页次数
UINTtime[MAXTASKNUM];
for(i=0;i{
time[i]=0;
}
UINTk=0;
for(k=0;kSIZE2;k++)
{
UINTnk=(UINT((p->msEdit4).GetAt(k)))-48;//输入的序列
UINTj=0;
while(jSIZE1)//判断是否缺页
{
if(OPT[j]==nk)//不缺页
{
time[k]=p->fasttime+p->memorytime;
break;
}
else
{
j++;
time[k]=p->memorytime*3+p->breaktime;
}
}
if(j==p->SIZE1)//缺页置换
{
UINTflag[MAXPAGENUM];
inti=0;
for(i=0;i{
flag[i]=0;
}
UINTw=0;
for(w=0;wSIZE1;w++)
{
UINTg=0;
g=k+1;
UINTng=(UINT((p->msEdit4).GetAt(g)))-48;//输入的序列
for(g=k+1;gSIZE2;g++)
{
if(OPT[w]==ng)
{
flag[w]=g;
break;
}
}
if(g==