报告.docx

上传人:b****6 文档编号:7751585 上传时间:2023-01-26 格式:DOCX 页数:20 大小:132.69KB
下载 相关 举报
报告.docx_第1页
第1页 / 共20页
报告.docx_第2页
第2页 / 共20页
报告.docx_第3页
第3页 / 共20页
报告.docx_第4页
第4页 / 共20页
报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

报告.docx

《报告.docx》由会员分享,可在线阅读,更多相关《报告.docx(20页珍藏版)》请在冰豆网上搜索。

报告.docx

报告

燕山大学课程设计说明书

课程设计名称:

操作系统

题目:

模拟页面置换算法运行

 

姓名:

周良凯

学号:

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==

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

当前位置:首页 > 工程科技 > 兵器核科学

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

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