报告文档格式.docx
- 文档编号:20878067
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:20
- 大小:132.69KB
报告文档格式.docx
《报告文档格式.docx》由会员分享,可在线阅读,更多相关《报告文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
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;
对于LRU线程,在内存数组中,若其有没有赋值的变量时,即为初始化的数据时,发生缺页中断;
若内存数组中所有的数据都已赋值,则要进行对比,若内存数组中的数据与要加入的数据相同,则不发生缺页中断,但内存数组中的数据却发生变化,将相同的数据移动到最后的一位,其他依次向前移动;
可以使此LRU算法运行更加简单。
2.4.3LFU线程
不发生缺页时,其时间为m_fasttime+m_memorytime;
并加入了一个关于页面出现次数的数组,每次当有相同的数据出现时,就会进行加一,并且按照在内存页面内的每个数据的出现次数进行缺页置换。
在内存数组中,若其有没有赋值的变量时,即为初始化的数据时,发生缺页中断,此时出现的每个数据都为其出现次数为1;
若内存数组中所有的数据都已赋值,则要进行对比,若内存数组中的数据与要加入的数据相同,则不发生缺页中断,内存数组中的数据不发生变化,此时出现的每个数据都为其出现次数加1;
若内存数组中的数据与要加入的数据不相同,则发生缺页中断,内存数组中的数据发生变化,要进行缺页置换,每次将位于内存数组中的第一个数据溢出,其他数据依次向前移动,空下的位置来加入新的页面数,要注意是否有已经出现过的数据,有则次数加一,无则新建,从零变到一。
2.4.4OPT线程
对于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<
MAXPAGENUM;
i++)
{
FIFO[i]=0;
}
intx=0;
//记录缺页次数
UINTtime[MAXTASKNUM];
MAXTASKNUM;
time[i]=0;
UINTk=0;
for(k=0;
k<
p->
SIZE2;
k++)
UINTnk=(UINT((p->
msEdit4).GetAt(k)))-48;
//输入的序列
UINTj=0;
while(j<
SIZE1)
{
if(FIFO[j]==nk)
{
time[k]=p->
fasttime+p->
memorytime;
break;
}
else
j++;
memorytime*3+p->
breaktime;
}
if(j==p->
UINTa=0;
for(a=0;
a<
SIZE1;
a++)
FIFO[a]=FIFO[a+1];
FIFO[p->
SIZE1-1]=nk;
x++;
//显示
UINTF=0;
CStringstrr="
"
;
for(F=0;
F<
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->
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->
CStringstr;
str.Format("
%f"
dnum);
AfxGetApp()->
SetDlgItemText(IDC_FIFO_BREAK,str);
return0;
}
3.2.2LRU线程
DWORDWINAPIThreadLru(LPVOIDlpParameter)//LRU线程
GetDlgItem(IDC_LRULIST));
UINTLRU[MAXPAGENUM];
LRU[i]=0;
chartemp;
SIZE1)//判断是否缺页
if(LRU[j]==nk)//不缺页
temp=LRU[j];
for(j;
j<
SIZE1-1;
j++)
LRU[j]=LRU[j+1];
LRU[p->
SIZE1-1]=temp;
time[k]=p->
SIZE1)//缺页置换
LRU[a]=LRU[a+1];
//显示
if(LRU[F]!
charch1=LRU[F]+48;
project[1].str[k]=strr;
project[1].page[k]=p->
project[1].time[k]=time[k];
SetDlgItemText(IDC_LRU_BREAK,str);
3.2.3LFU线程
DWORDWINAPIThreadLfu(LPVOIDlpParameter)
GetDlgItem(IDC_LFULIST));
UINTLFU[MAXPAGENUM];
LFU[i]=0;
UINTLFUnum[MAXTASKNUM];
//记录每个序列号出现次数
LFUnum[i]=0;
//chartemp;
for(k=0;
{
UINTnk=(UINT((p->
//,g;
while(j<
SIZE1)//检查是否缺页
if(LFU[j]==nk)
{
LFUnum[j]++;
break;
else
j++;
SIZE1)//缺页置换
if(k<
{x++;
LFU[k]=nk;
UINTtemp=100;
intp1=0;
for(UINTs=0;
s<
s++)
if(LFUnum[s]<
temp)
{temp=LFUnum[s];
p1=s;
LFU[p1]=nk;
}//显示
if(LFU[F]!
charch1=LFU[F]+48;
project[2].str[k]=strr;
project[2].page[k]=p->
project[2].time[k]=time[k];
SetDlgItemText(IDC_LFU_BREAK,str);
3.2.4OPT线程
DWORDWINAPIThreadOpt(LPVOIDlpParameter)//OPT线程
GetDlgItem(IDC_OPTLIST));
UINTOPT[MAXPAGENUM];
OPT[i]=0;
if(OPT[j]==nk)//不缺页
{
time[k]=p->
if(j==p->
UINTflag[MAXPAGENUM];
inti=0;
for(i=0;
flag[i]=0;
UINTw=0;
for(w=0;
w<
w++)
UINTg=0;
g=k+1;
UINTng=(UINT((p->
msEdit4).GetAt(g)))-48;
for(g=k+1;
g<
g++)
{
if(OPT[w]==ng)
flag[w]=g;
}
if(g==
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 报告