版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 目录第一章 概述11.1 需求分析11.2背景设计1第二章 概要设计2第三章 详细设计43.1高响应比调度算法43.2时间片轮转法53.3短进程优先法7第四章 调试分析与测试结果9第五章 总结13第六章 参考文献14第七章 附录15第一章 概述1.1 需求分析进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C语言编写一个进程调度模拟程序,使用短作业优先调度算法,高响应比调度算法,时间片轮转调度算法实现进程调度。可以手动阻塞与唤醒。并用MFC实现图形界面。本实验可加深对进程调度算法的理解。1.2背景设计在OS中,调度的实质是一种资源分配,调度算法即指:根据系统的资
2、源分配策略所规定的资源分配算法。对于不同的系统和系统目标,通常采用不同的调度算法,如在批处理系统中,为照顾为数众多的短作业,采用短作业有限调度算法;在分时系统中,为保证系统具有合理的响应时间,采用轮转法进行调度。采用算法时,则要考虑多方面因素,以便达到最佳效果。第二章 概要设计设计一个有多个进程共行的进程调度程序。进程调度算法:短作业优先调度算法,高响应比调度算法,时间片轮转调度算法每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、服务时间、进程状态等等。struct progressCString Name; /进程名称CString Start
3、;/创建时间int ServiceT;/服务时间int RunningT;/消逝时间int RemainT;/剩余时间int id;/进程标识符CProgressCtrl* pro;/指向进度条的指针int Rp;/进程成为就绪进程的时间float prio;/进程优先权;进程的优先权为:响应时间/要求服务时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪、执行、阻塞、完成。就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。当阻塞进程时,将当前运行的进程移动到阻塞队列,并从就绪队列将下个进程移动到进程执行区(本程序中就绪队列中第一个即为正在执行进程,后
4、文不再赘述)。当添加或唤醒进程时,将添加标记m_bchange置为真,并将进程添加进就绪队列。在运行一个时间片中,检查添加标记m_bchange是否为真,若为真,则判断单选框选中的算法,并按各自算法进行模拟调度,详见详细设计。当执行区进程完成时,将之移动到已完成的队列,并判断就绪队列中是否有进程:若有,则将下一个进程添加进就绪队列;若无,则弹出提示窗口。重复以上流程,直到用户退出。第三章 详细设计3.1高响应比调度算法该算法在添加标记m_bchange为真且单选框选中“高响应比优先”时调用,分别通过每个进程前的队列中进程RemainT之和除以该进程的ServiceT,求出优先级prio,并根据
5、prio重新为就绪队列排序。最后将m_bchange置为假。if ( m_bchange )if(iRadioButton=IDC_RADIO1)/计算优先级for (int i=1;iProNum;i+)float sum=0;for (int j=0;ji;j+)sum+=Proj.RemainT;Proi.prio=sum/Proi.ServiceT;/end for/根据优先级排序progress Tem;for ( i=0;iProNum-1;i+)for (int j=0;jProNum-1-i;j+)if (Proj.prioProj+1.prio)Tem=Proj+1;Proj
6、+1=Proj;Proj=Tem;m_bchange=false;/end 排序3.2时间片轮转法该算法在添加标记m_bchange为真且单选框选中“轮转调度”时调用,直接将就绪队列相邻2个进程两两互换,最终达到将正在执行进程放置于就绪队列后,并将下一个将要执行的进程开始执行,输出结果,并将m_bchange置为真,以便继续轮转。if(iRadioButton=IDC_RADIO2)progress Tem;for ( int i=0;iSetRange(0,Pro0.ServiceT);Pro0.RemainT-;Pro0.RunningT+;m_Zhixing.Format(标识符:%d
7、进程名称:%s 创建时间:%s 需要时间:%d秒 剩余时间:%d秒 已运行时间:%d秒 优先权:%frn, Pro0.id,Pro0.Name,Pro0.Start,Pro0.ServiceT,Pro0.RemainT,Pro0.RunningT,Pro0.prio);GetDlgItem(IDC_EDIT_Zhixing)-SetWindowText(m_Zhixing);P-SetPos(Pro0.RunningT);/end 排序3.3短进程优先法该算法在添加标记m_bchange为真且单选框选中“短进程优先”时调用,按照进程RemainT来重新排列队列顺序。最后将m_bc
8、hange置为假。if(iRadioButton=IDC_RADIO3)progress Tem;for (int i=0;iProNum-1;i+)for (int j=0;jProj+1.RemainT)Tem=Proj+1;Proj+1=Proj;Proj=Tem;rm_bchange=false;/end 排序第四章 调试分析与测试结果 高响应比优先算法 轮转调度算法 短进程优先算法 进程的阻塞与唤醒 差错控制第五章 总结通过此次课程设计,更深入的理解了各个进程调度算法,及实现过程。熟悉了MFC环境的使用。增进了VC编程的水平。对进程或作业先来先服务、短作业优先算法,最高响应比算法,高
9、优先权、按时间片轮转调度算法以及进程调度的概念和算法,有了更深入的认识!初步理解了操作系统对于作业处理的基本思想!并加深了我对于操作系统理论的理解。在此过程中,遇到了困难,能及时请教同学,查询相关资料,及时解决了问题,但仍有不足之处,将会在今后学习中更加努力。第六章 参考文献计算机操作系统(第三版)汤子瀛 西安电子科技大学出版社 操作系统教程方敏编 西安电子科技大学出版社 操作系统原理与实践教程周湘贞、曾宪权 清华出版社 数据结构(C语言版)严蔚敏 清华大学出版社深入浅出MFC(第2版)侯俊杰 华中科技大学出版社第七章 附录pcb1.cpp:#include stdafx.h#include
10、pcb1.h#include pcb1Dlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifBEGIN_MESSAGE_MAP(CPcb1App, CWinApp)ON_COMMAND(ID_HELP, CWinApp:OnHelp)END_MESSAGE_MAP()CPcb1App:CPcb1App()CPcb1App theApp;BOOL CPcb1App:InitInstance()AfxEnableControlContainer();#ifdef _AF
11、XDLLEnable3dControls();#elseEnable3dControlsStatic();#endifCPcb1Dlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)else if (nResponse = IDCANCEL)return FALSE;Pcb1.rc- IDD_PCB1_DIALOG:pcb1Dlg.cpp:#include stdafx.h#include pcb1.h#include pcb1Dlg.h#ifdef _DEBUG#define new DEBU
12、G_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifprogress Pro100; /就绪队列progress Zusai100; /阻塞队列static int ProNum=0; /用来表示第n就绪进程static int ZusaiNum=0; /用来表示第n阻塞进程static int id=0;int m_bchange;class CAboutDlg : public CDialogpublic:CAboutDlg();enum IDD = IDD_ABOUTBOX ;protected:virtual void D
13、oDataExchange(CDataExchange* pDX); protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()CPcb1Dlg:CPcb1Dlg(CWnd* pParent ): CDialog(CPcb1Dlg:IDD,
14、 pParent)m_Jincheng = _T();m_Jiuxu = _T();m_Wancheng = _T();m_Time = _T();m_Zhixing = _T();m_Zusai = _T();m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CPcb1Dlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Control(pDX, IDC_PROGRESS1, m_progress);DDX_Text(pDX, IDC_EDIT_Jinch
15、eng, m_Jincheng);DDX_Text(pDX, IDC_EDIT_Jiuxu, m_Jiuxu);DDX_Text(pDX, IDC_EDIT_Wancheng, m_Wancheng);DDX_Text(pDX, IDC_EDIT_Time, m_Time);DDX_Text(pDX, IDC_EDIT_Zhixing, m_Zhixing);DDX_Text(pDX, IDC_EDIT_Zusai, m_Zusai);BEGIN_MESSAGE_MAP(CPcb1Dlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDR
16、AGICON()ON_BN_CLICKED(IDC_BUTTON_Huanxiang, OnBUTTONHuanxiang)ON_BN_CLICKED(IDC_BUTTON_Qingkong, OnBUTTONQingkong)ON_BN_CLICKED(IDC_BUTTON_Tianjia, OnBUTTONTianjia)ON_BN_CLICKED(IDC_BUTTON_Zuisai, OnBUTTONZuisai)ON_WM_TIMER()END_MESSAGE_MAP()BOOL CPcb1Dlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(
17、IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);(CButton * )GetDlgItem( IDC_RADIO1 )-SetCheck( TRUE );return TRUE; void CPcb1Dlg:OnSysCommand(UINT nID, LPARAM
18、 lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CPcb1Dlg:OnPaint() if (IsIconic()CPaintDC dc(this); SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMet
19、rics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CPcb1Dlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;/唤醒按扭void CPcb1Dlg:OnBUTTONHuanxiang() if ( ZusaiNum=0 )Message
20、Box(阻塞队列为空,没有可唤醒的进程,温馨提示,MB_OK|MB_ICONINFORMATION);return; ProProNum=Zusai0;int atime=this-getArrTime();ProProNum.Rp=atime;ZusaiNum-; ProNum+;/阻塞的队列元素都前移一位for (int i=0;iZusaiNum;i+)Zusaii=Zusaii+1;/显示就绪m_Jiuxu.Empty();CString T;for (i=1;iSetWindowText(m_Jiuxu);/显示阻塞m_Zusai.Empty();for (i=0;iSetWindo
21、wText(m_Zusai);m_bchange=true;SetTimer(1,1000,NULL);/清空按扭void CPcb1Dlg:OnBUTTONQingkong() m_Wancheng.Empty();UpdateData(false);/添加按扭 void CPcb1Dlg:OnBUTTONTianjia() UpdateData(true); if ( m_Jincheng.IsEmpty() )MessageBox(请输入进程名称);GetDlgItem(IDC_EDIT_Jincheng)-SetFocus();return;if ( m_Time.IsEmpty()
22、)MessageBox(请输入服务时间);GetDlgItem(IDC_EDIT_Time)-SetFocus();return; int atime=this-getArrTime();ProProNum.Name=m_Jincheng;ProProN=&m_progress;ProProNum.RemainT=atoi(m_Time);ProProNum.ServiceT=atoi(m_Time);ProProNum.RunningT=0;ProProNum.Start=(CTime:GetCurrentTime().Format(%H:%M:%S);ProProNum.Rp=
23、atime;ProProNum.id=id+1;m_Jincheng.Empty();m_Time.Empty();UpdateData(false);id+;ProNum+; if(ProNum1) CString Temple=;for ( int i=1;iSetWindowText(m_Jiuxu); SetTimer(1,1000,NULL);m_bchange=true;/阻塞按扭void CPcb1Dlg:OnBUTTONZuisai() int i;if ( ProNum=0 )KillTimer(1);MessageBox(当前没有进程在执行,请添加或唤醒进程);return
24、;elseZusaiZusaiNum+=Pro0;m_Zusai.Empty();CString Temple=;/显示阻塞for ( i=0;iSetWindowText(m_Zusai);/更新进度条,将进程条和运行清空P-SetPos(0);GetDlgItem(IDC_EDIT_Zhixing)-SetWindowText(_T();ProNum-;if ( ProNumgetArrTime();/因为第一个元素空了,所以数组要前移double temp=0; double High; int highidex; for(i=1;i=temp)temp=High;high
25、idex=i;Pro0=Prohighidex;for ( i=highidex;iProNum;i+)Proi=Proi+1;for (i=highidex;iSetRange(0,Pro0.ServiceT);Pro0.RemainT-;Pro0.RunningT+;m_Zhixing.Format(标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒 剩余时间:%d秒 已运行时间:%d秒 优先权:%frn, Pro0.id,Pro0.Name,Pro0.Start,Pro0.ServiceT,Pro0.RemainT,Pro0.RunningT,Pro0.prio);GetDl
26、gItem(IDC_EDIT_Zhixing)-SetWindowText(m_Zhixing);P-SetPos(Pro0.RunningT);/如果添加了新的成员,重新排序 if ( m_bchange )if(iRadioButton=IDC_RADIO1)/计算优先级for (int i=1;iProNum;i+)float sum=0;for (int j=0;ji;j+)sum+=Proj.RemainT;Proi.prio=sum/Proi.ServiceT;/end for/根据优先级排序progress Tem;for ( i=0;iProNum-1;i+)fo
27、r (int j=0;jProNum-1-i;j+)if (Proj.prioProj+1.prio)Tem=Proj+1;Proj+1=Proj;Proj=Tem;m_bchange=false;/end 排序if(iRadioButton=IDC_RADIO2)progress Tem;for ( int i=0;iSetRange(0,Pro0.ServiceT);Pro0.RemainT-;Pro0.RunningT+;m_Zhixing.Format(标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒 剩余时间:%d秒 已运行时间:%d秒 优先权:%frn, Pro0.i
28、d,Pro0.Name,Pro0.Start,Pro0.ServiceT,Pro0.RemainT,Pro0.RunningT,Pro0.prio);GetDlgItem(IDC_EDIT_Zhixing)-SetWindowText(m_Zhixing);P-SetPos(Pro0.RunningT);/end 排序if(iRadioButton=IDC_RADIO3)progress Tem;for (int i=0;iProNum-1;i+)for (int j=0;jProj+1.RemainT)Tem=Proj+1;Proj+1=Proj;Proj=Tem;m_bcha
29、nge=false;/end 排序/如果已经完成if ( Pro0.RemainTSetPos(0);UpdateData(false);GetDlgItem(IDC_EDIT_Wancheng)-SetWindowText(m_Wancheng);/如果没有就绪的进程if( ProNum=0 )KillTimer(1);GetDlgItem(IDC_EDIT_Zhixing)-SetWindowText(_T();MessageBox(当前没有进程在执行,请添加或唤醒进程!);/还有就绪的进程elseint i;int atime=this-getArrTime();/因为第一个元素空了,所
30、以数组要前移double temp=0; double High; int highidex; for(i=1;i=temp)temp=High;highidex=i;Pro0=Prohighidex;for ( i=highidex;iProNum;i+)Proi=Proi+1;CString Temple=;for ( i=1;iSetWindowText(m_Jiuxu);m_bchange=true;/end 完成m_Jiuxu=;CString Temple=;for ( int i=1;iSetWindowText(m_Jiuxu);CDialog:OnTimer(nIDEvent
31、);StdAfx.cpp:#include stdafx.hpcb1.h:#if !defined(AFX_PCB1_H_D0EC9916_5956_47D0_A87D_BF26EFBECAD7_INCLUDED_)#define AFX_PCB1_H_D0EC9916_5956_47D0_A87D_BF26EFBECAD7_INCLUDED_#if _MSC_VER 1000#pragma once#endif #ifndef _AFXWIN_H_#error include stdafx.h before including this file for PCH#endif#include
32、resource.hclass CPcb1App : public CWinApppublic:CPcb1App();public:virtual BOOL InitInstance();DECLARE_MESSAGE_MAP();#endifpcb1Dlg.h:#if !defined(AFX_PCB1DLG_H_85A9A06E_CC92_4F5B_B772_4E1D184B7433_INCLUDED_)#define AFX_PCB1DLG_H_85A9A06E_CC92_4F5B_B772_4E1D184B7433_INCLUDED_#if _MSC_VER 1000#pragma o
33、nce#endif struct progressCString Name; /进程名称CString Start;/创建时间int ServiceT;/服务时间int RunningT;/消逝时间int RemainT;/剩余时间int id;/进程标识符CProgressCtrl* pro;/指向进度条的指针int Rp;/进程成为就绪进程的时间float prio;/进程优先权;class CPcb1Dlg : public CDialogpublic:int getArrTime();CPcb1Dlg(CWnd* pParent = NULL);enum IDD = IDD_PCB1_
34、DIALOG ;CProgressCtrlm_progress;CStringm_Jincheng;CStringm_Jiuxu;CStringm_Wancheng;CStringm_Time;CStringm_Zhixing;CStringm_Zusai;protected:virtual void DoDataExchange(CDataExchange* pDX);protected:HICON m_hIcon;virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnBUTTONHuanxiang();afx_msg void OnBUTTONQingkong();afx_msg void OnBUTTONTianjia();afx_msg void OnBUTTONZuisai();afx_msg void OnTimer(UINT nIDEvent);DECLARE_MESSAGE_MAP();#endifResource.h:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理安全事件预防体系
- 护理信息系统的项目管理和实施
- 护理基本护理经济学
- 北京病人护理老年护理
- 旅游公司策划部经理面试手册
- 零售业面俱到:如何准备熟食部招聘面试
- 旅游行业酒店管理岗位求职全解析
- 快速消费品公司高层管理面试解析
- 联想集团财务岗位面试要点解析
- 旅游公司客户服务经理面试要点
- 一例肺炎患者的个案护理
- 文明实践健康义诊活动策划
- 2025年内蒙古自治区中考物理试题(原卷版)
- 2024司法考试试题及答案
- 2025年山西省中考英语试卷真题(含答案详解)
- 《肾功能及尿液检查》课件
- 中国石油企业文化课件
- 电力工程建设资源投入计划
- 生物批签发管理办法
- 《酒店法律与法规实务》全套教学课件
- 高分子化学教材第七章逐步聚合反应
评论
0/150
提交评论