操作系统 课程设计 处理机调度 图形界面 完整报告
操作系统通用处理器调度演示程序课程设计总结报告
操作系统通用处理器调度演示程序课程设计总结报告【ModelViewController】(模型-视图-控制器)的设计模式,实现逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC是一种使用MVC(ModelViewController模型-视图-控制器)设计创建Web应用程序的模式:Model(模型)表示应用程序核心(比如数据库记录列表)。
View(视图)显示数据(数据库记录)。
Controller(控制器)处理输入(写入数据库记录)。
MVC模式同时提供了对HTML、CSS和JavaScript的完全控制。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。
例如,您可以在不依赖业务逻辑的情况下专注于视图设计。
同时也让应用程序的测试更加容易。
MVC分层同时也简化了分组开发。
不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
加深了对MVC设计模式的理解,对Java语言更加熟悉了,这是技术层面的事情,在文档编写方面我也学到了很多东西,比如如何让文档设计得更加正式,美观,对word的操作也更加熟练了。
通过本次模拟CPU调度算法,加深了我对操作系统的理解和认识,更加熟悉了调度算法和操作系统的功能结构,对以后深入学习计算机我相信会有很大的帮助。
八、参考文献[1](美)西尔伯查茨,(美)高尔文,(美)加根著译者:郑扣根OperatingSystemConceptsSeventh,Edition操作系统概念第七版(中文版).高等教育出版社.2010(01).[2]杭诚方,谈宏编.操作系统课程设计教程.上海交通大学出版社,2008.[3](美)BruceEckel著译者:陈昊鹏ThinkinginJavaJava编程思想.机械工业出版社.01-2006-3149.[4]严蔚敏吴伟明著.数据结构(C语言版).清华大学出版社.2007.[5](美)CliffordA.Shaffer 著.张铭刘晓丹等译.数据结构与算法分析(C++班)(第二版).电子工业出版社.2012-2(3).。
操作系统实验之处理机调度实验报告
操作系统实验之处理机调度实验报告一、实验目的处理机调度是操作系统中的核心功能之一,本次实验的主要目的是通过模拟不同的处理机调度算法,深入理解操作系统对处理机资源的分配和管理策略,比较不同调度算法的性能差异,并观察它们在不同负载情况下的表现。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 Python 38。
实验中使用了 Python 的相关库,如`numpy`、`matplotlib`等,用于数据生成、计算和图形绘制。
三、实验原理1、先来先服务(FCFS)调度算法先来先服务算法按照作业到达的先后顺序进行调度。
先到达的作业先被服务,直到完成或阻塞,然后再处理下一个到达的作业。
2、短作业优先(SJF)调度算法短作业优先算法选择预计运行时间最短的作业先执行。
这种算法可以有效地减少作业的平均等待时间,但可能导致长作业长时间等待。
3、时间片轮转(RR)调度算法时间片轮转算法将处理机的时间分成固定长度的时间片,每个作业轮流获得一个时间片的处理时间。
当时间片用完后,如果作业还未完成,则将其放入就绪队列的末尾等待下一轮调度。
4、优先级调度算法优先级调度算法为每个作业分配一个优先级,优先级高的作业先被执行。
优先级可以根据作业的性质、紧急程度等因素来确定。
四、实验内容与步骤1、数据生成首先,生成一组模拟的作业,包括作业的到达时间、预计运行时间和优先级等信息。
为了使实验结果更具代表性,生成了不同规模和特征的作业集合。
2、算法实现分别实现了先来先服务、短作业优先、时间片轮转和优先级调度这四种算法。
在实现过程中,严格按照算法的定义和规则进行处理机的分配和调度。
3、性能评估指标定义了以下性能评估指标来比较不同调度算法的效果:平均等待时间:作业在就绪队列中的等待时间的平均值。
平均周转时间:作业从到达系统到完成的时间间隔的平均值。
系统吞吐量:单位时间内完成的作业数量。
4、实验结果分析对每种调度算法进行多次实验,使用不同的作业集合,并记录相应的性能指标数据。
操作系统试验报告一处理机调度
实验课程名称:实验项目名称处理机调度 实验成绩实验者专业班级名且另IJ同组者实验日期年 月 日第一部分:实验分析与设计(可加页)一、 实验内容描述(问题域描述)实验目的:掌握处理机调度的相关内容,对进程调度算法有深入理解。
实验内容:模拟实现进程调度功能。
实验要求:1、任选一种高级语言实现;2、选择1-2种调度算法;3、能够输入进程的基本信息,如进程名、提交时间、预估运行时间等;4、根据选择的调度算法显示进程调度顺序;5、显示完成调度后每个进程的开始时间、完成时间呢、周转时间,带权周转时间;6、计算平均周转时间和平均带权周转时间。
二、 实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述) 数据结构:一个作业的描述结构: struct WORK {int num;//进程序号startTim;//开始时间 upTim;//提交时间 offTim;//结束时间 costTim;//耗费时间长度 Ti;//周转时间 Tr;//带权周转时间输出模块float floatfloat floatfloat float };功能说明:输入模块、输出模块:负责进程的输入及模拟结果的输出;处理机调度函数调用模块:选择调用算法完成进程调度;先入先出算法模拟模块、短进程优先算法模拟模块:实际完成模拟调度功能;相关时间计算模块:计算开始时间、结束时间,周转时间,带权周转时间。
三、主要仪器设备及耗材硬件:pc机;软件:windows2007旗舰版、VS 2010开发环境。
第二部分:实验调试与结果分析(可加页)一、实验源程序:# include <iostream>using namespace std;struct WORK{int num;//进程序号float startTim;//开始时间float upTimJ/提交时间float offTim;//结束时间float costTim;//耗费时间长度float Ti;〃周转时间float Tr;//带权周转时间};void FIFO(WORK *workspace,int workNum);void SJF(WORK *workspace,int workNum);void SUM(WORK *workspace,int workNum,float *T,float *W);int main(){int num;float upTim;float costTim;int workNum;cout<<"请输入需要被调度的作业的数目:"<<endl;cin>>workNum;WORK *workspace=new WORK[workNum];cout<<"请依次输入需要被调度的作业(输入格式:作业序号作业提交时间(用数字表示) 执行时间):"<<endl;int n=0;while(cin>>num>>upTim>>costTim && n<workNum){workspace[n].num=num;workspace[n].upTim=upTim;workspace[n].costTim=costTim;n++;}cin.clear();cin.sync();cout<<"作业序号\t作业提交时间\t执行时间):"<<endl;for(int i=0;i<workNum;i++) {cout<<workspace[i].num<<"\t\t"<<workspace[i].upTim<<"\t\t<<workspace[i].costTim<<endl;/****************** 选择算法,执行算法,结果输出*****************/int cho=0;float * T=new float[0],* W=new float[0];cout<<"请选择调度算法:"<<endl;cout<<0<<"--->FIFO\n"<<1<<"--->最短优先"<<endl;cin>>cho;switch(cho){case 0:FIFO(workspace,workNum);SUM(workspace,workNum,T,W);break;case 1:SJF(workspace,workNum);SUM(workspace,workNum,T,W);break;}cout<<"执行顺序"<<"\t"<<"提交时间"<<"\t"<<"执行时间"<<"\t"<<"开始时间"<<"\t"<<"结束时间"<<endl;for(int i=0;i<workNum;i++) {cout<<workspace[i].num<<"\t\t"<<workspace[i].upTim<<"\t\t"<<workspace[i].costTim <<"\t\t"<<workspace[i].startTim<<"\t\t"<<workspace[i].offTim<<endl;}cout<<"平均周转时间:"<<(*T)/workNum<<"\t 平均带权周转时间:"<<(*W)/workNum<<endl;system("PAUSE"); return 0;}void FIFO(WORK *workspace,int workNum)for(int i=0;i<workNum-1;i++) 〃按提交时间排序for(int j=0;j<workNum-1;j++)if(workspace[j].upTim>workspace[j+1].upTim) 〃大数沉底{WORK temp;temp=workspace[j+1];workspace[j+1]=workspace[j];workspace[j]=temp;}}void SJF(WORK *workspace,int workNum){float MinUptime=0;//最早的提交时间FIFO(workspace,workNum);//先按提交时间排序MinUptime=workspace[0].upTim+workspace[0].costTim;for(int i=0;i<workNum-1;i++) 〃按照最短的作业时间排序for(int j=1;j<workNum-1;j++){if(workspace[j].upTim<MinUptime&&workspace[j+1].upTim<MinUptime) {if(workspace[j].costTim>workspace[j+1].costTim) 〃提交时间大且耗时多的作业沉底{WORK temp;temp=workspace[j+1];workspace[j+1]=workspace[j]; workspace[j]=temp;}} else {MinUptime=workspace[j].upTim+workspace[j].costTim;//更新}}}void SUM(WORK *workspace,int workNum,float *T,float *W){*T=0;*W=0;for(int i=0;i<workNum;i++)//计算开始时间、结束时间,周转时间,带权周转时间{ if(i==0)//计算第一个作业{workspace[i].startTim=workspace[i].upTim;workspace[i].offTim=workspace[i].upTim+workspace[i].costTim;workspace[i].Ti=workspace[i].offTim-workspace[i].upTim;workspace[i].Tr=workspace[i].Ti/workspace[i].costTim;}else//计算第一个作业基础上的其他作业相关时间{if(workspace[i-1].offTim<workspace[i].upTim)workspace[i].startTim=workspace[i].upTim;elseworkspace[i].startTim=workspace[i-1].offTim;workspace[i].offTim=workspace[i].costTim+workspace[i].startTim; workspace[i].Ti=workspace[i].offTim-workspace[i].upTim; workspace[i].Tr=workspace[i].Ti/workspace[i].costTim; }*T+=workspace[i].Ti;//计算平均周转时间 *W+=workspace[i].Tr;//计算平均带权周转时间 } } 二、 实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)测试用例一结果:请依次前A 需要被洞度的作止:葡人格式;作出序号 执行时间M 1 10 2,眼糟翎要被调度的作业(输入格式:作业序号1 10 2作止提交升间1用道字表示)|2 10.2 1 1? 10a 4 0a 5 L 10a 5 0a 2■(此序]作业提父H J 闫 L 10Z 10.23 10.4k10.5青选择调度算法:0——>FIF0 i-—>最超优先 执行时间), 暨 1 0.5 0.3a 二顺序提交时间 执行时间开始时间结束时间1 10210 12,10.2i 12 13 卜 10.4 8.5 13 13.E 口 1Q.5 0.3平均周转时间.2.8 平均带权周转时间吗.26岛北旺京银继纨 -±3.513.8邛业序与 作北提交时、日h 1M 执行时间)।21«.2 13 10.4 0.5 MIB.E情选区调度算法,同——>FIF0 口一》最短优先 0.3执行顺序 提交时间1 10 执行时间 2开始时间10 结克时间 124IB.E 0.3 12 12.3 10.4 0.5 12.3 12.81M-21句周转时间:2.45平均带权周转时间:3.8512.JS13=8日数据细撷处理机调度废锚纵员或吐理挑洞庭模物n京葡a 需要神话后日作业的数诸输妻萼猫调康的作斗的豹目:2 1M-2 1 □ 10.4 0.5 4 10-5 0,3回作业提交时间(用数字表。
实验一 处理机调度实验报告
实验一处理机调度实验报告一、实验目的处理机调度是操作系统中的一个重要组成部分,其目的是合理地分配处理机资源,以提高系统的性能和效率。
本次实验的主要目的是通过模拟处理机调度算法,深入理解不同调度算法的工作原理和性能特点,并能够对它们进行比较和分析。
二、实验环境本次实验使用了以下软件和工具:1、操作系统:Windows 102、编程语言:Python3、开发环境:PyCharm三、实验内容1、先来先服务(FCFS)调度算法先来先服务调度算法按照作业或进程到达的先后顺序进行调度。
即先到达的作业或进程先得到处理机的服务。
2、短作业优先(SJF)调度算法短作业优先调度算法优先调度运行时间短的作业或进程。
在实现过程中,需要对作业或进程的运行时间进行预测或已知。
3、高响应比优先(HRRN)调度算法高响应比优先调度算法综合考虑作业或进程的等待时间和运行时间。
响应比的计算公式为:响应比=(等待时间+要求服务时间)/要求服务时间。
4、时间片轮转(RR)调度算法时间片轮转调度算法将处理机的时间分成固定大小的时间片,每个作业或进程在一个时间片内运行,当时间片用完后,切换到下一个作业或进程。
四、实验步骤1、设计数据结构为了表示作业或进程,设计了一个包含作业或进程 ID、到达时间、运行时间和等待时间等属性的数据结构。
2、实现调度算法分别实现了上述四种调度算法。
在实现过程中,根据算法的特点进行相应的处理和计算。
3、模拟调度过程创建一组作业或进程,并按照不同的调度算法进行调度。
在调度过程中,更新作业或进程的状态和相关时间参数。
4、计算性能指标计算了平均周转时间和平均带权周转时间等性能指标,用于评估不同调度算法的性能。
五、实验结果与分析1、先来先服务(FCFS)调度算法平均周转时间:通过计算所有作业或进程的周转时间之和除以作业或进程的数量,得到平均周转时间。
在 FCFS 算法中,由于按照到达顺序进行调度,可能会导致长作业或进程长时间占用处理机,从而使平均周转时间较长。
操作系统课程设计报告
操作系统课程设计报告1. 引言操作系统是计算机系统中最核心的软件之一,它负责管理和优化计算机资源的分配和调度,为用户和应用程序提供一个可靠、高效的执行环境。
在操作系统课程设计中,我们通过设计一个简单的操作系统,深入理解操作系统的原理和功能,提升对操作系统的理解和实践能力。
本报告将详细介绍我们小组在操作系统课程设计过程中所完成的工作和实现的目标。
2. 设计目标在本次操作系统课程设计中,我们的设计目标包括:•实现一个基本的中断处理、进程调度和内存管理机制;•设计一个简单的文件系统;•确保操作系统的稳定性和可靠性;•实现用户命令解析和执行功能。
3. 系统架构我们的操作系统设计采用了经典的分层结构,主要由硬件抽象层、内核和用户接口层组成。
1.硬件抽象层:负责与硬件进行交互,提供基本的底层硬件接口,如处理器管理、中断处理、设备控制等。
2.内核:实现操作系统的核心功能,包括进程管理、内存管理、文件系统管理等。
这一层是操作系统的核心,负责管理和调度系统资源。
3.用户接口层:为用户提供简单友好的界面,解析用户输入的命令并调用内核功能进行处理。
用户可以通过命令行或图形界面与操作系统进行交互。
4. 功能实现4.1 中断处理中断是操作系统与外部设备通信的重要机制,我们的操作系统设计中实现了基本的中断处理功能。
通过在硬件抽象层中捕获和处理硬件的中断信号,内核可以对中断进行相应的处理,保证系统的响应能力和稳定性。
4.2 进程调度进程调度是操作系统中的重要任务之一,它决定了系统如何分配和调度上下文切换。
我们的操作系统设计中实现了一个简单的进程调度算法,通过时间片轮转算法和优先级调度算法来管理多个进程的执行顺序,以提高系统的吞吐量和响应性能。
4.3 内存管理内存管理是操作系统中必不可少的功能,它负责对系统内存的分配和回收。
我们的操作系统设计中实现了基本的内存管理功能,包括内存分区、内存空闲管理和地址映射等。
通过合理的内存管理,可以提高系统的内存利用率和性能。
操作系统 课程设计 处理机调度 图形界面 完整报告
目录第一章概述 (1)1.1需求分析 (1)1.2背景设计 (1)第二章概要设计 (2)第三章详细设计 (4)3.1高响应比调度算法 (4)3.2时间片轮转法 (5)3.3短进程优先法 (7)第四章调试分析与测试结果 (9)第五章总结 (13)第六章参考文献 (14)第七章附录 (15)第一章概述1.1需求分析进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C语言编写一个进程调度模拟程序,使用短作业优先调度算法,高响应比调度算法,时间片轮转调度算法实现进程调度。
可以手动阻塞与唤醒。
并用MFC实现图形界面。
本实验可加深对进程调度算法的理解。
1.2背景设计在OS中,调度的实质是一种资源分配,调度算法即指:根据系统的资源分配策略所规定的资源分配算法。
对于不同的系统和系统目标,通常采用不同的调度算法,如在批处理系统中,为照顾为数众多的短作业,采用短作业有限调度算法;在分时系统中,为保证系统具有合理的响应时间,采用轮转法进行调度。
采用算法时,则要考虑多方面因素,以便达到最佳效果。
第二章概要设计设计一个有多个进程共行的进程调度程序。
进程调度算法:短作业优先调度算法,高响应比调度算法,时间片轮转调度算法每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、服务时间、进程状态等等。
struct progress{CString Name; //进程名称CString Start; //创建时间int ServiceT; //服务时间int RunningT; //消逝时间int RemainT;//剩余时间int id;//进程标识符CProgressCtrl* pro; //指向进度条的指针int Rp;//进程成为就绪进程的时间float prio;//进程优先权};进程的优先权为:响应时间/要求服务时间。
进程的运行时间以时间片为单位进行计算。
操作系统课程设计报告
《操作系统课程设计》一、课程设计目的1、进程调度是处理机管理的核心内容。
2、本设计要求用C语言编写和调试一个简单的进程调度程序。
3、通过设计本可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。
二、课程设计主要内容1、项目名称设计一个有 N个进程共行的进程调度程序2、实验设备及环境:软件要求:WINDOWS NT 系列操作系统,VC、VB、TURBO C等多种程序设计开发工具。
硬件要求:P4 2.0以上CPU、256M、40G硬盘。
3、课程设计类型综合设计型4、课程设计内容与要求1)进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
2)每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
4)每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
5)就绪进程获得 CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用 CPU 时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
6)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。
7)重复以上过程,直到所要进程都完成为止。
5、课程设计方法及步骤1)充分了解各项设计要求。
深入理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。
操作系统页面调度算法程序实验报告
操作系统页面调度算法程序实验报告一、实验背景操作系统是计算机系统中最重要的组成部分之一,它负责管理计算机的资源、协调各个程序的运行和提供用户与计算机之间的接口。
而页面调度算法则是操作系统中非常重要的一个部分,它主要用于管理内存中的页面,以提高计算机系统的性能和效率。
二、实验目的本次实验旨在通过编写一个页面调度算法程序,深入理解操作系统中页面调度算法的原理和实现方法,并掌握如何使用C语言进行程序设计和开发。
三、实验原理1. 页面调度算法概述在操作系统中,为了提高内存利用率和进程执行效率,通常会将进程所需的数据或指令分割成多个大小相等的块(即“页面”),并将这些页面存储到内存中。
当进程需要访问某个页面时,如果该页面已经在内存中,则直接访问即可;如果该页面不在内存中,则需要进行“缺页处理”,将其从磁盘读入内存,并将其中一个已经在内存中但未被访问过一段时间的页面替换出去。
而为了确定应该替换哪个页面,就需要使用一种称为“页面调度算法”的技术来进行决策。
常见的页面调度算法有FIFO、LRU、LFU等。
2. FIFO算法FIFO(First In First Out)算法是最简单的页面调度算法之一,它的原理是将最先进入内存的页面替换出去。
具体来说,当一个新页面需要进入内存时,如果内存已经满了,则将最先进入内存的页面替换出去,并将新页面插入到队列末尾。
3. LRU算法LRU(Least Recently Used)算法是一种比较常用的页面调度算法,它的原理是根据页面最近被访问的时间来进行决策。
具体来说,当一个新页面需要进入内存时,如果内存已经满了,则将最近访问时间最早且未被修改过的页面替换出去,并将新页面插入到队列末尾。
4. LFU算法LFU(Least Frequently Used)算法是一种根据页面使用频率来进行决策的调度算法。
具体来说,当一个新页面需要进入内存时,如果内存已经满了,则将使用频率最低的那个页面替换出去,并将新页面插入到队列末尾。
操作系统-课程设计报告-处理机调度程序
操作系统课程设计报告学校:广州大学学院:计算机科学与教育软件学院班级:计算机127 班课题:处理机调度程序任课老师:陶文正、陈文彬姓名:黄俊鹏学号:1200002111班内序号:27成绩:日期:2015 年 1 月 6 日、设计目的在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。
也就是说能运行的进程数大于处理机个数。
为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。
要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。
、设计要求1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法2)可选择进程数量3)本程序包括三种算法,用C 语言实现,执行时在主界面选择算法(可用函数实现)(进程数,运行时间,优先数由随机函数产生)执行,显示结果。
三、设计思路及算法思想1. 界面菜单选项一级菜单提供2 个选项:① 自动生成进程数量② 手动输入所需进程数量一级菜单选择完毕后进入二级菜单:①重新生成进程②时间片轮转法③短作业优先算法④动态优先级算法⑤退出程序2. 调度算法typedef st ruct char name;mr pri-ority; intrunnirtgrime;"肚先註 "运和时Eint arriveTiflie;"到达时剖int beg in Time;"幵皓时旬int TinishTiJiie: "尧成时列int cyclingTlme;double weigthC/clingTime:kint int >PCB;hadRunTimt;finish:"已经运行呼间/At否完咸程序所用PCB结构体需要用到的进程结构体如上图所示1)时间片轮转法主要是设置一个当前时间变量,curTime和时间片roundTime。
遍历进程组的时候,每运行一个进程,就把curTime += roundTime。
操作系统-课程设计报告-处理机调度程序
操作系统课程设计报告学校:广州大学学院:计算机科学与教育软件学院班级:计算机127班课题:处理机调度程序任课老师:陶文正、陈文彬姓名:黄俊鹏学号:11班内序号:27成绩:日期:2015年1月6日一、设计目的在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。
也就是说能运行的进程数大于处理机个数。
为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。
要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。
二、设计要求1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。
2)可选择进程数量3)本程序包括三种算法,用C语言实现,执行时在主界面选择算法(可用函数实现)(进程数,运行时间,优先数由随机函数产生)执行,显示结果。
三、设计思路及算法思想1.界面菜单选项一级菜单提供2个选项:①自动生成进程数量②手动输入所需进程数量一级菜单选择完毕后进入二级菜单:①重新生成进程②时间片轮转法③短作业优先算法④动态优先级算法⑤退出程序2.调度算法程序所用PCB结构体需要用到的进程结构体如上图所示1)时间片轮转法主要是设置一个当前时间变量,curTime和时间片roundTime。
遍历进程组的时候,每运行一个进程,就把curTime += roundTime。
进程已运行时间加roundTime2)短作业优先算法遍历进程组,找到未运行完成并且运行时间最短的进程,让它一次运行完成,如此往复,直到所有进程都运行完成为止。
3)动态优先级算法做法跟短作业优先算法类似,此处主要是比较进程的优先数,优先级高者,先执行。
直到全部执行完毕。
当一个进程运行完毕后,适当增减其余进程的优先数,以达到动态调成优先级的效果。
3.程序流程图四、运行截图1)启动后输入5,生成5个进程2)输入1,选择时间片轮转法。
自动输出结果,分别是时间片为1和4的结果3)输入2,选择短作业优先算法4)输入3,选择动态优先级算法5)输入0,重新生成进程,再输入3,生成3个进程,选择2.短作业优先算法6)输入q,退出五、心得体会通过这次实验,让我对操作系统的进程调度有了更进一步的了解。
操作系统课程设计报告进程调度
操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。
操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。
操作系统的功能包括管理计算机系统的硬件、软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持,让计算机系统所有资源最大限度地发挥作用,提供各种形式的用户界面,使用户有一个好的工作环境,为其它软件的开发提供必要的服务和相应的接口等。
实际上,用户是不用接触操作系统的,操作系统管理着计算机硬件资源,同时按照应用程序的资源请求,分配资源,如:划分CPU时间,内存空间的开辟,调用打印机等。
操作系统的主要功能是资源管理,程序控制和人机交互等。
计算机系统的资源可分为设备资源和信息资源两大类。
设备资源指的是组成计算机的硬件设备,如中央处理器,主存储器,磁盘存储器,打印机,磁带存储器,显示器,键盘输入设备和鼠标等。
信息资源指的是存放于计算机内的各种数据,如系统软件和应用软件等。
操作系统位于底层硬件与用户之间,是两者沟通的桥梁。
用户可以通过操作系统的用户界面,输入命令。
操作系统则对命令进行解释,驱动硬件设备,实现用户要求。
本次课程设计我们将对上学期所学的知识进行系统的应用,而达到巩固知识的作用1问题概述 (2)2需求分析 (2)3 概要设计 (2)3.1主要功能 (2)3.2 模块功能结构 (3)3.3 软硬件环境 (3)3.4数据结构设计 (3)4 详细设计 (4)4.1“先来先服务(FCFS)调度算法” (4)4.2“短进程调度算法(SPF)” (6)4.3“高响应比优先调度算法” (8)4.4“优先级调度(非抢占式)算法” (10)5 系统测试及调试 (12)5.1测试 (12)5.2调试过程中遇到的问题 (13)6 心得体会 (14)7 参考文献 (15)8 附录 (16)1问题概述编写一个进程调度程序,允许多个进程并发执行。
操作系课程设计
4
经典进程同步问题实现
基于Linux操作系统实现生产者和消费者、哲学家进餐以及一个简单的聊天程序。
6
伙伴系统模拟实现
结合数据结构课程中的伙伴系统的介绍,编写具有分配与回收功能的程序,显示所有用户申请成功后的用户名,进程号,内存大小及内存起始地址等。
《操作系统》课程设计大纲
序
号
项目名称
内容
1
处理机调度算法实现
根据处理机调度算法的思想,编程实现先来先服务、短作业优先、高响应比以及时间片轮转调度算法,并通过数据分析比较各种算法的执行效率。
2
进程调度算法修改
基于Linux操作系统内核修改其进程调度算法,并进行内核编译,运行修改后的处理机调度算法。
3
银行家算法实现
7
页面置换算法实现
根据请求分页存储管理中页面置换算法的思想,编程实现最佳置换算法、先来先服务置换算法、最近最久未使用算法,并通过数据分析比较各种算法的缺页率。
8
设备管理
编写程序,由必要的数据结构、主函数、设备分配函数及设备回收函数构成,实现对独占设备的分配与回收的模拟。
9
磁盘调度算法模拟
根据磁盘调度算法的思想,编程实现先来先服务、最短寻道时间优先、扫描算法、循环扫描算法等,并通过数据分析比较各种算反的平均寻道长度。
10
Linux内核编译和裁剪
实现将Linux内核进行裁剪和编译,并Linux2.4内核升级到2.6内核。
11
手机操作系统应用
基于智能手机操作系统设计并实现一个简单应用。(计算器等)
计算机操作系统-处理机调度实验报告
中南大学实验名称:处理机调度课程名称:计算机操作系统学生姓名盛希玲学号 ********** 学院信息科学与工程学院专业班级电子信息工程0602 完成时间 2008年10月12日目录一实验内容 (2)二实验目的 (2)三实验题目 (2)四基本思想 (2)五算法分析 (2)六流程图 (3)七算法描述 (4)八运行输出结果 (9)一实验内容选择一个调度算法,实现处理机调度。
二实验目的多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。
本实验模拟实现处理机调度,以加深了解处理机调度的工作。
三实验题目设计一个按优先权调度和时间片轮转算法实现处理机调度的程序。
四基本思想先选择时间片的个数和每个时间片需要的时间,正在运行的进程每运行一秒其优先权数目加一,即其优先权减小。
每个时间片运行结束后,选择进入时间片进程优先权数目最小的进程,开始下一个时间片的运行。
如果有进程运行结束,则离开,再在就绪队列中选择优先权数目最小的进程进入。
在运行期间,如果有新的进程来到,按优先权大小放入就绪队列中。
五算法分析定义一个结构体,此包含了PCB的信息:struct PCB{char PID[5]; /*进程名*/int needtime; /*要求运行的时间*/int cputime; /*已运行时间*/int priority; /*优先权(越小越高)*/int starttime; /*进入就绪队列的时间*/int overtime; /*运行完成的时间*/int state; /*状态:1就绪2运行3完成*/struct PCB *next;};子函数struct PCB *create(int num,int n)用来建立一个按优先级大小排列的就绪进程链表和一个按时间先后循序排列的将进入就绪进程的链表。
main()函数中用一while循环输出进入时间片的进程状态。
六流程图七算法描述#define NULL 0#define LEN sizeof(struct PCB)#include"stdio.h"#include"stdlib.h"struct PCB{char PID[5]; /*进程名*/int needtime; /*要求运行的时间*/int cputime; /*已运行时间*/int priority; /*优先权(越小越高)*/int starttime; /*进入就绪队列的时间*/int overtime; /*运行完成的时间*/int state; /*状态:1就绪2运行3完成*/struct PCB *next;};struct PCB *create(int num,int n)/*创建进程,并将进程按优先级顺序插入队列中*/ {struct PCB *head,*p,*p1,*p2;int i;head=NULL; /*头指针指零*/for(i=1;i<=num;i++) /*循环建立所有进程*/{printf("请输入第%d个进程的信息\n",i);p=(struct PCB *)malloc(LEN); /*开辟一个空间*/printf("进程名:"); /*输入进程名*/scanf("%s",p->PID);printf("要求运行的时间:"); /*输入要运行的时间*/scanf("%d",&p->needtime);p->cputime=0; /*占用处理机的时间赋为零*/printf("优先权:"); /*输入优先权*/scanf("%d",&p->priority);if(n==1)p->starttime=0; /*进入就绪队列的时间赋为零*/else{printf("进入就绪队列时间:"); /*输入进入就绪队列的时间*/scanf("%d",&p->starttime);}p->overtime=-1; /*运行没有结束所以运行完成的时间赋为-1*/p->state=1; /*状态赋为就绪状态*/p1=head; /*p1指针指向头指针*/if(head==NULL) /*如果头指针为零将头指针指向新建立的进程*/ {head=p;head->next=NULL;}else /*头指针不为零的情况*/{if(n==1)while(p1!=NULL&&p->priority>p1->priority) /*查找插入点*/{p2=p1;p1=p1->next;}elsewhile(p1!=NULL&&p->starttime>p1->starttime) /*查找插入点*/{p2=p1;p1=p1->next;}if(head==p1) /*优先权的值最小作为表头*/{p->next=head;p2=head=p;}else /*否则的话插入*/{p2->next=p;p->next=p1;}}}return(head);}void main(){char now[5];int cho,num,num1,timepiece,time,i,j,k,flag,choo,clock=0;struct PCB*head,*head1,*over,*later,*l,*l1,*l2,*p,*p0,*p1,*p2,*q,*q1,*q2,*q3;over=NULL;printf("初始化进程...\n");printf("输入总的就绪进程数:");scanf("%d",&num);head=create(num,1); /*建立就绪进程的链表*/printf("输入将会就绪的进程数:");scanf("%d",&num1); /*建立将会进入就绪进程的链表*/later=create(num1,2);printf("cpu是否开始运行:1是 2不是--");scanf("%d",&cho);if(cho==1) /*处理机开始进行调度*/{printf("现在的时间是:");scanf("%s",now);printf("显示所有就绪的进程:\n");p2=head;printf("进程名\t要求运行时间\t已运行时间\t优先权\t状态(1就绪2运行3结束)\n");while(p2!=NULL){printf("%s\t%d\t\t%d\t\t%d\t%d\n",p2->PID,p2->needtime,p2->cputime ,p2->priority,p2->state);p2=p2->next;}printf("请输入时间片总数:");scanf("%d",&timepiece);printf("请输入时间片的时间:");scanf("%d",&time);printf("运行正式开始!\n");head1=head;printf("\t\t进程名\t要求运行时间\t已运行时间\t优先权\t状态\n"); for(i=1;i<=timepiece;i++) /*将进入时间片运行的进程用头指针head1指示,并改变就绪进程头指针head的指向*/{if(head!=NULL){p=head;head=head->next;}else break;}p->next=NULL;while(head1!=NULL) /*就绪进程头指针不为零就循环*/{head1->state=2; /*状态:1就绪2运行3完成*/for(j=1;j<=time;j++) /*每个时间片所需时间的循环*/{clock++; /*定时器每秒加1*/if(later!=NULL&&clock==later->starttime)/*如果将进入就绪队列的进程时间到达加入就绪队列*/ {l=later;l1=head;later=later->next;if(head==NULL){head=l;head->next=NULL;}else{while(l1!=NULL&&l1->priority<=l->priority){l2=l1;l1=l1->next;}if(l1==head){l->next=head;head=l;}else{l2->next=l;l->next=l1;}}}flag=0;printf("\n%3d秒时间片第%d秒 ",clock,j);q=head1;if(head1->needtime>head1->cputime) /*以运行时间和优先权都加1*/ {head1->cputime++;head1->priority++;while(q) /*运行队列不为零输出其信息*/ {if(q==head1)printf("%s\t%d\t\t%d\t\t%d\t%d\n",q->PID,q->needtime,q->cputime,q->pr iority,q->state);elseprintf("\t\t %s\t%d\t\t%d\t\t%d\t%d\n",q->PID,q->needtime,q->cputim e,q->priority,q->state);q=q->next;}}if(head1->needtime==head1->cputime)/*运行完成将其放入over为头指针的链表中*/ {head1->state=3;head1->overtime=clock;if(over==NULL){over=head1;head1=head1->next;over->next=NULL;}elseif(over!=NULL&&head1!=NULL){p1=head1->next;p0=over;over=head1;over->next=p0;head1=p1;}flag=1;}if(flag==1) break;}if(flag==1) /*有进程结束的情况*/{if(head!=NULL) /*就绪队列不为零将优先权最高的放入运行链表中*/ {q1=head;head=head->next;q2=head1;while(q2!=NULL&&q2->priority<=q1->priority){q3=q2;q2=q2->next;}if(q2==head1){q1->next=head1;head1=q1;}else{q3->next=q1;q1->next=q2;}}}else /*无进程结束的情况,寻找优先权最高的运行*/{head1->state=1;q1=head1;head1=head1->next;q2=head1;while(q2!=NULL&&q2->priority<=q1->priority){q3=q2;q2=q2->next;}if(q2==head1){q1->next=head1;head1=q1;}else{q3->next=q1;q1->next=q2;}}}}printf("cpu结束运行!\n");printf("是否输出所有结束的进程:1是2不是--");scanf("%d",&choo);if(choo==1) /*输出所有完成运行的进程*/{printf("开始时间:%s\n",now);printf("进程名\t要求运行时间\t进入就绪队列的时间\t运行完成的时间\n");while(over!=NULL){printf("%s\t%d\t\t%d\t\t\t%d\n",over->PID,over->needtime,over->startt ime,over->overtime);over=over->next;}}}八运行输出结果初始化进程如右图显示现在的时间和所有就绪的进程输入时间片的总数和每个时间片的时间运行时显示的信息。
进程调度实验的图形化界面实现
实验报告课程名称计算机操作系统实验名称作业调度的界面实现实验日期2016年5月班级计科姓名学号实验目的:用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。
实验环境:Eclipse下的java实现实验内容:作业等待算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。
对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。
实验过程:1.在实验中用java新建一个工程,工程下包括两个类,一个JCB.java用来保存作业的信息,包括提交时间,服务时间,完成时间,开始时间和优先数,其中优先数是为HRN调度算法特别设置的,目的是为了简便实验过程。
进程控制块JCB里还包含两个方法,分别为计算周转时间和带权周转时间的方法。
也是为了方便实验设置的。
/*** 计算“周转时间”=完成时间-到达时间* @return double*/publicdoublegetzTime(){}/*** 计算“带权周转时间”=周转时间/服务时间* @return double*/publicdoublegetwzTime(){}2.接下来是主类Main.java的编写。
在这个类的编写中,我用一个引用类型的数组JCB[]来存放每一次输入的作业的信息以便在后续的方法里能继续操作这些数据。
界面的编写由于已经有过多次的经历所以没什么太大的问题。
主要的问题是数据的显示还不能显示在表格中,而且界面不是很整洁。
其次,为每个算法的书写上遇到了一些问题,在SJF算法上花的时间时最多的,因为没有理解SJF算法的意思,所以导致了几次编写出来的算法都不能达到要求,在这里停顿了一顿时间。
3.在每个算法开始之前都要进行一次排序,按照提交时间的前后把先提交的作业先计算,其后的步骤按照不同的方法排序计算。
处理机调度操作系统实验报告
scanf("%s",q->name);
scanf("%d",&q->needtime);
q->cputime = 0;
q->priority = P_TIME - q->needtime;
q->process = ready;
q->next = NULL;
printf("2 ROUNDROBIN\n");
printf("3 EXIT\n");
}
pcb* get_process(){
pcb *q;
pcb *p; //头指针
pcb *t; //尾指针
int i = 0;
printf("input name and time\n");
while (i < P_NUM){
int i = 0;
printf("input name and time\n");
while (i<P_NUM){
q=(pcb *)malloc(sizeof(pcb));
scanf("%s",q->name);
scanf("%d",&q->needtime);
q->cputime = 0;
q->count = 0;
t->cputime++;
}
}
void priority_cal(){
pcb *p;
p = get_process();
int cpu = 0;
操作系统课程设计报告进程调度
操作系统课程设计报告进程调度Last updated on the afternoon of January 3, 2021前言操作系统(OperatingSystem,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。
操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口。
操作系统的功能包括管理计算机系统的硬件、软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持,让计算机系统所有资源最大限度地发挥作用,提供各种形式的用户界面,使用户有一个好的工作环境,为其它软件的开发提供必要的服务和相应的接口等。
实际上,用户是不用接触操作系统的,操作系统管理着计算机硬件资源,同时按照应用程序的资源请求,分配资源,如:划分CPU时间,内存空间的开辟,调用打印机等。
操作系统的主要功能是资源管理,和等。
计算机系统的资源可分为设备资源和信息资源两大类。
设备资源指的是组成计算机的硬件设备,如,主存储器,,打印机,磁带存储器,显示器,键盘输入设备和鼠标等。
信息资源指的是存放于计算机内的各种数据,如系统软件和应用软件等。
操作系统位于底层硬件与用户之间,是两者沟通的桥梁。
用户可以通过操作系统的用户界面,输入命令。
操作系统则对命令进行解释,驱动硬件设备,实现用户要求。
本次课程设计我们将对上学期所学的知识进行系统的应用,而达到巩固知识的作用目录1问题概述编写一个进程调度程序,允许多个进程并发执行。
采取多种进程调度算法(先来先服务(FCFS)调度算法,短进程调度算法(SPF),高响应比优先调度算法,优先级调度(非抢占式)算法)。
分析比较各个算法的优缺点。
2需求分析进程调度的功能是记录系统中所有进程的执行情况、从就绪态队列中选择一个进程,进行进程上下文的切换。
采取不同的算法根据外部环境及条件进行进程的切换。
3概要设计主要功能进程调度的功能是记录系统中所有进程的执行情况、从就绪态队列中选择一个进程,进行进程上下文的切换。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录第一章概述 (1)1.1需求分析 (1)1.2背景设计 (1)第二章概要设计 (2)第三章详细设计 (4)3.1高响应比调度算法 (4)3.2时间片轮转法 (5)3.3短进程优先法 (7)第四章调试分析与测试结果 (9)第五章总结 (13)第六章参考文献 (14)第七章附录 (15)第一章概述1.1需求分析进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C语言编写一个进程调度模拟程序,使用短作业优先调度算法,高响应比调度算法,时间片轮转调度算法实现进程调度。
可以手动阻塞与唤醒。
并用MFC实现图形界面。
本实验可加深对进程调度算法的理解。
1.2背景设计在OS中,调度的实质是一种资源分配,调度算法即指:根据系统的资源分配策略所规定的资源分配算法。
对于不同的系统和系统目标,通常采用不同的调度算法,如在批处理系统中,为照顾为数众多的短作业,采用短作业有限调度算法;在分时系统中,为保证系统具有合理的响应时间,采用轮转法进行调度。
采用算法时,则要考虑多方面因素,以便达到最佳效果。
第二章概要设计设计一个有多个进程共行的进程调度程序。
进程调度算法:短作业优先调度算法,高响应比调度算法,时间片轮转调度算法每个进程有一个进程控制块( PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、服务时间、进程状态等等。
struct progress{CString Name; //进程名称CString Start; //创建时间int ServiceT; //服务时间int RunningT; //消逝时间int RemainT;//剩余时间int id;//进程标识符CProgressCtrl* pro; //指向进度条的指针int Rp;//进程成为就绪进程的时间float prio;//进程优先权};进程的优先权为:响应时间/要求服务时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪、执行、阻塞、完成。
就绪进程获得 CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
当阻塞进程时,将当前运行的进程移动到阻塞队列,并从就绪队列将下个进程移动到进程执行区(本程序中就绪队列中第一个即为正在执行进程,后文不再赘述)。
当添加或唤醒进程时,将添加标记m_bchange置为真,并将进程添加进就绪队列。
在运行一个时间片中,检查添加标记m_bchange是否为真,若为真,则判断单选框选中的算法,并按各自算法进行模拟调度,详见详细设计。
当执行区进程完成时,将之移动到已完成的队列,并判断就绪队列中是否有进程:若有,则将下一个进程添加进就绪队列;若无,则弹出提示窗口。
重复以上流程,直到用户退出。
第三章详细设计3.1高响应比调度算法该算法在添加标记m_bchange为真且单选框选中“高响应比优先”时调用,分别通过每个进程前的队列中进程RemainT之和除以该进程的ServiceT,求出优先级prio,并根据prio重新为就绪队列排序。
最后将m_bchange置为假。
if ( m_bchange ){ if(iRadioButton==IDC_RADIO1){//计算优先级for (int i=1;i<ProNum;i++){float sum=0;for (int j=0;j<i;j++){sum+=Pro[j].RemainT;}Pro[i].prio=sum/Pro[i].ServiceT;}//end for//根据优先级排序progress Tem;for ( i=0;i<ProNum-1;i++){for (int j=0;j<ProNum-1-i;j++){if (Pro[j].prio<Pro[j+1].prio){Tem=Pro[j+1];Pro[j+1]=Pro[j];Pro[j]=Tem;}}}m_bchange=false;}//end 排序3.2时间片轮转法该算法在添加标记m_bchange为真且单选框选中“轮转调度”时调用,直接将就绪队列相邻2个进程两两互换,最终达到将正在执行进程放置于就绪队列后,并将下一个将要执行的进程开始执行,输出结果,并将m_bchange置为真,以便继续轮转。
if(iRadioButton==IDC_RADIO2){progress Tem;for ( int i=0;i<ProNum-1;i++){Tem=Pro[i+1];Pro[i+1]=Pro[i];Pro[i]=Tem;}//end form_bchange=true;Pro[0].pro->SetRange(0,Pro[0].ServiceT);Pro[0].RemainT--;Pro[0].RunningT++;m_Zhixing.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒剩余时间:%d秒已运行时间:%d秒优先权:%f\r\n",Pro[0].id,Pro[0].Name,Pro[0].Start,Pro[0].ServiceT,Pro[0].RemainT,Pro[0].RunningT,Pro[0].prio);GetDlgItem(IDC_EDIT_Zhixing)->SetWindowText(m_Z hixing);Pro[0].pro->SetPos(Pro[0].RunningT);}//end 排序3.3短进程优先法该算法在添加标记m_bchange为真且单选框选中“短进程优先”时调用,按照进程RemainT来重新排列队列顺序。
最后将m_bchange置为假。
if(iRadioButton==IDC_RADIO3){progress Tem;for (int i=0;i<ProNum-1;i++){for (int j=0;j<ProNum-1-i;j++){if (Pro[j].RemainT>Pro[j+1].RemainT){Tem=Pro[j+1];Pro[j+1]=Pro[j];Pro[j]=Tem;}}r}m_bchange=false;}//end 排序}第四章调试分析与测试结果高响应比优先算法轮转调度算法短进程优先算法进程的阻塞与唤醒差错控制第五章总结通过此次课程设计,更深入的理解了各个进程调度算法,及实现过程。
熟悉了MFC环境的使用。
增进了VC编程的水平。
对进程或作业先来先服务、短作业优先算法,最高响应比算法,高优先权、按时间片轮转调度算法以及进程调度的概念和算法,有了更深入的认识!初步理解了操作系统对于作业处理的基本思想!并加深了我对于操作系统理论的理解。
在此过程中,遇到了困难,能及时请教同学,查询相关资料,及时解决了问题,但仍有不足之处,将会在今后学习中更加努力。
第六章参考文献《计算机操作系统(第三版)》汤子瀛西安电子科技大学出版社《操作系统教程》方敏编西安电子科技大学出版社《操作系统原理与实践教程》周湘贞、曾宪权清华出版社《数据结构(C语言版)》严蔚敏清华大学出版社《深入浅出MFC(第2版)》侯俊杰华中科技大学出版社第七章附录pcb1.cpp:#include "stdafx.h"#include "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 _AFXDLLEnable3dControls();#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 DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;progress Pro[100]; //就绪队列progress Zusai[100]; //阻塞队列static int ProNum=0; //用来表示第n就绪进程static int ZusaiNum=0; //用来表示第n阻塞进程static int id=0;int m_bchange;class CAboutDlg : public CDialog{public:CAboutDlg();enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(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, 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_Jincheng, 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_QUERYDRAGICON()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((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARA TOR);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 lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::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 = GetSystemMetrics(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);}else{CDialog::OnPaint();}}HCURSOR CPcb1Dlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}//唤醒按扭void CPcb1Dlg::OnBUTTONHuanxiang(){if ( ZusaiNum==0 ){MessageBox("阻塞队列为空,没有可唤醒的进程","温馨提示",MB_OK|MB_ICONINFORMA TION);return;}Pro[ProNum]=Zusai[0];int atime=this->getArrTime();Pro[ProNum].Rp=atime;ZusaiNum--;ProNum++;//阻塞的队列元素都前移一位for (int i=0;i<ZusaiNum;i++){Zusai[i]=Zusai[i+1];}//显示就绪m_Jiuxu.Empty();CString T;for (i=1;i<ProNum;i++){T.Empty();T.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒剩余时间:%d秒已运行时间:%d秒优先权:%f\r\n",Pro[i].id,Pro[i].Name,Pro[i].Start,Pro[i].ServiceT,Pro[i].RemainT,Pro[i].RunningT,Pro[i].prio);m_Jiuxu+=T;}GetDlgItem(IDC_EDIT_Jiuxu)->SetWindowText(m_Jiuxu);//显示阻塞m_Zusai.Empty();for (i=0;i<ZusaiNum;i++){T.Empty();T.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒剩余时间:%d秒已运行时间:%d秒优先权:%f\r\n",Zusai[i].id,Zusai[i].Name,Zusai[i].Start,Zusai[i].ServiceT,Zusai[i].RemainT,Zusai[i].RunningT,Zusai[i].prio);m_Zusai+=T;}GetDlgItem(IDC_EDIT_Zusai)->SetWindowText(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() ){MessageBox("请输入服务时间");GetDlgItem(IDC_EDIT_Time)->SetFocus();return;}int atime=this->getArrTime();Pro[ProNum].Name=m_Jincheng;Pro[ProNum].pro=&m_progress;Pro[ProNum].RemainT=atoi(m_Time);Pro[ProNum].ServiceT=atoi(m_Time);Pro[ProNum].RunningT=0;Pro[ProNum].Start=(CTime::GetCurrentTime()).Format("%H:%M:%S");Pro[ProNum].Rp=atime;Pro[ProNum].id=id+1;m_Jincheng.Empty();m_Time.Empty();UpdateData(false);id++;ProNum++;if(ProNum>1){CString Temple="";for ( int i=1;i<ProNum;i++){Temple.Format("进程名称:%s.exe 创建时间:%s 需要时间:%d 剩余时间:%d 已运行时间:%d 优先权:%f\r\n",Pro[i].Name,Pro[i].Start,Pro[i].ServiceT,Pro[i].RemainT,Pro[i].RunningT,Pro[i].prio);m_Jiuxu+=Temple;}GetDlgItem(IDC_EDIT_Jiuxu)->SetWindowText(m_Jiuxu);}SetTimer(1,1000,NULL);m_bchange=true;}//阻塞按扭void CPcb1Dlg::OnBUTTONZuisai(){int i;if ( ProNum<=0 ){KillTimer(1);MessageBox("当前没有进程在执行,请添加或唤醒进程");return;}else{Zusai[ZusaiNum++]=Pro[0];m_Zusai.Empty();CString Temple="";//显示阻塞for ( i=0;i<ZusaiNum;i++){Temple.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒剩余时间:%d秒已运行时间:%d秒优先权:%f\r\n",Zusai[i].id,Zusai[i].Name,Zusai[i].Start,Zusai[i].ServiceT,Zusai[i].RemainT,Zusai[i].RunningT,Zusai[i].prio);m_Zusai+=Temple;}GetDlgItem(IDC_EDIT_Zusai)->SetWindowText(m_Zusai);//更新进度条,将进程条和运行清空Pro[0].pro->SetPos(0);GetDlgItem(IDC_EDIT_Zhixing)->SetWindowText(_T(""));ProNum--;if ( ProNum<=0 ){KillTimer(1);MessageBox("当前没有进程在执行,请添加或唤醒进程");return;}//BlockNum++int atime=this->getArrTime();//因为第一个元素空了,所以数组要前移double temp=0;double High;int highidex;for(i=1;i<=ProNum;i++){High=((double)atime-(double)Pro[i].Rp)/(double)Pro[i].ServiceT;if(High>=temp){temp=High;highidex=i;}}Pro[0]=Pro[highidex];for ( i=highidex;i<ProNum;i++){Pro[i]=Pro[i+1];}for (i=highidex;i<ProNum;i++){Pro[i]=Pro[i+1];}}m_bchange=true;}//或取变为就绪进程的时间函数int CPcb1Dlg::getArrTime(){CTime time=CTime::GetCurrentTime();int Arrtime;Arrtime=time.GetHour()*3600+time.GetMinute()*60+time.GetSecond();return Arrtime;}void CPcb1Dlg::OnTimer(UINT nIDEvent){int iRadioButton; iRadioButton=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3); if(iRadioButton!=IDC_RADIO2) {Pro[0].pro->SetRange(0,Pro[0].ServiceT);Pro[0].RemainT--;Pro[0].RunningT++;m_Zhixing.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒剩余时间:%d秒已运行时间:%d秒优先权:%f\r\n",Pro[0].id,Pro[0].Name,Pro[0].Start,Pro[0].ServiceT,Pro[0].RemainT,Pro[0].RunningT,Pro[0].prio);GetDlgItem(IDC_EDIT_Zhixing)->SetWindowText(m_Zhixing);Pro[0].pro->SetPos(Pro[0].RunningT);}//如果添加了新的成员,重新排序if ( m_bchange ){ if(iRadioButton==IDC_RADIO1){//计算优先级for (int i=1;i<ProNum;i++){float sum=0;for (int j=0;j<i;j++){sum+=Pro[j].RemainT;}Pro[i].prio=sum/Pro[i].ServiceT;}//end for//根据优先级排序progress Tem;for ( i=0;i<ProNum-1;i++){for (int j=0;j<ProNum-1-i;j++){if (Pro[j].prio<Pro[j+1].prio){Tem=Pro[j+1];Pro[j+1]=Pro[j];Pro[j]=Tem;}}}m_bchange=false;}//end 排序if(iRadioButton==IDC_RADIO2){progress Tem;for ( int i=0;i<ProNum-1;i++){Tem=Pro[i+1];Pro[i+1]=Pro[i];Pro[i]=Tem;}m_bchange=true;Pro[0].pro->SetRange(0,Pro[0].ServiceT);Pro[0].RemainT--;Pro[0].RunningT++;m_Zhixing.Format("标识符:%d 进程名称:%s 创建时间:%s 需要时间:%d秒剩余时间:%d秒已运行时间:%d秒优先权:%f\r\n",Pro[0].id,Pro[0].Name,Pro[0].Start,Pro[0].ServiceT,Pro[0].RemainT,Pro[0].RunningT,Pro[0].prio);GetDlgItem(IDC_EDIT_Zhixing)->SetWindowText(m_Zhixing);Pro[0].pro->SetPos(Pro[0].RunningT);}//end 排序if(iRadioButton==IDC_RADIO3){ progress Tem;for (int i=0;i<ProNum-1;i++){for (int j=0;j<ProNum-1-i;j++){if (Pro[j].RemainT>Pro[j+1].RemainT){Tem=Pro[j+1];Pro[j+1]=Pro[j];Pro[j]=Tem;}}}m_bchange=false;}//end 排序}//如果已经完成if ( Pro[0].RemainT<=0 ){ProNum--;m_Wancheng+=m_Zhixing;m_Zhixing=_T("");//Sleep(100);Pro[0].pro->SetPos(0);UpdateData(false);GetDlgItem(IDC_EDIT_Wancheng)->SetWindowText(m_Wancheng);//如果没有就绪的进程if( ProNum==0 ){KillTimer(1);GetDlgItem(IDC_EDIT_Zhixing)->SetWindowText(_T(""));MessageBox("当前没有进程在执行,请添加或唤醒进程!");}//还有就绪的进程else{int i;int atime=this->getArrTime();//因为第一个元素空了,所以数组要前移double temp=0;double High;int highidex;for(i=1;i<=ProNum;i++){High=((double)atime-(double)Pro[i].Rp)/(double)Pro[i].ServiceT;if(High>=temp){temp=High;highidex=i;}}Pro[0]=Pro[highidex];for ( i=highidex;i<ProNum;i++){Pro[i]=Pro[i+1];}CString Temple="";for ( i=1;i<ProNum;i++){Temple.Format(" 标识符:%d 进程名称:%s.exe 创建时间:%s 需要时间:%d 剩余时间:%d 已运行时间:%d 优先权:%f\r\n",Pro[i].id,Pro[i].Name,Pro[i].Start,Pro[i].ServiceT,Pro[i].RemainT,Pro[i].RunningT,Pro[i].prio);m_Jiuxu+=Temple;}GetDlgItem(IDC_EDIT_Jiuxu)->SetWindowText(m_Jiuxu);}m_bchange=true;}//end 完成m_Jiuxu="";CString Temple="";for ( int i=1;i<ProNum;i++){Temple.Format("标识符:%d 进程名称:%s 创建时间:%s秒需要时间:%d秒剩余时间:%d秒已运行时间:%d秒优先权:%f\r\n",Pro[i].id,Pro[i].Name,Pro[i].Start,Pro[i].ServiceT,Pro[i].RemainT,Pro[i].RunningT,Pro[i].prio);m_Jiuxu+=Temple;}GetDlgItem(IDC_EDIT_Jiuxu)->SetWindowText(m_Jiuxu);CDialog::OnTimer(nIDEvent);}StdAfx.cpp:#include "stdafx.h"pcb1.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 "resource.h"class CPcb1App : public CWinApp{public:CPcb1App();public:virtual BOOL InitInstance();DECLARE_MESSAGE_MAP()};#endifpcb1Dlg.h:#if !defined(AFX_PCB1DLG_H__85A9A06E_CC92_4F5B_B772_4E1D184B7433__INCLUDE D_)#define AFX_PCB1DLG_H__85A9A06E_CC92_4F5B_B772_4E1D184B7433__INCLUDED_#if _MSC_VER > 1000#pragma once#endifstruct progress{CString Name; //进程名称CString Start; //创建时间int ServiceT; //服务时间int RunningT; //消逝时间int RemainT;//剩余时间int id;//进程标识符CProgressCtrl* pro; //指向进度条的指针int Rp;//进程成为就绪进程的时间float prio;//进程优先权};class CPcb1Dlg : public CDialog{public:int getArrTime();CPcb1Dlg(CWnd* pParent = NULL);enum { IDD = IDD_PCB1_DIALOG };CProgressCtrl m_progress;CString m_Jincheng;CString m_Jiuxu;CString m_Wancheng;CString m_Time;CString m_Zhixing;CString m_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:#define IDM_ABOUTBOX 0x0010#define IDD_ABOUTBOX 100#define IDS_ABOUTBOX 101#define IDD_PCB1_DIALOG 102#define IDR_MAINFRAME 128#define IDC_EDIT_Jincheng 1000#define IDC_EDIT_Time 1001#define IDC_BUTTON_Tianjia 1002#define IDC_EDIT_Jiuxu 1003#define IDC_EDIT_Zhixing 1004#define IDC_PROGRESS1 1005#define IDC_EDIT_Zusai 1006#define IDC_EDIT_Wancheng 1007#define IDC_BUTTON_Zuisai 1008#define IDC_BUTTON_Huanxiang 1009#define IDC_BUTTON_Qingkong 1010#define IDC_RADIO1 1011#define IDC_RADIO2 1012#define IDC_RADIO3 1013#define IDC_EDIT_Time2 1014// Next default values for new objects//#ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_NEXT_RESOURCE_V ALUE 129#define _APS_NEXT_COMMAND_V ALUE 32771#define _APS_NEXT_CONTROL_V ALUE 1012#define _APS_NEXT_SYMED_V ALUE 101#endif#endifStdAfx.h:#if !defined(AFX_STDAFX_H__475878FC_206D_4B1D_8B95_B000C92EBF8F__INCLUDED _)#define AFX_STDAFX_H__475878FC_206D_4B1D_8B95_B000C92EBF8F__INCLUDED_#if _MSC_VER > 1000#pragma once#endif#define VC_EXTRALEAN#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>#include <afxdtctl.h>#ifndef _AFX_NO_AFXCMN_SUPPORT#include <afxcmn.h>#endifpcb1.rc2:#ifdef APSTUDIO_INVOKED#error this file is not editable by Microsoft V isual C++ #endif。