ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:649.05KB ,
资源ID:8361659      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8361659.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(进程调度操作系统课程设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

进程调度操作系统课程设计.docx

1、进程调度操作系统课程设计一课程概述1.1.设计构想程序能够完成以下操作:1、创建进程。2、修改进程的优先级、创建时间、服务时间。3、启动进程算法,先来先服务、时间片轮转、高优先级优先调度。4、进程运行状态显示。1.2.需求分析在多道程序环境下,主存中有着多个进程,其数目往往多于处理机数目,要使这多个进程能够并发地执行,这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之执行。分配处理机的任务是由处理机调度程序完成的。由于处理机是最重要的计算机资源,提高处理机的利用率及改善系统必(吞吐量、响应时间),在很大程度上取决于处理机调度性能的好坏,因而,处理机调度便成为操作系统设计的

2、中心问题之一。本次实验在vs2010环境下实现先来先服务调度算法,时间片轮转调度算法和高优先权调度算法。1.3.理论依据为了描述和管制进程的运行,系统为每个进程定义了一个数据结构进程控制块PCB(ProcessControlBlock),PCB中记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息,系统总是通过PCB对进程进行控制,亦即,系统是根据进程的PCB而不是任何别的什么而感知进程的存在的,PCB是进程存在的惟一标志。本次课程设计用结构体ProNode代替PCB的功能。1.4.课程任务1、用C语言(或C+)编程实现操作模拟操作系统进程调度子系统的基本功能;运用多种算法实

3、现对进程的模拟调度。2、通过编写程序实现进程或作业先来先服务、按时间片轮转、高优先权,使学生进一步掌握进程调度的概念和算法,加深对处理机分配的理解。3、用MFC实现程序界面。1.5.功能模块分析:1、进程概念:进程是被独立分配资源的最小单位。进程是动态概念,必须程序运行才有进程的产生。2、进程的状态模型:(1)完成:进程已经完成。(2)就绪:进程已经准备好,一旦有处理器就可运行。3、处理机调度:在多道程序设计系统中,内存中有多道程序运行,他们相互争夺处理机这一重要的资源。处理机调度就是从就绪队列中,按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程并发地执行。 4、进程调度算法的功能

4、:记录系统中所有进程的执行情况、选择占有处理机的进程、进行进程的上下文切换。5、进程调度的算法:(1)先来先服务算法:如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务总是把当前处于就绪队列之首的那个进程调度到运行状态。(2)时间片轮转算法:固定时间片,每个进程在执行一个时间片后,轮到下一进程执行,知道所有的进程执行完毕。处理器同一个时间只能处理一个任务。处理器在处理多任务的时候,就要看请求的时间顺序,如果时间一致,就要进行预测。挑到一个任务后,需要若干步骤才能做完,这些步骤中有些需要处理器参与,有些不需要(如磁盘控制器的存储过程)。不需要处理器处理的时候,这部

5、分时间就要分配给其他的进程。原来的进程就要处于等待的时间段上。经过周密分配时间,宏观上就象是多个任务一起运行一样,但微观上是有先后的,就是时间轮换。(3)优先数算法:即进程的执行顺序由高优先级到低优先级。系统或用户按某种原则为进程指定一个优先级来表示该进程所享有的确调度优先权。该算法核心是确定进程的优先级。二总体方案设计2.1程序结构程序一共添加了4个线程,分别是保存修改线程,先来先服务线程,时间片轮转线程,高优先权优先服务线程。图2.1程序结构图三详细设计3.1.界面设计图3.1界面设计3.1.1.进程属性控制图3.1.1.进程属性控制3.1.2.进程算法图3.1.2.进程算法3.1.3.进

6、程运行状态显示.图3.1.2.进程算法3.1.4.设置停顿时间图3.1.4设置停顿时间3.1.4.1相关类及其主要函数class SetTime : public CDialogEx DECLARE_DYNAMIC(SetTime)public: SetTime(CWnd* pParent = NULL); / 标准构造函数 virtual SetTime();/ 对话框数据 enum IDD = IDD_SETTIME ;protected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持 DECLARE_MESSA

7、GE_MAP()public: int m_time;SetTime:SetTime(CWnd* pParent /*=NULL*/) : CDialogEx(SetTime:IDD, pParent) , m_time(3)3.1.5.设置时间片图3.1.5设置时间片3.1.5.1相关类及其主要函数class Seep : public CDialogEx DECLARE_DYNAMIC(Seep)public: Seep(CWnd* pParent = NULL); / 标准构造函数 virtual Seep();/ 对话框数据 enum IDD = IDD_SLEEP ;protecte

8、d: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持 DECLARE_MESSAGE_MAP()public: int m_sleep;3.1.6.菜单图3.1.5设置时间片3.1.6.1保存输入框修改void CprogressDlg:OnSave() CWinThread *MainStartThread; LPVOID lmainparam = (LPVOID)this;/把this指针作为参数传进去 MainStartThread=:AfxBeginThread( ThreadFuncSave, (LPVOID

9、)lmainparam, THREAD_PRIORITY_NORMAL, 0, 0, NULL );3.1.6.2设置时间片大小void CprogressDlg:OnSetrr() SetTime dlg; if( dlg.DoModal() = IDOK) m_timerr = dlg.m_time; 3.1.6.3设置停顿时间void CprogressDlg:OnSeeptime() Seep dlg; if(dlg.DoModal() = IDOK) m_sleep = dlg.m_sleep; 3.2.先来先服务调度3.2.1算法思想先来先服务调度算法的思想是按照进程进入就绪队列的

10、先后顺序调度并分配处理机执行。先来先服务调度算法是一种不可抢占的算法,先进入就绪队列的进程,先被处理机运行。一旦一个进程占有了处理机,它就一直运行下去,直到该进程完成工作或者因为等待某事件而不能继续运行时才释放处理机。3.2.2.算法代码void CprogressDlg:FCFS(void) int i=0,j; CreateTimeArray();/创建时间数组 while(!IsFinish() /找出已创建的进程 while(!IsCreate(m_timei) | m_pronodem_timei.prostate = FINISH) +i; if(i=5) m_systime +=

11、 1; i=0; ProShow();/更新进程运行状态 /进程服务 for(j=0; j=5) m_systime += 1; i=0; ProShow();/更新进程运行状态 /进程服务 for(int r=0; r=5) i=0; 3.4.优先级调度3.4.1.算法思想进程的执行顺序由高优先级到低优先级,系统或用户按某种原则为进程指定一个优先级来表示该进程所享有的确调度优先权。该算法核心是确定进程的优先级。3.4.2算法流程图 图3.4.优先级调度流程图3.4.3.程序代码void CprogressDlg:HPHS(void) int i=0; CreateProArray();/创建

12、时间数组 while(!IsFinish() i=0; /找出已创建的进程 while(!IsCreate(m_proi) | m_pronodem_proi.prostate = FINISH) +i; if(i=5) m_systime += 1; i=0; ProShow();/更新进程运行状态 /进程服务 for(int r=0; rSetRange32(0,ser); proset-SetStep(1); proset-SetPos(0);3.5.2.创建进程PBC 图3.5.2创建进程PBC流程图void CprogressDlg:CreatePro(void) int pro,c

13、re,ser; m_systime = 0; for (int i=0; iSetWindowTextW(str); m_proctrl2.SetPos(m_pronode1.finishpart); str.Format(_T(%d),m_pronode1.finishpart); GetDlgItem(IDC_STATIC2)-SetWindowTextW(str); m_proctrl3.SetPos(m_pronode2.finishpart); str.Format(_T(%d),m_pronode2.finishpart); GetDlgItem(IDC_STATIC3)-SetW

14、indowTextW(str); m_proctrl4.SetPos(m_pronode3.finishpart); str.Format(_T(%d),m_pronode3.finishpart); GetDlgItem(IDC_STATIC4)-SetWindowTextW(str); m_proctrl5.SetPos(m_pronode4.finishpart); str.Format(_T(%d),m_pronode4.finishpart); GetDlgItem(IDC_STATIC5)-SetWindowTextW(str); str.Format(_T(运行时间:%d),m_

15、systime); GetDlgItem(IDC_STATIC6)-SetWindowTextW(str); Sleep(m_sleep);3.5.4.判断当前进程是否创建BOOL CprogressDlg:IsCreate(int index) if(m_pronodeindex.createtimem_systime) return FALSE; else return TRUE;3.5.5.创建时间队列图3.5.5创建时间队列流程图void CprogressDlg:CreateTimeArray(void) int time = 100,s; for(int j=0; j5; +j)

16、for(int i=0; i5; +i) if(m_pronodei.createtimetime & m_pronodei.rr=-1) time=m_pronodei.createtime; s=i; m_pronodes.rr = 0; m_timej=s; time = 100; 3.5.6.判断所有进程是否完成BOOL CprogressDlg:IsFinish(void) int pronum = 5,i; /是否所有进程完成 for(i=0; i5; +i) if(m_pronodei.prostate) = FINISH) pronum -= 1; if(pronum != 0

17、) return FALSE; Else return TRUE; 3.5.7.创建优先权队列图3.5.7创建优先权队列流程图void CprogressDlg:CreateProArray(void) int pro = 100,s=0; for(int j=0; j5; +j) for(int i=0; i5; +i) if(m_pronodei.proCreatePro(); dlg-FCFS(); criticalSection.Unlock(); return 0;3.5.9.时间片轮转线程函数UINT ThreadFuncRR(LPVOID lp) criticalSection.

18、Lock(); CprogressDlg * dlg; dlg = (CprogressDlg *)lp; dlg-CreatePro(); dlg-RR(); criticalSection.Unlock(); return 0;3.5.10.高优先级线程函数UINT ThreadFuncHPHS(LPVOID lp) criticalSection.Lock(); CprogressDlg * dlg; dlg = (CprogressDlg *)lp; dlg-CreatePro(); dlg-HPHS(); criticalSection.Unlock(); return 0;3.5.

19、11.保存输入框修改线程函数UINT ThreadFuncSave(LPVOID lp) criticalSection.Lock(); CprogressDlg * dlg; dlg = (CprogressDlg *)lp; dlg-Save(); dlg-MessageBox(_T(修改成功!),_T(提示),MB_OK); criticalSection.Unlock(); return 0;3.5.12.保存输入框修改void CprogressDlg:Save(void) SendMessage(UM_MYUPDATEDATA,TRUE); ProSet(&m_proctrl1,m

20、_ser1); ProSet(&m_proctrl2,m_ser2); ProSet(&m_proctrl3,m_ser3); ProSet(&m_proctrl4,m_ser4); ProSet(&m_proctrl5,m_ser5); GetDlgItem(IDC_STATIC1)-SetWindowTextW(_T(0); GetDlgItem(IDC_STATIC2)-SetWindowTextW(_T(0); GetDlgItem(IDC_STATIC3)-SetWindowTextW(_T(0); GetDlgItem(IDC_STATIC4)-SetWindowTextW(_T(

21、0); GetDlgItem(IDC_STATIC5)-SetWindowTextW(_T(0); GetDlgItem(IDC_STATIC6)-SetWindowTextW(_T(运行时间:0);3.5.13.子线程向主线程发送消息afx_msg LRESULT CprogressDlg:OnUmMyupdatedata(WPARAM wParam, LPARAM lParam) UpdateData(wParam); return 0;四程序的调试与运行结果说明4.1.界面4.1.1问题1程序界面出现“卡死”现象原因,当程序只有一个主线程的时候,程序只有完成当前操作的时候才会执行下一个操

22、作任务。解决办法,分别添加四个线程,分别是保存修改线程,先来先服务线程,时间片轮转线程,高优先权优先服务线程。图4.1.1界面调试4.2.先来先服务调度4.2.1问题1无法正确按照时间先后顺序调用线程。原因是直接修改PCB队列会导致界面的实现比较困难,但是不修改又会导致无法正确调度进程或者需要更多的函数辅助,以便实现相应的功能。解决办法,创建时间队列,添加函数void CprogressDlg:CreateTimeArray(void)图4.2.先来先服务调度调试4.3.时间片轮转调度4.3.1问题1进程时间片结束还没有切换下一个线程。解决办法 修改该段代码 m_systime += 1; m_pronodem_timei.finishpart += 1; ProShow();/更新进程运行状态改成如下代码 if(m_pronodem_timei.finishpart = m_pronodem_timei.s

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

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