




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统原理课程设计参考2010年12月课设的目的操作系统是计算机专业的一门专业课,也是计算机专业考研课程,但操作系统比较抽象,有的同学一学期完了都还很难理解进程、内存管理等一些概念和原理,操作系统课程设计的目的就是通过设计的实验,让同学们真正理解进程的实现,内存管理的机制,达到理解概念,了解实现原理。同时也进一步巩固程序设计与数据结构的实践技能,实现整个大学阶段实践技能不断线的目的。课设的故事一个操作系统采用请求页式管理方式来管理内存。当一个进程在运行中,随着进程的执行,它会不断的访问内存(代码执行、存取数据),这样就会提出内存访问请求。操作系统会根据用户进程提出的访存请求,来做地址变换,从而访问到用户进程想要访问的代码或数据。操作系统进行地址变换的过程中发现用户将要访问的地址所在的虚页还没有进入内存会自动将该虚页从磁盘中装入内存,再进行地址变换。当然若新的页调入内存之前,该进程所能使用的最大内存块数已经用完的话,操作系统就会从该进程已经在内存的那些页中根据先进先出的原则来淘汰掉一个页,腾出空间给将要正要请求访问的页。所以操作系统要记录每个进程的每个页面的状态,记录这些调入内存的页面的顺序,还要记录内存中各个块的使用情况。这些都是操作系统必需动态维护的数据,是操作系统的信息基础。现假设一个计算机系统有内存m KB,系统的页面大小为1KB,假设操作系统占用内存低端的n个块(nm/5),剩余的内存空间采用“随机+顺序”的方式来获取未用内存块,以分配给块请求程序。所谓“随机+顺序”的内存块分配方式就是用随机数来确定一个起始探测的开始块号,如果其已经被分配,则向下一块探测,如果还是已经分配,则继续下探,直到找到可用块,如果已经到内存的尾部则回到操作系统分界处继续下探。操作系统采用固定可用块数的方式给每个进程使用和分配内存块,并且规定最大内存块数为x,当某个进程已经用完了它的最大内存块数后就要淘汰页面了。模拟计算机系统允许最大并发进程数为y,假设目前进程数已经达到最大进程数。为了模拟某个进程,其所需的页面数z由随机数产生(m/10 z m/4),页面推进的过程采用随机数方式给出访存地址a,逻辑地址a应该在0到zKB-1之间,操作系统负责对逻辑地址a进行地址变换,并维护整个系统内存管理的所有数据结构,保证进程的顺利推进,使内存得以共享,实现虚拟存储器的功能。要求课设实现的系统能够配置上述参数,并按照配置参数的规模来系统的模拟系统的运行过程。希望可以可视化的展示系统内部的变化。课设的方案1构造页面、进程、内存管理所需的数据结构,动态管理系统中的有关信息。#define MAX_MEMORY_FRAME_COUNT 200 /最大允许设置的内存大小(以块为单位)class CPage : public CObject /逻辑页的信息DECLARE_DYNCREATE(CPage)public:CPage();bool bInMemoryFlag;/该页是否在内存int nFrameNo;/内存的快号int nDiskRelBlockNo;/磁盘的相对块号(可以随机给定)int nNextPageNo;/下一调进内存页的页号bool bModifiedFlag;/修改位(可以随机给定)/.;class CProcess : public CObject /进程的信息DECLARE_DYNCREATE(CProcess)public:CProcess();void InitProcessParameter(int no,int pagetotal,int runtime);int GetOneLogicalAddress();/得到下一要访问的页的页号void AddressMapping(int LogicalAddress);int nPID;/进程标识符char szProcessName20;/进程名int nControlNo;int nStatus;int nPageCountLogicalSpace;/逻辑地址空间的页数int nPageCountInMemory;/调入内存的页数int nRunTime;/运行时间(运行步数)int nPageNoHead;/调入内存的首页int nPageNoTail;/调入内存的末页/其他信息,如就绪或阻塞队列指针-自己可以根据自己的能力与爱好进一步完善下去CPage* PageTable;int MaxFrameCount;int GetOneRandDiskNo()/随机产生一个虚页在磁盘的相对块号return rand()%(1024*1024);CPage:CPage()bInMemoryFlag=0;/该页是否在内存nFrameNo=0;/内存的快号nDiskRelBlockNo=GetOneRandDiskNo();/磁盘的相对块号(可以随机给定)nNextPageNo=0;/下一调进内存页的页号bModifiedFlag=0;/修改位(可以随机给定)IMPLEMENT_DYNCREATE(CPage, CObject)CProcess:CProcess()nPID=(int)this;nPageCountInMemory=0;nStatus=0;nPageNoHead=0;nPageNoTail=0;PageTable=NULL;void CProcess:InitProcessParameter(int no,int pagetotal,int runtime)sprintf(szProcessName,ProcName%1d,no);/进程名nControlNo=no;nPageCountLogicalSpace=pagetotal;/逻辑地址空间的页数nRunTime=runtime;/运行时间(运行步数)PageTable=new CPagenPageCountLogicalSpace;/根据实际需要创建页表int CProcess:GetOneLogicalAddress()/得到下一要访问的页的页号int ran_num;ran_num=rand()%nPageCountLogicalSpace;return ran_num;void CProcess:AddressMapping(int LogicalAddress)int nIndexIn=LogicalAddress;/正在访问到的页的页号int nIndexOut;int nFrameNoReused;/if(PageTablenIndexIn.bInMemoryFlag=0)/未装入内存if(nPageCountInMemorynPageNoHead=nIndexIn;this-nPageNoTail=nIndexIn;elsePageTablenIndexIn.nNextPageNo=-1;/刚装入的页面的Next指针设为-1(终点)PageTablethis-nPageNoTail.nNextPageNo=nIndexIn;this-nPageNoTail=nIndexIn;nPageCountInMemory+;else /本进程使用的内存块数已达最大块数/淘汰一页nIndexOut=this-nPageNoHead;nFrameNoReused=PageTablenIndexOut.nFrameNo;/暂存被重用的内存块的块号this-nPageNoHead=PageTablenIndexOut.nNextPageNo;/把首页设到原来的第二个顺序页PageTablenIndexOut.nFrameNo = -1;/原来的页设成不在内存PageTablenIndexOut.bInMemoryFlag = false;PageTablenIndexIn.nFrameNo = nFrameNoReused;/访问页装入腾出的块PageTablenIndexIn.bInMemoryFlag = true;/设为“已装入”PageTablenIndexIn.nNextPageNo=-1;/刚访问的页面的Next指针设为-1(终点)PageTablethis-nPageNoTail.nNextPageNo=nIndexIn;/附加到链表this-nPageNoTail=nIndexIn;/设置为新的“链尾”/设置内存映像的显示串/ 。else /访问地址对应的页已在内存/直接访问2 设计使用上述数据结构来实现请求分页模拟系统下面的例子是用VC的对话框应用程序来实现的测试或应用系统模型。进程的推进由windows 的线程来模拟的,这里进程的内容是由随机数产生运行轨迹。int COsExamDlg:m_sMemoryFrameCount=120;int COsExamDlg:m_sOsFrameCount=40;bool bMemoryBitmapMAX_MEMORY_FRAME_COUNT;/内存空间管理的位示图CString csMemoryBitmap; /用于显示内存使用情况的字符串int GetOneLogicalAddress()return 0;UINT BarryProcessThreadProc (LPVOID pParam) /模拟进程的线程函数 CProcess *pProcess = (CProcess*)pParam; if(pProcess = NULL | !pProcess-IsKindOf(RUNTIME_CLASS(CProcess) return 1; /如果pObject无效,则返回1/添加执行代码CString csOutputInfo=;int i;int LA;for(i=0;inRunTime;i+)/执行每个操作步/随机产生一个访问地址 LA=GetOneLogicalAddress();/地址变换-改变数据结构,改变用户界面 pProcess-AddressMapping(LA);csOutputInfo+=M;/构造显示页表信息的串CWnd* pMainWnd;pMainWnd=AfxGetMainWnd();switch(pProcess-nControlNo)case 0:pMainWnd-GetDlgItem(IDC_STATIC_PROCESS0)-SetWindowText(csOutputInfo);break;case 1:pMainWnd-GetDlgItem(IDC_STATIC_PROCESS1)-SetWindowText(csOutputInfo);break;case 2:pMainWnd-GetDlgItem(IDC_STATIC_PROCESS2)-SetWindowText(csOutputInfo);break;case 3:pMainWnd-GetDlgItem(IDC_STATIC_PROCESS3)-SetWindowText(csOutputInfo);break;/延时Sleep(1000);return 0; /thread completed successfully!CProcess* ProcessPool;void COsExamDlg:OsInitialization()int i;csMemoryBitmap=;for(i=0;iLoadIcon(IDR_MAINFRAME);m_nProcessCount = 3;m_nMaxFrameForOneProcess=16;m_nMemoryFrameCount = 64;m_nOsFrameCount = 16;void COsExamDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(COsExamDlg)DDX_Text(pDX, IDC_EDIT_PROCESS_COUNT, m_nProcessCount);DDX_Text(pDX, IDC_EDIT_MEMORY_FRAME_COUNT, m_nMemoryFrameCount);DDV_MinMaxInt(pDX, m_nMemoryFrameCount, 64, 128);DDX_Text(pDX, IDC_EDIT_OS_FRAME_COUNT, m_nOsFrameCount);DDV_MinMaxInt(pDX, m_nOsFrameCount, 16, 32);DDX_Text(pDX, IDC_EDIT_MAX_FRAME_COUNT_PER_PROCESS, m_nMaxFrameForOneProcess);DDV_MinMaxInt(pDX, m_nMaxFrameForOneProcess, 4, 16);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(COsExamDlg, CDialog)/AFX_MSG_MAP(COsExamDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_ACCEPT, OnButtonAccept)ON_BN_CLICKED(IDC_BUTTON_SIMU, OnButtonSimu)/AFX_MSG_MAPEND_MESSAGE_MAP()/ COsExamDlg message handlersBOOL COsExamDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization hereGetDlgItem(IDC_EDIT_PAGE_COUNT0)-SetWindowText(12);GetDlgItem(IDC_EDIT_PAGE_COUNT0)-SetWindowText(12);GetDlgItem(IDC_EDIT_RUN_TIME0)-SetWindowText(12);GetDlgItem(IDC_EDIT_PAGE_COUNT1)-SetWindowText(8);GetDlgItem(IDC_EDIT_RUN_TIME1)-SetWindowText(12);GetDlgItem(IDC_EDIT_PAGE_COUNT2)-SetWindowText(16);GetDlgItem(IDC_EDIT_RUN_TIME2)-SetWindowText(12);GetDlgItem(IDC_EDIT_PAGE_COUNT3)-SetWindowText(9);GetDlgItem(IDC_EDIT_RUN_TIME3)-SetWindowText(12);srand(time(0);return TRUE; / return TRUE unless you set the focus to a controlvoid COsExamDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code below/ to draw the icon. For MFC applications using the document/view model,/ this is automatically done for you by the framework.void COsExamDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/ The system calls this to obtain the cursor to display while the user drags/ the minimized window.HCURSOR COsExamDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void COsExamDlg:OnButtonAccept() / TODO: Add your control notification handler code hereUpdateData(true);int i,j;CStatic* pStatic1,* pStatic2;CEdit* pEdit1,*pEdit2;char szContent100;CRect rect;CString csInfo;CPoint point;CSize size;int PageTotal;for(i=0;i4;i+)switch(i)case 0:pStatic1=(CStatic* )GetDlgItem(IDC_STATIC_0);pEdit1=(CEdit*)GetDlgItem(IDC_EDIT_PAGE_COUNT0);pEdit2=(CEdit*)GetDlgItem(IDC_EDIT_RUN_TIME0);pStatic2=(CStatic* )GetDlgItem(IDC_STATIC_PROCESS0);break;case 1:pStatic1=(CStatic* )GetDlgItem(IDC_STATIC_1);pEdit1=(CEdit*)GetDlgItem(IDC_EDIT_PAGE_COUNT1);pEdit2=(CEdit*)GetDlgItem(IDC_EDIT_RUN_TIME1);pStatic2=(CStatic* )GetDlgItem(IDC_STATIC_PROCESS1);break;case 2:pStatic1=(CStatic* )GetDlgItem(IDC_STATIC_2);pEdit1=(CEdit*)GetDlgItem(IDC_EDIT_PAGE_COUNT2);pEdit2=(CEdit*)GetDlgItem(IDC_EDIT_RUN_TIME2);pStatic2=(CStatic* )GetDlgItem(IDC_STATIC_PROCESS2);break;case 3:pStatic1=(CStatic* )GetDlgItem(IDC_STATIC_3);pEdit1=(CEdit*)GetDlgItem(IDC_EDIT_PAGE_COUNT3);pEdit2=(CEdit*)GetDlgItem(IDC_EDIT_RUN_TIME3);pStatic2=(CStatic* )GetDlgItem(IDC_STATIC_PROCESS3);break;if(iEnableWindow(true);pEdit1-EnableWindow(true);pEdit2-EnableWindow(true);pStatic2-EnableWindow(true);this-GetWindowRect(&rect);point.x=rect.left;point.y=rect.top;csInfo=;pEdit1-GetWindowText(szContent,200);PageTotal=atoi(szContent);for(j=0;jGetDC()-GetTextExtent(csInfo);pStatic2-GetWindowRect(&rect);ScreenToClient(&rect);/pStatic2-MoveWindow(rect.left,rect.top,size.cx,size.cy, true);pStatic2-SetWindowText(csInfo);elsepStatic1-ShowWindow(SW_HIDE);pEdit1-ShowWindow(SW_HIDE);pEdit2-ShowWindow(SW_HIDE);pStatic2-ShowWindow(SW_HIDE);m_sMemoryFrameCount=m_nMemoryFrameCount;m_sOsFrameCount=m_nMemoryFrameCount;void COsExamDlg:OnButtonSimu() / TODO: Add your control notification handler code here/CProcess*pNewProcess = new CProcess;ProcessPool=new CProcessm_nProcessCount;char szContent100;int i;int PageTotal,RunTime;for(i=0;iGetWindowText(szContent,200);PageTotal=atoi(szContent);GetDlgItem(IDC_EDIT_RUN_TIME0)-GetWindowText(szContent,200);RunTime=atoi(szContent);ProcessPooli.InitProcessParameter(0,PageTotal,RunTime);AfxBeginThread(BarryProcessThreadProc, &ProcessPooli);break;case 1:GetDlgItem(IDC_EDIT_PAGE_COUNT1)-GetWindowText(szContent,200);PageTotal=atoi(szContent);GetDlgItem(IDC_EDIT_RUN_TIME1)-GetWindowText(szContent,200);RunTime=atoi(szContent);ProcessPooli.InitProcessParameter(1,PageTotal,RunTime);AfxBeginThread(BarryProcessTh
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全国甘肃版信息技术六年级下册新授课 第11课聆听你的声音 教学设计
- 六、有教无类教学设计-2025-2026学年高中语文人教版选修先秦诸子选读-人教版
- 人教版高中化学选修3导学案第一章第1、2、3三课时第一节原子结构教学设计
- 2025年中考化学试题分类汇编:溶液(第2期)原卷版
- 蓄电池相关知识培训内容课件
- 2.1 计算机解决问题的过程 教学设计 2023-2024学年高中信息技术教科版(2019)必修1
- 2025年标准礼仪试题及答案
- 2025年北京市高考物理试卷(附答案)
- Unit 5 Wonders of Our Body教学设计-2025-2026学年高中英语高二下册重庆大学版
- 2025-2026学年地质版(2024)小学体育与健康二年级全一册《关注眼睛健康》教学设计
- 少儿跳绳培训班课程体系
- 教学质量分析与教学反思改进教学
- 德育工作培训课件
- 碳纤维行业培训课件
- 口腔护理教学课件设计与实施要点
- 中医诊所安全管理制度
- 2024年海南三亚市海棠区机关事业单位招聘笔试高频难、易错点备考题库及参考答案详解
- 肝脏的解剖和分段分叶
- 耳石症诊断与治疗讲课件
- 空管招聘面试题及答案
- 校外集体配餐管理制度
评论
0/150
提交评论