《操作系统课设报告Fan.doc》由会员分享,可在线阅读,更多相关《操作系统课设报告Fan.doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、操作系统课程设计报告系 (院): 计算机科学学院 专业班级: 计科10903 姓 名: 范先星 班内序号: 11 学 号: 指导教师: 冯伟 钟宝荣 设计时间: 2011.12.12 - 2011.12.18 设计地点: 12教机房 一、课程设计目的3二、设计任务及要求3三、需求分析4四、总体设计4五、详细设计与实现含代码和实现界面7六、课程设计小结一 课程设计目的1深入理解课程中有关多道程序设计、进程管理、内存管理2熟悉程序设计、数据结构、软件设计3体验软件开发的相关过程二、课设内容 假设一个机器,其有内存为32KB,系统采用请求页式系统进行存储管理,每个页面大小为1KB,另外其运行的OS-
2、KSOS本身需要占用占用8K,剩余空间留给了用户进程共享使用。模拟系统KSOS采用多道程序设计的方案,规定每个进程使用的最大块数为4KB。本课程设计要求设计程序来模拟上述场景的实现,程序的用户可以通过命令、菜单、按钮等用户接口来动态创建进程,系统让用户输入需创建的进程的逻辑地址空间大小,系统响应用户创建的要求后,创建PCB、生成模拟程序代码。课程设计系统中用线程来模拟KSOS系统中的进程,设计程序来模拟采用时间片轮转调度算法驱动各进程向前推进,当然推进的顺序是按照创建时随机生成的模拟程序来行进的。开始所有的页都不在内存,随着程序推进,它们被调入内存,KSOS改变页表、内存位示图,反映系统内部的
3、实际状况。模拟程序代码表中的时长部分为该地址的内存使用的时间长度(定时时间粒度的个数)。系统可以用多线程实现:主线程为用户界面线程,每次用户创建一个进程程,内部就创建一个线程与之对应;也可以用定时器来模拟多个进程的运行。用户界面上可以显示内存的变化情况,可以动态显示当前处理机运行进程的有关情况,如三、需求分析 这次课设在做需求分析时,我是这样做的。首先要实现时间片轮转算法,将多个进程排成一个就绪队列,每次给队首一个时间片。要将进程轮转的效果显现出来就应该采用动态着色,进程切换时,进程颜色跟着轮转,进程消亡时,进程颜色变成系统白色。同时,为了能更精细地显示各个内存块与诸个页面的对应动态关系,也应
4、利用动态着色来实现,而且还要用到细化到块着色。进程切换的同时,将该进程在内存块中运行的页面与物理块对应起来,显示在界面下方的进度栏上。这以后大概的内存管理也就差不多实现了,只需再稍加润色就好了。其次,对于页面置换算法,我采用的是先进先出。当程序运行时发现有缺页,就会申请将所缺页面调入内存。我想将此过程在页表框上显示出来。通过生成的代码的逻辑地址,每隔一定时间执行一定数量的代码,同时将此动态过程显示在页表框,直至该进程所有的指令全部执行完。然后就是生成进程。我并没有用线程来代替进程,而是用定时器来实现的。每次输入一组关于进程的参数创建若干个进程,然后将这些创建好的进程的相关信息存入一数组。在按下
5、创建进程组后,该进程的所有信息全部被存入该数组的一个元素中。后续程序要用到该进程的一些参数时,完全可以通过调用相关的数组元素来实现对进程时间片轮转算法以及页面置换算法演算。最后就是该如将定时与进程切换以及页面置换串起来了。这部分应该在OnTimer()函数中实现。四、总体设计 此程序主要分为三部分:参数输入部分,进程信息存储,效果显示部分。1. 参数输入部分通过MFC中的编辑框接受进程各项参数,在用消息传递将编辑框中的信息存储到字符数组中,通过atoi()和itoa()函数实现char类型和int类型之间的转换。2. 进程信息存储在创建进程类后,通过上个步骤所传过来的参数对进程类的各个类成员进
6、行赋值。以及通过创建进程组按键的Click()事件可以确定进程的个数。3. 效果显示部分此部分主要通过对一系列的静态文本框和Button进行着色。这部分相对来说属于细节实现部分,但我却为此花了不少功夫。因为自己对MFC已经有段时间没接触,有些生疏了。五、详细设计与实现 根据思路首先我建好了框架,然后开始构架数据结构,创建各个类以及队列等,再而逐一开始各个部分的功能实现。程序流程图如下:1.所使用的类及相关数据结构:enum STATUSRUN,READY,WAIT,FINISH; struct QueueNode int ID; /进程ID struct QueueNode *next; /队
7、列中下一个进程指针 ; struct LinkQueue QueueNode *head;/队首 ; class CPageTableItempublic:byte InterruptBit;/中断位:0-不在内存;1-在内存int FrameNo;/内存的帧号int PageNum;ICPageTableItem(byte InBit,int FrNo,int PaNum)InterruptBit=InBit;FrameNo=FrNo;PageNum=PaNum;class CCodeLineItempublic:int LogicalAddress;/代码的逻辑地址(这里以页号简单地代替了
8、)int RunTime;/该指令需要运行的时间长度(以定时器的定时时间粒度为单位)ICCodeLineItem(int LogAdd,int Rtime)LogicalAddress=LogAdd;RunTime=Rtime;class CPCBpublic:int LogicalAddressSpaceSize;/逻辑地址空间大小int CodeLineNum;int m_pcbFrameNum;int MemroyStartPos;CArray SimulCodeList;/模拟代码列表int CurrentRunningPosition;/当前运行位置CArray PageTableA
9、ddress;/页表首址int nPID;/进程标识符STATUS status; /进程状态 int reqTime; /总的需要运行时间 int remainTime; /剩下需要运行时间 int arriveTime; /进入就绪队列时间 int startTime; /开始运行时间 int finishTime; /结束运行时间 int UniqueBrushNO;int PositionInQueue;char ProgressName15;2.上述所建立的队列是为方便实现时间片轮转算法,同时利用之显示运行效果。a.队列或链表结构b.初始化操作c.轮转算法:通过记录各进程的信息,再后
10、续判断及更改该进程已随时间变化的变量,如果进程在该时间片内做完,则在做完相应的记录如CurrentTime后,转入下一个进程的处理上,所做的记录做为以后的判断是否进入下个进程的条件,以此达到模拟时间片轮转的效果。以下是时间片轮转算法:bool RR_Run(LinkQueue &Q,QueueNode *q,const int Round,int &CurrentTime,CPCB *ProcessTable) if(ProcessTableq-ID.remainTimeID.finishTime=CurrentTime + ProcessTableq-ID.remainTime; Curre
11、ntTime=ProcessTableq-ID.finishTime; return true; else/此时间片内做不完 ProcessTableq-ID.remainTime = ProcessTableq-ID.remainTime - Round; /此处求解remainTime,可以用remainTime next; while(q!=NULL)/从队首开始依次分配时间片 do Finish=RR_Run(Q,q,Round,CurrentTime,m_pcb);/分配时间片给q进程 if(!Finish)/若是进程在本时间片内未做完 if(q- next = NULL) r =
12、Q.head-next; else r = q- next; ProcessTabler-ID.PositionInQueue=1; else /若是进程在本时间片内做完,则对队列进行处理 ProcessTableq-ID.UniqueBrushNO=0;p-next=q-next; delete q; /从队列中删除q进程 q = p; while(!Finish &(ProcessTabler-ID.arriveTimeCurrentTime + Round); /下一个进程很晚才来,则继续给当前进程分配时间片 p = q; q = q- next; if(q = NULL& Q.head
13、- next!=NULL) p = Q.head; q = p- next; delete Q.head; Q.head = NULL; void InitialQueue(LinkQueue &Q,CPCB *ProcessTable,const int processnum) for(int i=0;inext = NULL; QueueNode * p; QueueNode * q; for(i=0;iID = i; p-next = NULL; if(i = 0) Q.head-next = p; else q-next = p; /尾插法 q = p; 通过建立一个队列,将创建的进程
14、依次插入队列,每次给队首一个时间片运行,同时记录相关的变量,比如是否结束RemainTime,CuurrentTime等。3.页面置换算法void COSDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultif(q!=NULL)/从队首开始依次分配时间片 int CompareCounter=0;char ch615;if(m_CodeLineID.CodeLineNum)for(int Page=0;PageID.SimulCodeListm_CodeLine.Log
15、icalAddress=m_pcbq-ID.SimulCodeListPage.LogicalAddress)m_pcbq-ID.SimulCodeListPage.RunTime=m_pcbq-ID.SimulCodeListm_CodeLine.RunTime;if(m_pcbq-ID.SimulCodeListm_CodeLine.LogicalAddress!=m_pcbq-ID.SimulCodeListPage.LogicalAddress)CompareCounter+;if(CompareCounter=m_FrameNum)m_pcbq-ID.SimulCodeListCod
16、eSign%m_FrameNum.LogicalAddress=m_pcbq-ID.SimulCodeListm_CodeLine.LogicalAddress;m_pcbq-ID.SimulCodeListCodeSign%m_FrameNum.RunTime=m_pcbq-ID.SimulCodeListm_CodeLine.RunTime;CodeSign+;itoa(m_pcbq-ID.SimulCodeListPage.LogicalAddress,ch6,10);GetDlgItem(1001+Page)-SetWindowText(ch6);CompareCounter=0;m_
17、CodeLine+;刚开始调入前四页,然后缺页则调页.通过比较即将调入的页与已在内存的页面来判断是否要将次页调入。如果此页已在内存,则不作处理。否则,将其调入替换最先进入的页面。同时也为各页设置一变量来记录相关的驻留内存的时间,以便为页面置换提供依据。4.参数输入部分void COSDlg:OnBtnManualSimul() / TODO: Add your control notification handler code herem_count+;char ch115,ch215,ch315,ch415,ch515;m_pcbm_count-1.nPID=1000+m_count;ito
18、a(m_pcbm_count-1.nPID,ch1,10);SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,15,LPARAM(m_char1);SendDlgItemMessage(IDC_EDIT4,WM_GETTEXT,15,LPARAM(m_char3);SendDlgItemMessage(IDC_EDIT5,WM_GETTEXT,15,LPARAM(m_char4);SendDlgItemMessage(IDC_EDIT6,WM_GETTEXT,15,LPARAM(m_char5);SendDlgItemMessage(IDC_EDIT7,WM_GE
19、TTEXT,15,LPARAM(m_char6);SendDlgItemMessage(IDC_EDIT12,WM_GETTEXT,15,LPARAM(m_char7);SendDlgItemMessage(IDC_EDIT8,WM_GETTEXT,15,LPARAM(m_char8);SendDlgItemMessage(IDC_EDIT12,WM_GETTEXT,15,LPARAM(m_char9); SendDlgItemMessage(IDC_EDIT1,WM_SETTEXT,15,LPARAM(ch1);SendDlgItemMessage(IDC_EDIT9,WM_SETTEXT,
20、15,LPARAM(m_char4);SendDlgItemMessage(IDC_EDIT10,WM_SETTEXT,15,LPARAM(m_char5);SendDlgItemMessage(IDC_EDIT11,WM_SETTEXT,15,LPARAM(m_char6);SendDlgItemMessage(IDC_EDIT13,WM_SETTEXT,15,LPARAM(m_char9);将静态文本框和编辑框上接受的字符通过转换后传给特定的字符数组供以后使用。5.产生模拟进程代码表CodeLineItem及对应指令的运行时长的代码for(int i=0;iatoi(m_char5);i+
21、)TempArray2i=100;/memset(TempArray2,0,atoi(m_char5);for(int Const=atoi(m_char4)/2;Constatoi(m_char4);Const+)TempArray2temp1=Const;temp1+;for(Const=0;Constatoi(m_char4)/2;Const+)TempArray2temp2=Const;temp2+;以上是产生指令逻辑地址的经扩充功能后的随机函数for(Const=0;Constatoi(m_char5);Const+)if(TempArray2Const=100)TempArray2
22、Const=rand()%atoi(m_char4);Loop:for(int CodeLine=0;CodeLineatoi(m_char5);CodeLine+)TempNum2=(rand()%2)+1;TempNum1+=TempNum2;TempArray1CodeLine=TempNum2;if(TempNum1!=atoi(m_char6)TempNum1=0;goto Loop;for(CodeLine=0;CodeLineatoi(m_char5);CodeLine+)m_code.ICCodeLineItem(TempArray2CodeLine,TempArray1Cod
23、eLine);m_pcbm_count-1.SimulCodeList.Add(m_code);/m_code.ICCodeLineItem(1000,1000);/m_pcb.SimulCodeList.Add(m_code);m_CodeLine=m_FrameNum;for(int Page=0;Pagem_FrameNum;Page+)m_PageItem.ICPageTableItem(1,8+Page,m_pcbm_count-1.SimulCodeListPage.LogicalAddress);m_pcbm_count-1.PageTableAddress.Add(m_Page
24、Item);以上是产生指令运行时长的经功能扩充后的代码。6.效果显示部分for(Page=0;PageSetWindowText(ch5);GetDlgItem(1009+Page)-SetWindowText(1);GetDlgItem(1017+Page)-SetWindowText(ch4);for(Page=0;PageSetWindowText(0);for(Page=m_FrameNum;PageSetWindowText(-);GetDlgItem(1017+Page)-SetWindowText(-);以上是初始化界面的代码,通过获取对话框上的项的ID号来对其进行着色,为了方便
25、我将一些控件的ID号直接设成数字,这样更方便些。以下是动态着色显示部分的代码:HBRUSH COSDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor);/ TODO: Change any attributes of the DC hereif(IsPcbDelete=false)if(pWnd-GetDlgCtrlID()=100|pWnd-GetDlgCtrlID()=101|pWnd-GetDlgCtrlID()=102|pWnd
26、-GetDlgCtrlID()=103|pWnd-GetDlgCtrlID()=104|pWnd-GetDlgCtrlID()=105|pWnd-GetDlgCtrlID()=106|pWnd-GetDlgCtrlID()=107)pDC-SetBkMode(TRANSPARENT);return m_Brush0;if(m_count=1)for(int i=0;iGetDlgCtrlID()=108+i)pDC-SetBkMode(TRANSPARENT);return m_Brush1;if(m_count=2)for(int i=0;iGetDlgCtrlID()=m_Progress
27、Num+i)pDC-SetBkMode(TRANSPARENT);return m_Brush2;if(m_count=3)for(int i=0;iGetDlgCtrlID()=m_ProgressNum+i)pDC-SetBkMode(TRANSPARENT);return m_Brush3;if(m_count=4)for(int i=0;iGetDlgCtrlID()=m_ProgressNum+i)pDC-SetBkMode(TRANSPARENT);return m_Brush4;if(m_count=5)for(int i=0;iGetDlgCtrlID()=m_Progress
28、Num+i)pDC-SetBkMode(TRANSPARENT);return m_Brush5;if(m_count=6)for(int i=0;iGetDlgCtrlID()=m_ProgressNum+i)pDC-SetBkMode(TRANSPARENT);return m_Brush6;if(m_count=7)for(int i=0;iGetDlgCtrlID()=m_ProgressNum+i)pDC-SetBkMode(TRANSPARENT);return m_Brush7;if(m_count=8 & m_ProgressNum132)for(int i=0;iGetDlg
29、CtrlID()=m_ProgressNum+i)pDC-SetBkMode(TRANSPARENT);return m_Brush8;if(m_count=1)m_Progress1.SetInactiveBgColor(RGB(34,34,43);m_Progress1.SetInactiveFgColor(RGB(255,0,0);m_Progress1.SetActiveBgColor(RGB(34,34,43);m_Progress1.SetActiveFgColor(RGB(255,255,145);if(m_count=2)m_Progress2.SetInactiveBgCol
30、or(RGB(10,50,10);m_Progress2.SetInactiveFgColor(RGB(255,0,0);m_Progress2.SetActiveBgColor(RGB(10,50,10);m_Progress2.SetActiveFgColor(RGB(255,255,145);if(m_count=3)m_Progress3.SetInactiveBgColor(RGB(150,67,43);m_Progress3.SetInactiveFgColor(RGB(255,0,0);m_Progress3.SetActiveBgColor(RGB(150,67,43);m_P
31、rogress3.SetActiveFgColor(RGB(255,255,145);if(m_count=4)m_Progress4.SetInactiveBgColor(RGB(210,161,158);m_Progress4.SetInactiveFgColor(RGB(255,0,0);m_Progress4.SetActiveBgColor(RGB(210,161,158);m_Progress4.SetActiveFgColor(RGB(255,255,145);if(m_count=5)m_Progress5.SetInactiveBgColor(RGB(12,190,254);
32、m_Progress5.SetInactiveFgColor(RGB(255,0,0);m_Progress5.SetActiveBgColor(RGB(12,190,254);m_Progress5.SetActiveFgColor(RGB(255,255,145);if(m_count=6)m_Progress6.SetInactiveBgColor(RGB(75,23,115);m_Progress6.SetInactiveFgColor(RGB(255,0,0);m_Progress6.SetActiveBgColor(RGB(75,23,115);m_Progress6.SetAct
33、iveFgColor(RGB(255,255,145);if(m_count=7)m_Progress7.SetInactiveBgColor(RGB(178,250,100);m_Progress7.SetInactiveFgColor(RGB(255,0,0);m_Progress7.SetActiveBgColor(RGB(178,250,100);m_Progress7.SetActiveFgColor(RGB(255,255,145);if(m_count=8)m_Progress8.SetInactiveBgColor(RGB(66,97,78);m_Progress8.SetInactiveFgColor(RGB(255,0,0);m_Progress8.SetActiveBgColor(RGB(66,97,78);m_Progress8.SetActiveFgColor(RGB(255,255,145);if(IsPcbDelete=true)for(int i=0;iGetDlgCtrlID()=108+i)pDC-SetBkMode(TRANSPARENT);return hbr;/ TODO: Return a different brush if the default is not desiredreturn hb