《操作系统课程设计》报告文档格式.docx
- 文档编号:6492261
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:26
- 大小:156.04KB
《操作系统课程设计》报告文档格式.docx
《《操作系统课程设计》报告文档格式.docx》由会员分享,可在线阅读,更多相关《《操作系统课程设计》报告文档格式.docx(26页珍藏版)》请在冰点文库上搜索。
模拟计算机系统允许最大并发进程数为y,假设目前进程数已经达到最大进程数。
为了模拟某个进程,其所需的页面数z由随机数产生(m/10<
z<
m/4),页面推进的过程采用随机数方式给出访存地址a,逻辑地址a应该在0到zKB-1之间,操作系统负责对逻辑地址a进行地址变换,并维护整个系统内存管理的所有数据结构,保证进程的顺利推进,使内存得以共享,实现虚拟存储器的功能。
要求课设实现的系统能够配置上述参数,并按照配置参数的规模来系统的模拟系统的运行过程。
希望可以可视化的展示系统内部的变化。
三、实现过程
1、可视化界面设计
根据课设内容及其要求,模拟程序需要配置以下参数设置选项:
系统参数设置
内存大小(KB):
表示模拟计算机系统的内存总大小,以KB为最小单位。
其中包括模拟系统占用的及模拟程序可用的内存大小。
系统占用(KB):
模拟系统占用的内存大小,内存大小减去系统占用大小,剩下的即为模拟可分配的内存空间大小。
为了使模拟效果更加逼真,本课设要求系统占用空间不大于内存总空间大小的五分之一。
进程数:
运行的模拟进程数。
进程最大可用块数:
每个进程可以使用的最大内存块数。
模拟系统采用固定可用块数的方式给每个进程分配和使用内存块,当某个进程已经用完了它的最大内存块数后就要淘汰页面了。
此处为了防止进程申请系统分配内存时产生死锁,要求进程最大可用块数满足以下条件:
进程最大可用块数≤(内存大小—系统占用)/进程数
进程参数设置
逻辑地址空间页数:
进程实际的逻辑地址页数,其大小决定了其逻辑页表的长度。
进程运行时间:
进程实际要运行的步数,其大小决定了进程运行时访问页表的页数(重复计数)。
根据以上设置的参数,模拟程序将给出以下可视化信息:
内存状态:
反映内存使用的动态变化情况。
B页表内容:
进程页表内容更新状况。
综上所诉,设计出如图3.1所示的可视化界面。
图3.1可视化界面
2、数据结构分析构造
逻辑页
进程的逻辑页信息。
需要给出以下三个信息:
该页是否已在内存(bInMemoryFlag)
该页在页表的页号(nPageNo)
该页在内存的块号(nFrameNo)
实现代码如下:
publicclassLogicPage
{
publicboolbInMemoryFlag;
//是否已在内存
publicintnFrameNo;
//内存块号
publicintnPageNo;
//页号
publicLogicPage(intpageNo,intframeNo)
bInMemoryFlag=true;
nFrameNo=frameNo;
nPageNo=pageNo;
}
进程类
模拟的进程类。
利用C#中的线程类Thread构造线程对象来模拟进程。
该进程类主要包括以下数据成员信息:
进程标识号(PID)
进程逻辑地址空间页数(Pages)
进程运行时间(RunTime)
进程已加载到内存的页数(InMemoryPages)
进程页表(pageTable)
模拟进程的线程对象(Process)
其他一些数据成员信息见实现代码:
publicclassImitateProcess//模拟进程类
publicreadonlyintPID;
publicreadonlyThreadProcess;
publicLabellblProcessName;
publicMyTextBoxtxtPages;
publicMyTextBoxtxtRunTime;
publicPictureBoxpicBox;
publicBitmapbmp;
publicintPages;
//进程总共页数
publicintRunTime;
//进程运行步数
privateintInMemoryPages;
//已加载到内存的页数
privatereadonlyFrmMainfrmMain;
privatereadonlyintIndexMax;
privateList<
LogicPage>
pageTable;
//进程页表
privatereadonlyRandomrand;
publicImitateProcess(intpid,FrmMainfrm)
PID=pid;
frmMain=frm;
Pages=0;
RunTime=0;
InMemoryPages=0;
IndexMax=frmMain.nMemorySize-frmMain.nOSMemorySize;
pageTable=newList<
();
rand=newRandom();
Process=newThread(newThreadStart(
ImitateProcessProc));
3、程序流程图
图3.2程序流程图
4、主要算法分析
本程序主要涉及以下两个算法:
内存分配算法和地址映射算法。
内存分配算法
模拟计算机系统有内存mKB,系统的页面大小为1KB,假设操作系统占用内存低端的n个块(n<
程序中实现该算法的函数的参数为某个进程页表的页号pageNo,返回值为一个初始化好了的逻辑页。
其实现过程如下:
获得一个随机分配块号No;
利用lock语句对MemoryMap加锁,防止多线程同时访问修改其值;
从No开始循环检测MemoryMap,如果当前块已经被分配,则向下一块探测,如果还是已经分配,则继续下探,直到找到一个当前未使用的块(frameNo)为止。
如果已经到内存的尾部则回到操作系统分界处继续下探。
置第
步找到的块为已分配;
对MemoryMap加锁;
InMemoryPages加一;
返回一个页号为pageNo,块号为frameNo,bInMemoryFlag为true的逻辑页。
其代码如下:
privateLogicPageGetLogicPage(intpageNo)//获取内存上新载入一个逻辑页
{//该页的块号:
随机+顺序分配获取
intNo;
No=rand.Next(MaxIndex);
intindex=No;
lock(frmMain.MemoryMap)
while(frmMain.MemoryMap[index])
index++;
if(MaxIndex==index)
index=0;
frmMain.MemoryMap[index]=true;
InMemoryPages++;
returnnewLogicPage(pageNo,index+frmMain.nOSMemorySize);
地址映射算法
为了模拟某个进程,其所当前所要访问的页面由随机数产生即页面推进的过程采用随机数方式给出访存逻辑地址a(逻辑页表页号),逻辑地址a应该在0到Z-1(Z为该进程的逻辑空间页数)之间,操作系统负责对逻辑地址a进行地址变换,并维护整个系统内存管理的所有数据结构,保证进程的顺利推进,使内存得以共享,实现虚拟存储器的功能。
由于本程序只是模拟操作系统的内存管理,故地址映射部分也即进程页表变化与内存变化部分,其中更新显示界面的操作也在其中。
其实现代码如下:
privatevoidAddressMapping(intpageNo)
LogicPageLP;
if(!
IsInMemory(pageNo))//不在内存
if(InMemoryPages==frmMain.nMaxPages)//此时已达到最大块数
LogicPageswapOutPage=SwapOutFirstInPage();
//换出
swapOutPage.bInMemoryFlag=false;
LP=newLogicPage(pageNo,
swapOutPage.nFrameNo);
frmMain.UpdatePageTableStatue_Swap(PID,
swapOutPage.nPageNo,swapOutPage.nFrameNo,LP.nPageNo,LP.nFrameNo);
else
LP=GetLogicPage(pageNo);
frmMain.UpdateMemoryMapPageTableStatus(PID,pageNo,LP.nFrameNo,true);
pageTable.Add(LP);
//否则该页已在内存中,直接访问不需更新
5、程序主要部分清单
主界面部分(FrmMain.cs)
publicpartialclassFrmMain:
Form
publicintnMemorySize;
//内存大小
publicintnOSMemorySize;
//操作系统占用内存大小
publicintnMaxPages;
//每个进程最大页数
publicbool[]MemoryMap;
//内存位图使用情况
privateintnProcessNum;
//进程数
privateBitmapbmpMemoryMap;
//内存位图
ImitateProcess>
IProcessList;
//模拟进程列表
publicFrmMain()
InitializeComponent();
IProcessList=newList<
UPPTMM=newUpdatePPTMMHandler(UpdatePPTMM);
UPPTSwap=newUpdatePPT_SwapHandler(UpdatePPT_Swap);
ProcessAbortDelegate=newMethodInvoker(ProcessAbort);
privatevoidbtnOK_Click(objectsender,EventArgse)
{//生效按钮
try
nMemorySize=txtMemorySize.Value;
nOSMemorySize=txtOSMemSize.Value;
nProcessNum=txtProcessNum.Value;
nMaxPages=txtMaxPages.Value;
if(nMemorySize<
5)
thrownewException("
内存大小设置过小,请输入一个较大的正整数。
"
);
inttemp=nMemorySize/5;
if(nOSMemorySize>
temp)//系统占用大于m/5
MessageBox.Show("
系统内存设置过大,将其设为总内存大小的五分之一。
"
提示"
MessageBoxButtons.OK,MessageBoxIcon.Warning);
nOSMemorySize=temp;
txtOSMemSize.Value=temp;
txtOSMemSize.Text=temp.ToString();
temp=(nMemorySize-nOSMemorySize)/nProcessNum;
if(nMaxPages>
temp)//进程最大使用块数过大,可能产生死锁
进程最大使用块数过大,可能产生死锁。
将其设为安全使用值。
nMaxPages=temp;
txtMaxPages.Value=temp;
txtMaxPages.Text=temp.ToString();
for(inti=0;
i<
nProcessNum;
i++)
NewProcessControls(i);
btnBegin.Enabled=true;
gbOSParam.Enabled=false;
catch(Exceptionex)
IProcessList.Clear();
MessageBox.Show(ex.Message,"
错误"
MessageBoxButtons.OK,
MessageBoxIcon.Error);
privatevoidbtnBegin_Click(objectsender,EventArgse)
{//开始模拟
MemoryMap=newbool[nMemorySize-nOSMemorySize];
Array.Clear(MemoryMap,0,MemoryMap.Length);
DrawMemoryMap();
//初始化内存状态显示图
foreach(ImitateProcessIProcessinIProcessList)
IProcess.txtPages.Enabled=false;
IProcess.txtRunTime.Enabled=false;
IProcess.Pages=IProcess.txtPages.Value;
IProcess.RunTime=IProcess.txtRunTime.Value;
IProcess.bmp=newBitmap(25*IProcess.Pages,20);
Graphicsg=Graphics.FromImage(IProcess.bmp);
IProcess.Pages;
g.FillRectangle(Brushes.Green,newRectangle(
i*25,0,24,20));
g.Save();
IProcess.picBox.Image=IProcess.bmp;
g.Dispose();
IProcess.Process.Start();
btnBegin.Enabled=false;
privatevoidFrmMain_Shown(objectsender,EventArgse)
Graphicsg=panelDisplay.CreateGraphics();
g.DrawString("
lblTip.Font,Brushes.Black,50,5);
g.FillRectangle(Brushes.Red,110,5,10,10);
该块已占用"
lblTip.Font,Brushes.Black,125,5);
g.FillRectangle(Brushes.Green,200,5,10,10);
该块未占用"
lblTip.Font,Brushes.Black,215,5);
g.FillRectangle(Brushes.Blue,290,5,10,10);
操作系统占用"
lblTip.Font,Brushes.Black,310,5);
页表状态:
lblTip.Font,Brushes.Black,50,30);
g.FillRectangle(Brushes.Red,110,25,20,20);
66"
lblTip.Font,Brushes.Black,112,28);
该页在内存且块号为66"
lblTip.Font,Brushes.Black,135,30);
g.FillRectangle(Brushes.Green,270,25,20,20);
lblTip.Font,Brushes.Black,272,28);
该页已被换出内存且换出前块号为66"
lblTip.Font,Brushes.Black,295,30);
g.FillRectangle(Brushes.Green,500,25,20,20);
该页还未载入过内存"
lblTip.Font,Brushes.Black,525,30);
privatevoidNewProcessControls(intpid)
{创建新进程的控件
ImitateProcessIProcess=newImitateProcess(pid,this);
inttop=55+pid*30;
LabellblProcessName=newLabel();
lblProcessName.Text="
进程"
+pid.ToString();
lblProcessName.Left=10;
lblProcessName.Top=top;
lblProcessName.Parent=this.panelProcessDisplay;
IProcess.lblProcessName=lblProcessName;
top-=5;
MyTextBoxtxtPages=newMyTextBox();
txtPages.Width=65;
txtPages.Height=40;
txtPages.Left=120;
txtPages.Top=top;
txtPages.Parent=this.panelProcessDisplay;
IProcess.txtPages=txtPages;
MyTextBoxtxtRunTime=newMyTextBox();
txtRunTime.Width=65;
txtRunTime.Height=40;
txtRunTime.Left=200;
txtRunTime.Top=top;
txtRunTime.Parent=this.panelProcessDisplay;
IProcess.txtRunTime=txtRunTime;
PictureBoxpicBox=newPictureBox();
picBox.SizeMode=PictureBoxSizeMode.AutoSize;
picBox.Left=280;
picBox.Top=top;
IProcess.picBox=picBox;
picBox.Parent=this.panelProcessDisplay;
IProcessList.Add(IProcess);
privatevoidProcessAbort()
{//进程终止
nProcessNum--;
if(nProcessNum==0)
if(DialogResult.Yes==MessageBox.Show("
模拟进程结束,是否要从新开始?
完成提示"
MessageBoxButtons.YesNo,MessageBoxIcon.Question))
ImitateProcessIProcess;
IProcessList.Count;
IProcess=IProcessList[i];
IProcess.txtRunTime.Dispose();
IProcess.txtPages.Dispose();
IProcess.picBox.Dispose();
IProcess.bmp.Dispose();
IProcess.lblProcessName.Dispose();
IProcess.Process.Abort();
picMemoryMap.Image=null;
bmpMemoryMap.Dispose();
gbOSParam.Enabled=tr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统课程设计 操作系统 课程设计 报告