进程调度程序设计报告(源代码)资料
进程调度程序设计
![进程调度程序设计](https://img.taocdn.com/s3/m/5edc0bee69dc5022aaea0081.png)
长沙学院课程设计说明书题目进程调度程序设计系(部) 计算机科学与技术系专业(班级) 2009级数据库二班姓名学号指导教师黄彩霞起止日期2012.6.4-2012.6.15课程设计任务书课程名称:操作系统课程设计设计题目:进程调度程序设计已知技术参数和设计要求:1. 设计任务设计一个虚拟内核,该内核能支持多任务管理。
提供创建进程、终止进程、进程状态转换,进程调度,上下文切换等功能。
2. 问题描述2.1 系统组成系统由虚拟内核(VKernel)、命令解释程序(Commander)、用户程序(Application)、编译器(Compiler)四部分组成。
VKernel首先运行,并常驻内存。
Kernel启动后,创建Commander进程。
根据用户请求创建多个Application进程。
Kernel负责维护6个数据结构,包括时间 (Time), 处理器状态(CPUstate),进程表(PCBTable), 就绪队列(ReadyState),等待队列(BlockedState),运行进程(RunningState)。
Time是系统时间片。
CPUstate应包括程序计数器PC,累加器A、B,状态寄存器F的值。
PCBTable的每一项是一个进程的进程控制块(PCB)。
Commander程序、Application程序是用下列CPU虚拟指令书写的程序:①CPU虚拟指令(以下指令仅供参考, 设计者可以自行设计)MOV n //把整数n赋给累加器ASAV m //把累加器A的值存入地址MADD n //从累加器A的值减去整数n,结果送到累加器A。
SUB n //从累加器A的值减去整数n,结果送到累加器A。
MUL n //从累加器A的值乘以整数n,结果送到累加器A。
DIV n //从累加器A的值除以整数n,结果送到累加器A。
JEQ m //F为0跳转到mJLG m //F大于0跳转到mJLE m //F大于等于0跳转到mJMP m //无条件跳转到mOUT port //累加器的内容输出到端口port。
操作系统实验报告进程调度
![操作系统实验报告进程调度](https://img.taocdn.com/s3/m/aa3c249f6294dd88d1d26b61.png)
五邑大学实验报告操作系统课程2016~2017年度第1学期实验题目:进程调度院系:计算机学院班级: 140801学号: 3114002472姓名:黄凯鑫任课教师:白明成绩评定:实验二题目:进程调度完成日期:2016年12 月11 日1、实验目的(1)设计一个有n个进程工行的进程调度程序。
每个进程由一个进程控制块(PCB)表示。
进程控制块通常应包含下述信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等,且可按调度算法的不同而增删。
(2)调度程序应包含2~3种不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。
(3)系统应能显示或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程2、实验内容(1)编制和调试示例给出的进程调度程序,并使其投入运行。
(2)自行设计或改写一个进程调度程序,在相应机器上调试和运行该程序,其功能应该不亚于示例。
(3)直观地评测各种调度算法的性能。
3、算法设计算法:(1) 优先数法。
进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。
每过一个时间片,运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。
接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。
原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。
(2) 简单轮转法。
进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置)。
每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。
进程调度程序实验报告
![进程调度程序实验报告](https://img.taocdn.com/s3/m/9f68594ecd7931b765ce0508763231126edb7721.png)
一、实验目的通过本次实验,加深对进程调度原理和算法的理解,掌握进程调度程序的设计与实现方法。
实验要求我们使用高级编程语言编写一个简单的进程调度程序,实现不同调度算法的模拟,并通过实验验证算法的性能。
二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:IntelliJ IDEA三、实验内容本次实验主要实现以下调度算法:1. 先来先服务(FCFS)2. 最短作业优先(SJF)3. 时间片轮转(RR)四、实验步骤1. 定义进程类(Process):```javapublic class Process {private String processName; // 进程名称private int arrivalTime; // 到达时间private int burstTime; // 运行时间private int waitingTime; // 等待时间private int turnaroundTime; // 周转时间// 构造函数public Process(String processName, int arrivalTime, int burstTime) {this.processName = processName;this.arrivalTime = arrivalTime;this.burstTime = burstTime;}// 省略getter和setter方法}```2. 定义调度器类(Scheduler):```javapublic class Scheduler {private List<Process> processes; // 进程列表private int currentTime; // 当前时间// 构造函数public Scheduler(List<Process> processes) {this.processes = processes;this.currentTime = 0;}// FCFS调度算法public void fcfs() {for (Process process : processes) {process.setWaitingTime(currentTime -process.getArrivalTime());currentTime += process.getBurstTime();process.setTurnaroundTime(currentTime -process.getArrivalTime());}}// SJF调度算法public void sjf() {processes.sort((p1, p2) -> p1.getBurstTime() -p2.getBurstTime());for (Process process : processes) {process.setWaitingTime(currentTime -process.getArrivalTime());currentTime += process.getBurstTime();process.setTurnaroundTime(currentTime -process.getArrivalTime());}}// RR调度算法public void rr(int quantum) {List<Process> sortedProcesses = new ArrayList<>(processes);sortedProcesses.sort((p1, p2) -> p1.getArrivalTime() -p2.getArrivalTime());int timeSlice = quantum;for (Process process : sortedProcesses) {if (process.getBurstTime() > timeSlice) {process.setWaitingTime(currentTime - process.getArrivalTime());currentTime += timeSlice;process.setTurnaroundTime(currentTime - process.getArrivalTime());process.setBurstTime(process.getBurstTime() - timeSlice);} else {process.setWaitingTime(currentTime - process.getArrivalTime());currentTime += process.getBurstTime();process.setTurnaroundTime(currentTime - process.getArrivalTime());process.setBurstTime(0);}}}}```3. 测试调度程序:```javapublic class Main {public static void main(String[] args) {List<Process> processes = new ArrayList<>();processes.add(new Process("P1", 0, 5));processes.add(new Process("P3", 4, 2));processes.add(new Process("P4", 6, 4));Scheduler scheduler = new Scheduler(processes); System.out.println("FCFS调度结果:");scheduler.fcfs();for (Process process : processes) {System.out.println(process);}processes = new ArrayList<>();processes.add(new Process("P1", 0, 5));processes.add(new Process("P2", 1, 3));processes.add(new Process("P3", 4, 2));processes.add(new Process("P4", 6, 4));System.out.println("SJF调度结果:");scheduler.sjf();for (Process process : processes) {System.out.println(process);}processes = new ArrayList<>();processes.add(new Process("P1", 0, 5));processes.add(new Process("P2", 1, 3));processes.add(new Process("P3", 4, 2));System.out.println("RR调度结果(时间片为2):");scheduler.rr(2);for (Process process : processes) {System.out.println(process);}}}```五、实验结果与分析通过实验,我们可以观察到以下结果:1. FCFS调度算法简单,但可能导致长作业等待时间过长。
实验三 进程调度(实验报告格式)
![实验三 进程调度(实验报告格式)](https://img.taocdn.com/s3/m/db587618866fb84ae45c8d38.png)
实验三:进程调度一、实验目的(1)理解进程控制块和进程组织方式;(2)掌握时间片轮转调度算法实现处理机调度。
二、实验环境微型计算机,Ubuntu Linux10.04 ,gedit,gcc三、实验内容1建立合理的PCB数据结构,建立含有8个进程结点的就绪队列,每个进程的要求运行时间随机产生,要求每个进程的要求运行时间不大于15。
2 设置时间片大小(3~6),使用时间片轮转调度算法实现处理机调度。
四、实验结果五、源代码#include<stdio.h>#include<time.h>#include<malloc.h>#define T 8#define NUM 10typedef struct PCB{int name;int runtime;int runedtime;int killtime;struct PCB *next;}PCB;PCB *creat_jiuxu(PCB *top){PCB *temp;int i;srand((int)time(0));for(i=0;i<NUM;i++){temp=(PCB *)malloc(sizeof(PCB));temp->name=i;temp->runtime=rand()%15;temp->runedtime=0;temp->next=NULL;temp->killtime=0;if(i==0) top=temp;else{temp->next=top;top=temp;}}return top;}void run(PCB *top){PCB *tail=top;if(tail->next!=NULL)tail=tail->next;PCB *rq=NULL;while(top!=NULL){rq=top;if(rq->runtime<=rq->runedtime+T){printf("process_name:%d,runtime:%d,killtime:%d\n",rq->name,rq->runtime,rq->killtime);/*if(rq!=NULL) free(rq);*/top=top->next;}else{top=top->next;rq->runedtime+=T;rq->killtime++;tail->next=rq;tail=rq;rq->next=NULL;}}return;}int main(){PCB *top=NULL;top=creat_jiuxu(top);run(top);return 0;}。
实验一、进程调度实验报告
![实验一、进程调度实验报告](https://img.taocdn.com/s3/m/cc63f0aebb0d4a7302768e9951e79b89680268b4.png)
实验一、进程调度实验报告一、实验目的进程调度是操作系统中的核心功能之一,其目的是合理地分配 CPU 资源给各个进程,以提高系统的整体性能和资源利用率。
通过本次实验,我们旨在深入理解进程调度的原理和算法,掌握进程状态的转换,观察不同调度策略对系统性能的影响,并通过实际编程实现来提高我们的编程能力和对操作系统概念的理解。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。
三、实验原理1、进程状态进程在其生命周期中会经历不同的状态,包括就绪态、运行态和阻塞态。
就绪态表示进程已经准备好执行,只等待 CPU 分配;运行态表示进程正在 CPU 上执行;阻塞态表示进程由于等待某个事件(如 I/O操作完成)而暂时无法执行。
2、调度算法常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)等。
先来先服务算法按照进程到达的先后顺序进行调度。
短作业优先算法优先调度执行时间短的进程。
时间片轮转算法将 CPU 时间划分成固定大小的时间片,每个进程轮流获得一个时间片执行。
四、实验内容1、设计并实现一个简单的进程调度模拟器定义进程结构体,包含进程 ID、到达时间、执行时间、剩余时间等信息。
实现进程的创建、插入、删除等操作。
实现不同的调度算法。
2、对不同调度算法进行性能测试生成一组具有不同到达时间和执行时间的进程。
分别采用先来先服务、短作业优先和时间片轮转算法进行调度。
记录每个算法下的平均周转时间、平均等待时间等性能指标。
五、实验步骤1、进程结构体的定义```c++struct Process {int pid;int arrivalTime;int executionTime;int remainingTime;int finishTime;int waitingTime;int turnaroundTime;};```2、进程创建函数```c++void createProcess(Process processes, int& numProcesses, int pid, int arrivalTime, int executionTime) {processesnumProcessespid = pid;processesnumProcessesarrivalTime = arrivalTime;processesnumProcessesexecutionTime = executionTime;processesnumProcessesremainingTime = executionTime;numProcesses++;}```3、先来先服务调度算法实现```c++void fcfsScheduling(Process processes, int numProcesses) {int currentTime = 0;for (int i = 0; i < numProcesses; i++){if (currentTime < processesiarrivalTime) {currentTime = processesiarrivalTime;}processesistartTime = currentTime;currentTime += processesiexecutionTime;processesifinishTime = currentTime;processesiwaitingTime = processesistartTime processesiarrivalTime;processesiturnaroundTime = processesifinishTime processesiarrivalTime;}}```4、短作业优先调度算法实现```c++void sjfScheduling(Process processes, int numProcesses) {int currentTime = 0;int minExecutionTime, selectedProcess;bool found;while (true) {found = false;minExecutionTime = INT_MAX;selectedProcess =-1;for (int i = 0; i < numProcesses; i++){if (processesiarrivalTime <= currentTime &&processesiremainingTime < minExecutionTime &&processesiremainingTime > 0) {found = true;minExecutionTime = processesiremainingTime;selectedProcess = i;}}if (!found) {break;}processesselectedProcessstartTime = currentTime;currentTime += processesselectedProcessremainingTime;processesselectedProcessfinishTime = currentTime;processesselectedProcesswaitingTime =processesselectedProcessstartTime processesselectedProcessarrivalTime;processesselectedProcessturnaroundTime =processesselectedProcessfinishTime processesselectedProcessarrivalTime;processesselectedProcessremainingTime = 0;}}```5、时间片轮转调度算法实现```c++void rrScheduling(Process processes, int numProcesses, int timeSlice) {int currentTime = 0;Queue<int> readyQueue;for (int i = 0; i < numProcesses; i++){readyQueueenqueue(i);}while (!readyQueueisEmpty()){int currentProcess = readyQueuedequeue();if (processescurrentProcessarrivalTime > currentTime) {currentTime = processescurrentProcessarrivalTime;}if (processescurrentProcessremainingTime <= timeSlice) {currentTime += processescurrentProcessremainingTime;processescurrentProcessfinishTime = currentTime;processescurrentProcesswaitingTime =processescurrentProcessstartTime processescurrentProcessarrivalTime;processescurrentProcessturnaroundTime =processescurrentProcessfinishTime processescurrentProcessarrivalTime;processescurrentProcessremainingTime = 0;} else {currentTime += timeSlice;processescurrentProcessremainingTime = timeSlice;readyQueueenqueue(currentProcess);}}}```6、性能指标计算函数```c++void calculatePerformanceMetrics(Process processes, int numProcesses, double& averageWaitingTime, double& averageTurnaroundTime) {double totalWaitingTime = 0, totalTurnaroundTime = 0;for (int i = 0; i < numProcesses; i++){totalWaitingTime += processesiwaitingTime;totalTurnaroundTime += processesiturnaroundTime;}averageWaitingTime = totalWaitingTime / numProcesses; averageTurnaroundTime = totalTurnaroundTime / numProcesses;}```7、主函数```c++int main(){Process processes100;int numProcesses = 0;//创建进程createProcess(processes, numProcesses, 1, 0, 5);createProcess(processes, numProcesses, 2, 1, 3);createProcess(processes, numProcesses, 3, 2, 4);createProcess(processes, numProcesses, 4, 3, 2);//先来先服务调度fcfsScheduling(processes, numProcesses);double fcfsAverageWaitingTime, fcfsAverageTurnaroundTime;calculatePerformanceMetrics(processes, numProcesses, fcfsAverageWaitingTime, fcfsAverageTurnaroundTime);cout <<"先来先服务调度的平均等待时间:"<<fcfsAverageWaitingTime << endl;cout <<"先来先服务调度的平均周转时间:"<<fcfsAverageTurnaroundTime << endl;//短作业优先调度sjfScheduling(processes, numProcesses);double sjfAverageWaitingTime, sjfAverageTurnaroundTime;calculatePerformanceMetrics(processes, numProcesses, sjfAverageWaitingTime, sjfAverageTurnaroundTime);cout <<"短作业优先调度的平均等待时间:"<<sjfAverageWaitingTime << endl;cout <<"短作业优先调度的平均周转时间:"<<sjfAverageTurnaroundTime << endl;//时间片轮转调度(时间片为 2)rrScheduling(processes, numProcesses, 2);double rrAverageWaitingTime, rrAverageTurnaroundTime;calculatePerformanceMetrics(processes, numProcesses, rrAverageWaitingTime, rrAverageTurnaroundTime);cout <<"时间片轮转调度(时间片为 2)的平均等待时间:"<< rrAverageWaitingTime << endl;cout <<"时间片轮转调度(时间片为 2)的平均周转时间:"<< rrAverageTurnaroundTime << endl;return 0;}```六、实验结果与分析1、先来先服务调度平均等待时间:40平均周转时间:85分析:先来先服务调度算法简单直观,但对于短作业可能会造成较长的等待时间,导致平均等待时间和平均周转时间较长。
操作系统原理 实验一:进程调度实验报告书-模板
![操作系统原理 实验一:进程调度实验报告书-模板](https://img.taocdn.com/s3/m/ceba1be2f61fb7360b4c6591.png)
计算机科学系实验报告书课程名:《操作系统原理》题目:进程调度班级:学号:姓名:操作系统原理实验——进程调度实验报告一、目的与要求1)进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C 语言编写一个进程调度模拟程序,使用优先级或时间片轮转法实现进程调度。
本实验可加深对进程调度算法的理解。
2)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果)3)于2012年10月22日以前提交本次实验报告(含电子和纸质报告,由学习委员以班为单位统一打包提交)。
2 实验内容或题目1)设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。
2)模拟调度程序可任选两种调度算法之一实现(有能力的同学可同时实现两个调度算法)。
3)程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。
4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。
3 实验步骤与源程序实验步骤:1、理解本实验中关于两种调度算法的说明。
2、根据调度算法的说明,画出相应的程序流程图。
3、按照程序流程图,用C语言编程并实现。
源程序:#include <stdlib.h>/*进程调度优先权法*/#include <stdio.h>#include <time.h>#define null 0struct PCB{int id;int prior;int used;int need;int run;char status;struct PCB * next;};main(){struct PCB *head,*rear,*temp,*run,*small,*p,*q;int i,j,t;printf("优先权进程调度算法\n\n 5个初始进程详细信息如下:\n\n");printf("\t进程号\t优先级\tused\tneed\t状态\t下一PCB\n\n");head=null;rear=null;for(i=1;i<=5;i++) { //动态生成含5个元素的队列temp=malloc(sizeof(struct PCB)); //动态分配一个PCB temp->id=i;temp->prior=rand()%5;temp->status='W';temp->next=null;if (head==null){head=temp;rear=head;}else{rear->next=temp;rear=temp;}}temp=head;while(temp!=null){printf("\t%d\t%d\t%c\t%d\n",temp->id,temp->prior,temp->status,temp->next);temp=temp->next;}getchar(); //让程序停下来,可以查看结果。
操作系统课程设计报告进程调度
![操作系统课程设计报告进程调度](https://img.taocdn.com/s3/m/77b0603bdcccda38376baf1ffc4ffe473368fdbf.png)
前言操作系统(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)” (7)4.3“高响应比优先调度算法” (10)4.4“优先级调度(非抢占式)算法” (13)5 系统测试及调试 (15)5.1测试 (15)5.2调试过程中遇到旳问题 (16)6 心得体会 (17)7 参照文献 (18)8 附录 (19)1问题概述编写一种进程调度程序, 容许多种进程并发执行。
进程的调度实验报告(3篇)
![进程的调度实验报告(3篇)](https://img.taocdn.com/s3/m/3d52daba7e192279168884868762caaedd33bafc.png)
第1篇一、实验目的通过本次实验,加深对操作系统进程调度原理的理解,掌握先来先服务(FCFS)、时间片轮转(RR)和动态优先级(DP)三种常见调度算法的实现,并能够分析这些算法的优缺点,提高程序设计能力。
二、实验环境- 编程语言:C语言- 操作系统:Linux- 编译器:GCC三、实验内容本实验主要实现以下内容:1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、服务时间、优先级、状态等信息。
2. 实现三种调度算法:FCFS、RR和DP。
3. 创建一个进程队列,用于存储所有进程。
4. 实现调度函数,根据所选算法选择下一个执行的进程。
5. 模拟进程执行过程,打印进程执行状态和就绪队列。
四、实验步骤1. 定义PCB结构体:```ctypedef struct PCB {char processName[10];int arrivalTime;int serviceTime;int priority;int usedTime;int state; // 0: 等待,1: 运行,2: 完成} PCB;```2. 创建进程队列:```cPCB processes[MAX_PROCESSES]; // 假设最多有MAX_PROCESSES个进程int processCount = 0; // 实际进程数量```3. 实现三种调度算法:(1)FCFS调度算法:```cvoid fcfsScheduling() {int i, j;for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;if (processes[i].usedTime == processes[i].serviceTime) { processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); }for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(2)RR调度算法:```cvoid rrScheduling() {int i, j, quantum = 1; // 时间片for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;processes[i].serviceTime--;if (processes[i].serviceTime <= 0) {processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); } else {processes[i].arrivalTime++;}for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(3)DP调度算法:```cvoid dpScheduling() {int i, j, minPriority = MAX_PRIORITY;int minIndex = -1;for (i = 0; i < processCount; i++) {if (processes[i].arrivalTime <= 0 && processes[i].priority < minPriority) {minPriority = processes[i].priority;minIndex = i;}}if (minIndex != -1) {processes[minIndex].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[minIndex].processName);processes[minIndex].usedTime++;processes[minIndex].priority--;processes[minIndex].serviceTime--;if (processes[minIndex].serviceTime <= 0) {processes[minIndex].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[minIndex].processName); }}}```4. 模拟进程执行过程:```cvoid simulateProcess() {printf("请选择调度算法(1:FCFS,2:RR,3:DP):");int choice;scanf("%d", &choice);switch (choice) {case 1:fcfsScheduling();break;case 2:rrScheduling();break;case 3:dpScheduling();break;default:printf("无效的调度算法选择。
C语言课程设计报告--进程调度
![C语言课程设计报告--进程调度](https://img.taocdn.com/s3/m/4b0c90380912a2161479296a.png)
C语言程序设计课程设计题目:进程调度院(系):专业班级:学号:学生姓名:指导教师:教师职称:起止时间:课程设计(报告)任务及评语目录第1章课程设计的目的与要求 (1)1.1 课程设计目的 (1)1.2 课程设计的实验环境 (1)1.3 课程设计的预备知识 (1)1.4 课程设计要求 (1)第2章课程设计内容 (2)2.1程序功能介绍 (2)2.2程序整体设计说明 (2)2.2.1设计思路 (2)2.2.2数据结构设计及用法说明 (3)2.2.3程序结构(流程图) (4)2.2.4各模块的功能及程序说明 (4)2.2.5程序结果 (5)2.3程序源代码及注释 (6)第3章课程设计总结 (13)参考资料 (14)第1章课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行Windows 2000/XP操作系统的微机系统。
C语言程序设计及相应的开发环境。
1.3 课程设计的预备知识熟悉C语言及C语言开发工具。
1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章课程设计内容2.1程序功能介绍在多道程序环境下,进程数目往往多于处理机数目,致使他们争用处理机。
这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行。
分配处理机的任务是由进程调度程序完成的。
一个进程被建立后,系统为了便于对进程进行管理,将系统中的所有进程按其状态,将其组织成不同点进程队列。
进程调度程序设计报告(源代码)
![进程调度程序设计报告(源代码)](https://img.taocdn.com/s3/m/158ad658580216fc700afd6b.png)
课程设计报告题 目 进程调度程序设计课 程 名 称 操作系统课程设计院 部 名 称 计算机工程学院专 业 计算机科学与技术班 级 13计算机科学与技术(单)(1)学 生 姓 名 周敏健学 号 1305201013课程设计地点 A104课程设计学时 20学时指 导 教 师 何 健金陵科技学院教务处制 成绩目录摘要 (3)一、课程设计的目的和要求 (4)二、系统需求分析 (4)三、总体设计 (5)四、详细设计 (6)五、测试、调试过程 (9)六、结论与体会 (11)七、参考文献 (12)附录:源程序 (12)课程设计课题进程调度程序设计摘要在多道系统中,对批处理作业需要进行作业调度。
作业调度是在资源满足的条件下,将处于就绪状态的作业调入存,同时生成与作业相对应的进程,并未这些进程提供所需要的资源。
进程调度需要根据进程控制块(PCB)中的信息,检查系统是否满足进程的资源需求。
只有在满足进程的资源需求的情况下,系统才能进行进程调度。
下面是几种常见的作业调度算法:先来先服务(FCFS)、优先算法、轮换算法、短作业优先算法以及最高响应比优先法等,本文将对前两种算法进行详细的介绍。
关键词:进程调度,优先级,FCFS,PCB,作业,资源一、课程设计的目的和要求1、目的进程调度是处理机管理的核心容。
本设计要求用C语言编写和调试一个简单的进程调度程序。
通过设计本可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。
2、要求1)进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
2)每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
北邮操作系统进程管理实验报告及源代码
![北邮操作系统进程管理实验报告及源代码](https://img.taocdn.com/s3/m/7cfeebf0dc3383c4bb4cf7ec4afe04a1b071b0aa.png)
进程管理实验报告1. 实验目的:(1)加深对进程概念的理解, 明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)分析进程争用资源的现象, 学习解决进程互斥的方法;(4)了解Linux系统中进程通信的基本原理。
2. 实验预备内容(1)阅读Linux的sched.h源码文件, 加深对进程管理概念的理解;(2)阅读Linux的fork()源码文件, 分析进程的创建过程。
3.环境说明本次实验使用的是win7下的VMWare workstation虚拟机, 安装了ubuntu系统在ubuntu系统下使用code::blocks IDE编写代码并执行程序的4.实验内容:1.进程的创建:(1)实验题目和要求:编写一段程序, 使用系统调用fork() 创建两个子进程。
当此程序运行时, 在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示字符“a”, 子进程分别显示字符“b”和“c”。
试观察记录屏幕上的显示结果, 并分析原因。
(2)程序设计说明:参照书上的例子进行设计, 详见源代码(3)程序运行结果截图:(4)程序分析:a,b,c随机出现, 因为父进程与两个子进程之间并没有同步措施, 所以a,b,c随机打印出来, 也就是三个进程的活动次序是随机进行的, 不同的系统可能有不同的进程调度方式。
(5)源程序:#include<sys/types.h>#include<stdio.h>#include<unistd.h>int main(){pid_t pid1,pid2;if((pid1=fork())<0){printf("Fork Failed.\n");exit(-1);}else if((pid1=fork())==0)printf("b\n");else{if((pid2=fork())<0){printf("Fork Failed.\n");exit(-1);}else if((pid2=fork())==0)printf("c\n");else{wait(NULL);printf("a\n");exit(0);}}return 0;}2.进程的控制:要求一:(1)实验题目和要求:修改已经编写的程序, 将每个进程输出一个字符改为每个进程输出一句话, 再观察程序执行时屏幕上出现的现象, 并分析原因。
操作系统综合性实验报告~进程调度(含代码)
![操作系统综合性实验报告~进程调度(含代码)](https://img.taocdn.com/s3/m/7f86120f011ca300a7c3901e.png)
XXXXXX计算机系综合性实验实验报告课程名称操作系统B实验学期XXXX 至XXXX 学年第X 学期学生所在系部计算机系年级XXXX 专业班级XXXXXX学生姓名XXXX 学号XXXXXXXXXXXX任课教师XXX实验成绩计算机系制《操作系统B 》课程综合性实验报告开课实验室:年月日附代码:#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node{char name[10]; //进程的名字int round; //一次分配CPU的时间片int cputime; //CPU已执行时间int needtime; //进程执行所需要的时间char state; //进程的状态,W-就绪态,R-执行态,F-完成态int count; //记录进程执行的次数struct node *next; //队列指针}PCB;PCB *ready=NULL,*run=NULL,*finish=NULL; //定义三个队列,就绪队列,执行队列和完成队列int num;void GetFirst(); //从就绪队列取得第一个节点void Output(); //输出各队列信息void InsertTime(PCB *in); //插入就绪片队列void InsertFinish(PCB *in); //插入完成队列void TimeCreate(); //时间片输入函数void RoundRun(); //时间片轮转调度void main(){printf("\n****** 欢迎光临指导******\n");printf("\n****** 时间片轮转进程调度算法******\n");printf("\n****** 计科B082 韩友******\n");printf("\n****** 200807014225 ******\n");printf("\n****** 2011年5月15日******\n");printf("\n请输入要创建的进程数目:\n");scanf("%d",&num);getchar(); //吸收回车符号TimeCreate();RoundRun();Output();}void GetFirst() //取得第一个就绪队列节点{run = ready;if(ready!=NULL){run ->state = 'R';ready = ready ->next;run ->next = NULL;}}void Output() //输出队列信息{PCB *p;p = ready;printf("进程轮数cpu时间需要时间进程状态计数器\n");while(p!=NULL){printf("%s\t%d\t%d\t%d\t%c\t%d\n",p->name,p->round,p->cputime,p->needtime,p->state,p->count);p = p->next;}p = finish;while(p!=NULL){printf("%s\t%d\t%d\t%d\t%c\t%d\n",p->name,p->round,p->cputime,p->needtime,p->state,p->count);p = p->next;}p = run;while(p!=NULL){printf("%s\t%d\t%d\t%d\t%c\t%d\n",p->name,p->round,p->cputime,p->needtime,p->state,p->count);p = p->next;}}void InsertTime(PCB *in) //将进程插入到就绪队列尾部{PCB *fst;fst = ready;if(ready == NULL){in->next = ready;ready = in;}{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void InsertFinish(PCB *in) //将进程插入到完成队列尾部{PCB *fst;fst = finish;if(finish == NULL){in->next = finish;finish = in;}else{while(fst->next != NULL)fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void TimeCreate() //时间片轮转输入函数{PCB *tmp;int i;printf("输入进程名字和进程时间片所需时间:\n");for(i = 0;i < num; i++){if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL){perror("malloc");exit(1);}scanf("%s",tmp->name);getchar();scanf("%d",&(tmp->needtime));tmp ->cputime = 0;tmp ->state ='W';tmp ->round = 2; //假设每个进程所分配的时间片是2tmp ->count = 0;InsertTime(tmp);}}void RoundRun() //时间片轮转调度算法{int flag = 1;GetFirst();while(run != NULL){Output();while(flag){run->count++;run->cputime++;run->needtime--;if(run->needtime == 0) //进程执行完毕{run ->state = 'F';InsertFinish(run);flag = 0;}else if(run->count == run->round)//时间片用完{run->state = 'W';run->count = 0; //计数器清零,为下次做准备InsertTime(run);flag = 0;}}flag = 1;GetFirst();}}。
进程调度 实验报告
![进程调度 实验报告](https://img.taocdn.com/s3/m/061dcf38bb4cf7ec4bfed02e.png)
一、实验目的 多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那
个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度 问题,加深对进程调度的理解。 二、实验内容 1.优先权法、轮转法
简化假设 1)进程为计算型的(无 I/O) 2)进程状态:ready、running、finish 3)进程需要的 CPU 时间以时间片为单位确定 2.算法描述 1) 优先权法——动态优先权
/*******************优先权调度算法所需函数 *****************************************************/ struct process1*creatlist1(int n) {
srand((int)time(0)); struct process1 *first =new process1; first ->next=NULL; for (int i=0;i<n;i++) {
struct process1 *s; s =new process1; s->pcb =i; s-> privilege=random(20)+5; s->cpu=random(20)+1; insert1(first,s ); } return first; } void insert1(struct process1 *first,struct process1 *s) //插入节点 { struct process1 *p=search(first,s); s->next=p->next; p->next=s; //return; }
进程调度源代码
![进程调度源代码](https://img.taocdn.com/s3/m/c168c862f5335a8102d2204e.png)
proc[ReadyPoint].p_state ='C';
RunPoint=ReadyPoint;
proc[ReadyPoint].p_cputime =proc[ReadyPoint].p_rserial[proc[ReadyPoint].p_pos] ;
}
n=WaitPoint;
printf("\n Waiting Process ...... \n");
while(n!=-1) // 显示阻塞进程信息
{
printf(" No.%d ID:],m,m,m\n",n,proc[n].p_pid,proc[n].p_starttime,proc[n].p_rserial[proc[n].p_pos],proc[n].p_iotime);
proc[i].p_next=-1;
}
printf("\n---------------------------\n 建立了- 个进程数据序列\n\n", ProcNumber);
DisData();
printf("\nPress Any Key To Continue.......");
// 赋其他字段的值
proc[i].p_pos=1;
proc[i].p_starttime=((float) rand() / 32767) *49+1;
proc[i].p_endtime=0;
proc[i].p_cputime=proc[i].p_rserial[1];
proc[i].p_iotime=proc[i].p_rserial[2];
进程调度程序设计
![进程调度程序设计](https://img.taocdn.com/s3/m/d07f7576a417866fb84a8e50.png)
一. 设计目的:通过课程设计, 加深对操作系统对程序执行的理解,掌握操作系统的多程序运行原理,能模拟操作系统设计相应的进程调度算法,掌握操作系统的基本原理及功能, 具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力。
二. 设计内容:1、设计进程控制块PCB表结构,分别适用于可强占的优先数调度算法和循环轮转调度算法。
2、建立进程就绪队列。
对两种不同算法编制入链子程序。
3、编制两种进程调度算法:1)可强占的优先进程调度;2)循环时间片轮转调度4、设计操作系统运行的指令。
三.设计过程1、实现功能1、设计进程控制块PCB表结构,分别适用于可强占的优先数调度算法和循环轮转调度算法。
2、建立进程就绪队列。
对两种不同算法编制入链子程序。
3、编制两种进程调度算法:1)可强占的优先进程调度;2)循环时间片轮转调度4、设计操作系统运行的指令。
2、设计思路1、本程序用两种算法对多个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。
2、为了便于处理,程序中的某进程运行时间以时间片为单位计算。
各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
3、在优先数算法中,优先数的值为31与运行时间的差值。
进程每执行一次,优先数减1,CPU时间片数加1,进程还需要的时间片数减1。
在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。
4、设计程序指令,MOV n //把整数n赋给累加器AADD n //从累加器A的值减去整数n,结果送到累加器A。
SUB n //从累加器A的值减去整数n,结果送到累加器A。
MUL n //从累加器A的值乘以整数n,结果送到累加器A。
DIV n //从累加器A的值除以整数n,结果送到累加器A。
JEQ m //F为0跳转到mJLG m //F大于0跳转到mJLE m //F大于等于0跳转到mJMP m //无条件跳转到mOUT port //累加器的内容输出到端口port。
进程调度实验报告源码
![进程调度实验报告源码](https://img.taocdn.com/s3/m/f887d4b3112de2bd960590c69ec3d5bbfc0ada43.png)
一、实验目的本次实验旨在通过模拟进程调度过程,加深对进程调度算法的理解,并掌握进程调度程序的设计与实现方法。
实验内容主要包括:创建进程、进程调度、进程执行、进程结束等。
二、实验环境操作系统:Linux编程语言:C/C++三、实验内容1. 进程调度算法本实验采用三种进程调度算法:FIFO(先进先出)、时间片轮转法、多级反馈队列调度算法。
2. 进程调度程序设计进程调度程序主要由以下部分组成:(1)进程控制块(PCB)PCB用于描述进程的基本信息,包括进程名、到达时间、需要运行时间、已运行时间、进程状态等。
(2)就绪队列就绪队列用于存储处于就绪状态的进程,按照进程的优先级或到达时间进行排序。
(3)进程调度函数进程调度函数负责从就绪队列中选择一个进程进行执行,并将CPU分配给该进程。
(4)进程执行函数进程执行函数负责模拟进程的执行过程,包括进程的创建、执行、结束等。
四、实验源码```c#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAX_PROCESSES 10typedef struct PCB {int pid;int arrival_time;int need_time;int used_time;int priority;int state; // 0: 等待 1: 运行 2: 完成} PCB;PCB processes[MAX_PROCESSES];int process_count = 0;typedef struct Queue {PCB queue;int front;int rear;int size;} Queue;Queue ready_queue;void init_queue(Queue q) {q->queue = (PCB )malloc(sizeof(PCB) MAX_PROCESSES); q->front = q->rear = 0;q->size = 0;}void enqueue(Queue q, PCB p) {if (q->size == MAX_PROCESSES) {printf("Queue is full.\n");return;}q->queue[q->rear] = p;q->rear = (q->rear + 1) % MAX_PROCESSES; q->size++;}PCB dequeue(Queue q) {if (q->size == 0) {printf("Queue is empty.\n");return NULL;}PCB p = &q->queue[q->front];q->front = (q->front + 1) % MAX_PROCESSES; q->size--;return p;}int is_empty(Queue q) {return q->size == 0;}void print_queue(Queue q) {printf("Queue: ");for (int i = 0; i < q->size; i++) {PCB p = &q->queue[(q->front + i) % MAX_PROCESSES];printf("PID: %d, Arrival Time: %d, Need Time: %d, Used Time: %d, Priority: %d, State: %d\n",p->pid, p->arrival_time, p->need_time, p->used_time, p->priority, p->state);}}void init_processes() {for (int i = 0; i < MAX_PROCESSES; i++) {processes[i].pid = i;processes[i].arrival_time = rand() % 10;processes[i].need_time = rand() % 10 + 1;processes[i].used_time = 0;processes[i].priority = rand() % 3;processes[i].state = 0;}}void schedule() {int time = 0;while (process_count > 0) {for (int i = 0; i < process_count; i++) {PCB p = &processes[i];if (p->arrival_time == time) {enqueue(&ready_queue, p);p->state = 1;}}if (!is_empty(&ready_queue)) {PCB p = dequeue(&ready_queue);p->used_time++;printf("Process %d is running.\n", p->pid);if (p->used_time == p->need_time) {p->state = 2;printf("Process %d is finished.\n", p->pid); }}time++;}}int main() {srand(time(NULL));init_queue(&ready_queue);init_processes();process_count = rand() % MAX_PROCESSES + 1;schedule();print_queue(&ready_queue);return 0;}```五、实验结果与分析1. FIFO调度算法实验结果表明,FIFO调度算法按照进程的到达时间进行调度,可能导致短作业等待时间长,效率较低。
实验进程调度源代码
![实验进程调度源代码](https://img.taocdn.com/s3/m/1717bbc17f1922791688e820.png)
实验进程调度源代码实验2 进程调度(一)目的和要求进程调度是处理机管理的核心内容。
本实验要求用高级语言编写和调试一个简单的进程调度程序。
通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施方法。
(二)实验内容(1)设计进程控制块PCB结构,分别适用于优先数调度算法和循环轮转调度算法。
PCB结构包括以下信息:进程标识符,进程优先数(或轮转时间片),进程所占用的CPU时间、进程状态,当前队列指针等。
根据调度算法不同,PCB结构的内容可适当做增删。
(2)建立进程就绪队列。
对两种不同算法编制入链子程序。
(3)编制两种进程调度算法:1)优先数调度;2)循环轮转调度。
(三)实验环境用BORLAND C语言(四)范例说明采用C语言编写程序,选用优先数法或简单轮转法对五个进程进行调度,每个进程处于运行(RUN),就绪(READY)和完成(FINISH)三种状态之一,并假定起始状态为就绪状态。
1.数据结构PCB结构如下:NAME 进程标识符PRIO / ROUND 优先数/ 时间片CPUTIME 进程已占用的CPU时间NEEDTIME 进程到完成还需要的CPU时间NEXT 处于同一状态的下一进程的地址STATUS 进程所处的状态“R”进程处于运行状态“W”进程处于就绪状态“F”进程处于完成状态2.程序说明(1)在优先数算法中,进程每执行一次,优先数减3,CPU时间片加1,进程还需要的时间片数减1。
在轮转法中,采用固定时间片,时间片数为2,进程每执行一次,CPU时间片数加2,进程还需要的时间片数减2,并排在就绪队列的队尾。
(2)程序结构说明如下:①INSERT1:把未完成且优先数小于别的进程的进程PCB按进程优先数的顺序插入到就绪队列中。
②INSERT2:轮转法中使用的过程,将执行一个单位时间片数(为2)且还未完成的进程的PCB插入到就绪队列队尾。
③FIRSTIN:将就绪队列中的第一个进程投入运行。
进程调度算法实验报告
![进程调度算法实验报告](https://img.taocdn.com/s3/m/a86de1a84afe04a1b071de60.png)
进程调度算法实验报告作业调度一、实验名称作业调度算法二、实验目标在单道环境下编写作业调度的模拟程序,以加深对作业调度的理解。
单道环境的特点使被调度的作业占有所有的资源。
实现的算法有先来先服务,最短作业优先,最高响应比三种作业调度算法。
三、实验环境要求:1.PC机。
2.Windows;3.CodeBlocks四、实验基本原理1.本实验设计一个可指定作业个数的作业调度系统。
可以输出先来先服务,最短作业优先,最高响应比三种作业调度算法的结果。
2.先来先服务就是按照各个作业进入系统的自然次序进行调度。
最短作业优先就是优先调度并且处理短作业。
最高响应比优先就是根据在程序运行过程中的最高响应比对应的作业先进行调度处理。
3.在设计程序过程中,将time相关的内容封装到类中,重载了加减乘除和输入输出以及比较运算符,方便12:00这种形式的数据的加减乘除运算和比较运算,五、数据结构设计1.时间类class time {public:time(int x = 0, int y = 0) {time::hour = x;time::minute = y;}time& operator = (const time &t1){this->hour=t1.hour;this->minute=t1.minute;return *this;}time operator + (time t2){int minutes,hours;minutes = (minute + t2.minute) % 60;hours=hour+t2.hour+ (minute + t2.minute) /60;return time(hours,minutes);}time operator -(time t2){int minutes,hours;minutes =minute - t2.minute;if (minute<0) {minutes += 60;hour--;}hours = hour - t2.hour;return time(hours,minutes);}friend bool operator <(time t1, time t2){if (t1.hour < t2.hour) {return true;}else if(t1.hour==t2.hour){if (t1.minute <= t2.minute) {return true;}}return false;}friend ostream& operator <<(ostream& out, const time &t1) { return out << t1.hour << ":" << t1.minute*1.00 ;}friend istream& operator >>(istream &in, time &t1) { int h, m;scanf("%d:%d", &h,&m);t1.hour = h;t1.minute = m;return in;}public:int hour;int minute;};2.作业内容typedef struct JOB{char name[20];//Job nametime in_time;int run_time;time st_time;time end_time;int round_time;//周转时间int wait_time;double rounds_time;//带权周转double reson_radio;//响应比}job;六、流程图七、源代码#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>using namespace std; class time {public:time(int x = 0, int y = 0) {time::hour = x;time::minute = y;}time& operator = (const time &t1){this->hour=t1.hour;this->minute=t1.minute;return *this;}time operator + (time t2){int minutes,hours;minutes = (minute + t2.minute) % 60;hours=hour+t2.hour+ (minute + t2.minute) /60;return time(hours,minutes);}time operator -(time t2){int minutes,hours;minutes =minute - t2.minute;if (minute<0) {minutes += 60;hour--;}hours = hour - t2.hour;return time(hours,minutes);}friend bool operator <(time t1, time t2){if (t1.hour < t2.hour) {return true;}else if(t1.hour==t2.hour){if (t1.minute <= t2.minute) {return true;}}return false;}friend ostream& operator <<(ostream& out, const time &t1) {return out << t1.hour << ":" <<t1.minute*1.00 ;}friend istream& operator >>(istream &in, time &t1) {int h, m;scanf("%d:%d", &h,&m);t1.hour = h;t1.minute = m;return in;}public:int hour;int minute;};typedef struct JOB{char name[20];//Job nametime in_time;int run_time;time st_time;time end_time;int round_time;//周转时间int wait_time;double rounds_time;//带权周转double reson_radio;//响应比}job;double sum_time;//全部作业周转时间和double sums_time;//全部作业带权周转时间和int n;//job counts//重载maxtime maxn(time t1, time t2) {if(t1.hour>t2.hour){return t1;}else if(t1.hour==t2.hour){if (t1.minute > t2.hour) {return t1;}}return t2;}//eg:120转化成2:0time m_exchange_h(int run_time) {time run;run.hour = run_time / 60;run.minute = run_time % 60;return run;}//eg: 2:0 转化成120int h_exchange_m(time t1) {return t1.hour * 60 + t1.minute;}//先来先服务;void job_input(job *x) {cout << "作业\t进入时间\t估计运行时间(分钟)\t开始时间\t结束时间\t周转时间(分钟)\t 带权周转时间" << endl;for (int i = 0; i < n; i++) {cout << x[i].name <<"\t"<< x[i].in_time<<"\t\t"<< x[i].run_time <<"\t\t\t"<< x[i].st_time <<"\t\t"<<x[i].end_time <<"\t\t"<<x[i].round_time <<"\t\t"<< x[i].rounds_time << endl;}cout << "作业平均周转时间T=" << sum_time/n<< endl;cout << "作业平均带权周转时间T=" << sums_time / n << endl;}void FCFS(job *x) {sum_time = 0;sums_time = 0;time run = m_exchange_h(x[0].run_time);x[0].st_time = x[0].in_time;x[0].end_time = x[0].st_time + run;x[0].round_time = h_exchange_m(x[0].end_time - x[0].in_time); sum_time += x[0].round_time;x[0].rounds_time = x[0].round_time*1.0 / x[0].run_time;sums_time += x[0].rounds_time;for (int i = 1; i < n; i++) {x[i].st_time = maxn(x[i].in_time, x[i -1].end_time);x[i].end_time = x[i].st_time + m_exchange_h(x[i].run_time);x[i].round_time = h_exchange_m(x[i].end_time - x[i].in_time);x[i].rounds_time = x[i].round_time*1.0 / x[i].run_time;sum_time += x[i].round_time;sums_time += x[i].rounds_time;}cout << "\n【先来先服务作业调度算法计算结果】\n" << endl;job_input(x);}//短作业优先;void SJF(job *x) {int flag[100000] ;memset(flag, 0, sizeof(flag));sum_time = 0;sums_time = 0;time run = m_exchange_h(x[0].run_time);x[0].st_time = x[0].in_time;x[0].end_time = x[0].st_time + run;x[0].round_time = h_exchange_m(x[0].end_time - x[0].in_time); sum_time += x[0].round_time;x[0].rounds_time = x[0].round_time*1.0 / x[0].run_time;sums_time += x[0].rounds_time;int i = 1;//已经运行的程序int e = 0;//上一个运行的程序flag[0] = 1;while (i <n) {int temp = -1;int time_min = 99999999;for (int j = 1; j < n; j++) {if(x[j].in_time<x[e].end_time&&flag[j]!=1&&x[j] .run_time<time_min) {//cout<<"小于:"<<x[j].name<<endl;time_min = x[j].run_time;temp = j;}}if (temp != -1) {x[temp].st_time = x[e].end_time;e = temp;}else {e++;x[e].st_time = x[e].in_time;}x[e].end_time = x[e].st_time + m_exchange_h(x[e].run_time);x[e].round_time = h_exchange_m(x[e].end_time - x[e].in_time);x[e].rounds_time = x[e].round_time*1.0 / x[e].run_time;sum_time += x[e].round_time;sums_time += x[e].rounds_time;flag[e] = 1;i++;}cout << "\n【短作业优先调度算法计算结果】\n" << endl;job_input(x);}//最高响应比优先;void HRN(job *x) {int flag[100000];memset(flag, 0, sizeof(flag));sum_time = 0;sums_time = 0;time run = m_exchange_h(x[0].run_time);x[0].st_time = x[0].in_time;x[0].end_time = x[0].st_time + run;x[0].round_time = h_exchange_m(x[0].end_time - x[0].in_time); sum_time += x[0].round_time;x[0].rounds_time = x[0].round_time*1.0 / x[0].run_time;sums_time += x[0].rounds_time;int i = 1;//已经运行的程序int e = 0;//上一个运行的程序flag[0] = 1;while (i <n) {int temp = -1;double radio_max = 0;for (int j = 1; j < n; j++) {if(x[j].in_time<x[e].end_time&&flag[j] != 1) {x[j].reson_radio=h_exchange_m(x[e].end_tim e- x[j].in_time)*1.0/ x[j].run_time;if (x[j].reson_radio > radio_max) {temp = j;radio_max=x[j].reson_radio;}}}if (temp != -1) {x[temp].st_time = x[e].end_time;e = temp;}else {e++;x[e].st_time = x[e].in_time;}x[e].end_time = x[e].st_time +m_exchange_h(x[e].run_time);x[e].round_time = h_exchange_m(x[e].end_time - x[e].in_time);x[e].rounds_time = x[e].round_time*1.0 / x[e].run_time;sum_time += x[e].round_time;sums_time += x[e].rounds_time;flag[e] = 1;i++;}cout << "\n【最高响应比调度算法计算结果】\n" << endl;job_input(x);}int main(){cout << "作业总数: " ;cin >> n;cout<<endl;job *jobs = new job[n];cout << "作业信息输入(请按照进入时间先后顺序输入):" << endl;for (int i = 0; i < n; i++) {cout<<endl;cout << "正在读入第" << i + 1 << "个作业:" << endl;cout<<endl;cout << "作业名称: ";cin >> jobs[i].name;cout << "作业进入时间: ";cin >> jobs[i].in_time;cout << "作业估计运行时间(分钟): ";cin >> jobs[i].run_time;}//先来先服务;FCFS(jobs);//短作业优先;SJF(jobs);//最高响应比优先;HRN(jobs);return 0;}八、运行结果九、结果分析三种算法根据输入得出的输出和书上的结果相符,证明算法实现正确。
进程调度实验报告
![进程调度实验报告](https://img.taocdn.com/s3/m/a639f7ff541810a6f524ccbff121dd36a32dc41c.png)
进程调度实验报告书
Processes Scheduling Demo Report
计算机99本三50 冯志良
○实验目的:
模拟多级反馈队列调度算法。
○程序界面:
○程序说明:
此程序在K6II350,TC2.0环境下通过翻译、运行。
演示了五个优先级队列,时间片分别为8、16、32、64,128。
○程序操作:
如界面所示,所以命令通过键盘输入到Command Box中,或通过快捷键完成。
创建进程:create [life [id]]
说明:ife是生命值(1-999),id是进程号(0-99),均为可选,其中进程号为能重复。
例如:create 则创建一个生命值及进程号均为随机的进程
create 88 则创建一个生命值为88,进程号为随机的进程
create 88 20 则创建一个生命值为88,进程号为20的进程
按F1键等于只输入了create
杀进程:kill <id>
说明:id是进程号(0-99),进程号是必选的。
不能杀正在运行的进程,只能杀在等待的进程。
例如:kill 10 则杀死进程与为10的进程
自动/手动:F2
说明:当为自动时,进程的调度是自动进行的。
当为手动时,只有输入next或按F3键才会运行下一步
退出:quit 或按ESC键
○程序实现(源程序和执行文件均在引文件所在的文件夹中,请以全屏方面运行执行文件) 主程序流程图:
调度模块流程图:。
进程调度算法设计实验报告
![进程调度算法设计实验报告](https://img.taocdn.com/s3/m/a9a41f6058fafab069dc02cd.png)
进程调度算法的设计一、实验题目:实现先来先服务调度算法(FCFS)实现时间片轮转调度算法(RR)二、实验目的:通过对进程调度算法的设计,深入理解进程调度的原理。
进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
进程调度分配处理机,是控制协调进程对CPU的竞争,即按一定的调度算法从就绪队列中选中一个进程,把CPU的使用权交给被选中的进程。
三、实验原理:1.先来先服务(FCFS)调度算法每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。
该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。
将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。
它优先考虑在系统中等待时间最长的作业,而不管要求运行时间的长短按照就绪进程进入就绪队列的先后次序进行调度,简单易实现,利于长进程,CPU繁忙型作业,不利于短进程,排队时间相对过长2.时间片轮转调度算法RR时间片轮转法主要用于进程调度。
采用此算法的系统,其程序就绪队列往往按进程到达的时间来排序。
进程调度按一定时间片(q)轮番运行各个进程.进程按到达时间在就绪队列中排队,调度程序每次把CPU分配给就绪队列首进程使用一个时间片,运行完一个时间片释放CPU,排到就绪队列末尾参加下一轮调度,CPU 分配给就绪队列的首进程。
四、数据结构:数组五、程序代码:package sufa;import java.util.Arrays;import java.util.Scanner;public class Dispatch {public static void main(String[] args){int slice = 1; //时间片System.out.println("请输入要创建的进程数目:");Scanner reader = new Scanner(System.in);int num = reader.nextInt(); //用户要输入的进程数Process1 arr[] = new Process1[num]; //创建多个进程System.out.println("请分别输入进程的名称、到达时间以及区间时间");for(int i=0; i<arr.length; i++){arr[i] = new Process1(); //得到用户输入的各值}Arrays.sort(arr); //根据到达时间对进程数组排序int time =arr[0].arrtime; //赋值为最先到达的进程的到达时间System.out.println("-----开始进入FCFS算法-----");System.out.println(" "+"arrtime"+" "+"burstime"+" "+"overtime"+" "+"周转时间");for(int i =0; i<arr.length; i++){arr[i].overtime = arr[i].bursttime+time; //计算进程的结束时间time = time +arr[i].bursttime;arr[i].turnovertime = arr[i].overtime - arr[i].arrtime; //计算进程的周转时间System.out.println("进程"+arr[i].id+"开始运行"+"\t"+arr[i].arrtime+"\t"+arr[i].bursttime+"\t"+arr[i].overtime+"\t"+arr[i ].turnovertime);}int count = arr.length;System.out.println("-----开始进入RR算法-----");System.out.println(" "+"lasttime");while(count>0){for(int i=0; i<arr.length; i++){if(arr[i].bursttime>0){ //如果剩余区间还有时间 arr[i].bursttime=arr[i].bursttime-slice; //每循环运行一次就减去时间片,并打印下面语句System.out.println("进程"+arr[i].id+"开始运行"+"\t"+arr[i].bursttime);}if(arr[i].bursttime==0)count --; //当有某个进程的剩余时间为0的时候,count进行减1,当count减到等于0时,即每个进程都没有剩余时间了,就不再运行了}}}}class Process1 implements Comparable{int id; //进程名称int arrtime; //到达时间int bursttime; //区间时间int overtime; //结束时间double turnovertime; //周转时间public Process1(){ //读取用户输入的各个值Scanner reader = new Scanner(System.in);this.id = reader.nextInt();this.arrtime = reader.nextInt();this.bursttime = reader.nextInt();}@Overridepublic int compareTo(Object o) {// TODO Auto-generated method stubProcess1 pcb = (Process1)o;if(this.arrtime>= pcb.arrtime) //重写方法实现Comparable接口,按照到达时间的大小进行排序return 1;elsereturn -1;}}六、运行结果:七、实验心得:这次的实验实现FCFS算法和RR算法虽然用程序算法实现了模拟进程调度的整个过程,但是并未能考虑深入到操作系统的根本上用不同的队列存储不同状态下的进程来实现算法调度,但通过这次对进程调度算法设计的实现,还是对进程调度有了更深入更清楚的了解,以后的程序编写不论是实验还是项目开发,无论大小,都应该把程序的整体框架构建好,提高重用性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告题 目 进程调度程序设计课 程 名 称 操作系统课程设计院 部 名 称 计算机工程学院专 业 计算机科学与技术班 级 13计算机科学与技术(单)(1) 学 生 姓 名 周敏健学 号 1305201013课程设计地点 A104课程设计学时 20学时指 导 教 师 何 健金陵科技学院教务处制 成绩目录摘要 (3)一、课程设计的目的和要求 (4)二、系统需求分析 (4)三、总体设计 (5)四、详细设计 (6)五、测试、调试过程 (9)六、结论与体会 (11)七、参考文献 (12)附录:源程序 (12)课程设计课题进程调度程序设计摘要在多道系统中,对批处理作业需要进行作业调度。
作业调度是在资源满足的条件下,将处于就绪状态的作业调入内存,同时生成与作业相对应的进程,并未这些进程提供所需要的资源。
进程调度需要根据进程控制块(PCB)中的信息,检查系统是否满足进程的资源需求。
只有在满足进程的资源需求的情况下,系统才能进行进程调度。
下面是几种常见的作业调度算法:先来先服务(FCFS)、优先算法、轮换算法、短作业优先算法以及最高响应比优先法等,本文将对前两种算法进行详细的介绍。
关键词:进程调度,优先级,FCFS,PCB,作业,资源一、课程设计的目的和要求1、目的进程调度是处理机管理的核心内容。
本设计要求用C语言编写和调试一个简单的进程调度程序。
通过设计本可以加深理解有关进程控制块、进程队列的概念,并体会和了解最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法的具体实施办法。
2、要求1)进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
2)每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
4)每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
5)就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
6)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
7)重复以上过程,直到所要进程都完成为止。
二、系统需求分析编写一个模拟进程调度的程序,将每个进程抽象成一个进程控制块PCB,PCB 用一个结构体描述。
采用两种不同的调度算法来实现功能,主要有如下几大功能模块组成。
(1)创建优先数PCB模块用循环来实现对每个进程的进程名、进程优先数(随机分配)以及所需时间的录入。
将进程队列存放到就绪队列等待执行。
(2)优先数调度算法模块从优先级最高(就绪队列的第一个进程)的开始执行,每执行一次优先数减1,并重新放入就绪队列进行排序,对排序完的继续运行直到所有进程都结束。
(3)FCFS创建PCB模块对N个进程的信息进行输入:进程名、到达时间、需要时间等。
每输入一个进程,按进程的到达时间进行排序,记下前驱和后继的方法。
(4)FCFS调度算法模块当系统时间与第一个进程到达时间一致时,将进程状态置为Run,直到这个进程执行完,再判断下个进程的到达时间,若系统时间大于下个进程的到达时间,即上个进程的结束时间就是下个进程的开始时间,反之就等待系统时间。
进程结束后放入完成队列。
(5)主函数及菜单显示由主菜单进入显示界面,进行算法选择。
三、总体设计进程是程序在处理机上的执行过程。
进程存在的标识是进程控制块(PCB),所谓系统创建一个进程,就是由系统为某个程序设置一个PCB,用于对该进程进行控制和管理。
进程任务完成,由系统收回其PCB,该进程便消亡。
每个进程可有三个状态:运行状态、就绪状态和完成状态。
因此设计三个链队列,finish 为完成队列的头指针,wait为就绪队列的头指针。
因为每一时刻,CPU只能运行一个进程,所以运行队列只有一个run指针指向当前运行的进程。
考虑到处理的方便,将它们设为全局变量。
总体结构框架图:四、详细设计(1)优先数调度算法优先调度算法要为每一个进程设一个优先数,它总是把处理机给就绪队列中具有最高优先权的进程。
常用的算法有静态优先权法和动态优先权法。
本程序采用了动态优先权法,使进程的优先权随时间而改变。
初始的进程优先数取决于进程运行所需的时间,时间大,则优先数低,所以采取了将进程优先数定位最大的那个进程,随着进程的运行优先数进行调整,每次运行时都是从就绪队列中选取优先数最大的进程运行,所以将就绪队列按照优先数的大小从高到低排序,这样,每次取队头进程即可。
优先数算法 界面F C F S 算法开始(2)先来先服务调度算法先来先服务调度算法是按照进程进入就绪队列的先后顺序调度并分配处理机执行。
先来先服务算法是一种不可抢占的算法,先进入就绪队列的进程,先被处理机运行,一旦一个进程占有了处理机,它就一直运行下去,直到该进程完成工作或者因为等待某种事件而不能继续运行时才释放处理机。
优先数调度算法输入进程信息将进程放入ready 队列进程按优先数大小排序 取ready 队列首进程送入run执行一个时间片,优先数-1,运行时间+1是否还需输入进程 YN 输入时进程是否完成N执行队列时 放入完成队列YFCFS 调度算法输入进程信息将进程放入ready 队列进程按到达先后顺序排序 取ready 队列首进程送入run执行一个时间片,运行时间+1是否还需输入进程 YN 输入时进程是否完成 N执行队列时 放入完成队列Y五、测试、调试过程界面优先数算法输入优先数算法输出FCFS算法输入FCFS算法输出遇到的问题:在设计程序时,在算法上面出现了一些错误,优先数不是由大到小排序,而是应该这样理解,当进程执行一个时间片时,优先数减一(使用CPU的时间变少,反而优先级高),因此,优先级高的优先数应该是比较小的,而不是优先数大的优先级大。
在程序调试时,链表发生了错误,该内存不可写或者就是程序直接结束,但最终结果不是我想要的,经过一番折腾,最后发现,头指针和头结点混淆,有些地方没有给指针分配内存,语句的先后顺序不正确,以及没有考虑到链表最后没有设置结束标志。
六、结论与体会做这个程序我断断续续的算下来应该总共用了2天,主要是花时间在观察别人的算法读别人的程序,然后才开始写自己的程序,期间参考了前人的程序并进行了改善和加工,这让我对进程调度的理解再次加深了,这是在平常学习的基础上,与程序相结合的过程,让我再次感受到编程给我们带来的无穷魅力,只要自己有兴趣,其实编程也是一件有趣的事,为了达到一定的要求,我们必须多次尝试用不同的方法去实现它,比如,进程调度有先来先服务算法,对于这个算法,可以用数组实现,也可以用链表实现,但是到底哪个更好哪个更灵活呢,相信学过C语言的人都知道肯定是用链表实现最好了。
这次设计还是有一些不足之处的,比如在算法和运行效率上还是有些欠缺的,需要进一步去改善程序代码,提高效率,减少冗余和错误,让使用者更清晰的观察和理解进程调度。
七、参考文献[1]任爱华、罗晓峰. 操作系统实用教程(第三版)[M].北京:清华大学出版社,2009[2]谌卫军、王浩娟. 操作系统[M]. 北京:清华大学出版社,2012.5[3](日)前桥和弥(Maebasi Kazuya). 征服C指针[M]. 吴雅明译. 北京:人民邮电出版社,2013.2附录:源程序#include<stdio.h>#include<stdlib.h>#include<string.h>#include<windows.h>#include<time.h>typedef struct node{char name[10]; //进程名int prio; //进程优先数int cputime; //进程占用CPU时间int needtime; //进程到完成还要的时间int arrivetime; //进程到达时间int starttime; //进程开始时间int finishtime; //进程完成时间int servicetime; //进程服务时间char state; //进程的状态struct node *next;}PCB;PCB *finish,*ready,*run; //队列指针int N; //进程量void firstin(){run=ready; //就绪队列头指针赋值给运行头指针run->state='R'; //进程状态变为运行态ready=ready->next; //就绪对列头指针后移到下一进程}void prt1(char a){switch(a){case 1: /*优先数法*/printf("名字\t进程占用CPU时间\t需要的时间\t优先级数\t状态\n");break;case 2: /*先来先服务算法*/printf("名字\t到达时间\t开始时间\t服务时间\t完成时间\t状态\n");break;default:break;}}void prt2(char a,PCB *q){switch(a){case 1:printf("%s\t%d\t\t%d\t\t%d\t\t%c\n",q->name,q->cputime,q->needtime,q->prio,q->state);break;case 2:printf("%s\t%d\t\t%d\t\t%d\t\t%d\t\t%c\n",q->name,q->arrivetime,q->starttime,q->servicetim e,q->finishtime,q->state);break;default:break;}}void prt(char algo){PCB *p;prt1(algo); //输出文字格式if(run!=NULL) //如果运行指针不空prt2(algo,run); //输出当前正在运行的PCBp=ready; //输出就绪队列PCBwhile(p!=NULL){prt2(algo,p);p=p->next;}p=finish; //输出完成队列的PCBwhile(p!=NULL){prt2(algo,p);p=p->next;}getchar(); //压任意键继续}void insert1(PCB *q){PCB *p1,*s,*r;int b;s=q; //待插入的PCB指针p1=ready; //就绪队列头指针r=p1; //做p1的前驱指针b=1;while((p1!=NULL)&&b) //根据优先数确定插入位置if(p1->prio>=s->prio){r=p1;p1=p1->next;}elseb=0;if(r!=p1) //如果条件成立说明插入在r与p1之间{r->next=s;s->next=p1;}else{s->next=p1; //否则插入在就绪队列的头ready=s;}}void insert2(PCB *q){PCB *p1,*s,*r;int b;s=q; //指针s指向新要插入的进程p1=ready; //指针p1指向原来的进程的对首r=p1; //使用指针r指向p1前面的进程b=1;while((p1!=NULL)&&b){if(p1->arrivetime<s->arrivetime){r=p1;p1=p1->next;}elseb=0;}if(r!=p1){r->next=s;s->next=p1;}else{s->next=p1;ready=s;}}void create1(char alg){PCB *p;int i,time;char na[10];ready=NULL; //就绪队列头指针finish=NULL; //完成队列头指针run=NULL; //运行队列头指针//输入N个进程名和所需时间创建PCBfor(i=1;i<=N;i++){printf("请输入第%d个进程的名字和运行时间\n进程名:",i);p=(PCB *)malloc(sizeof(PCB));scanf("%s",na);printf("所需时间:");scanf("%d",&time);strcpy(p->name,na);p->cputime=0;p->needtime=time;p->state='W';p->prio=rand()%15+1; //随机分配优先数[1,15]if(ready!=NULL) //就绪队列不空则调用插入函数插入insert1(p); //对新进程插入就绪队列else{p->next=ready; //创建就绪队列的第一个PCBready=p;}}system("cls");printf(" 优先数算法结果输出\n");printf("---------------------------------------------------------------------------\n");prt(alg); //输出进程PCB信息run=ready; //将就绪队列的第一个进程投入运行ready=ready->next;run->state='R';}void create2(char alg){PCB *p;int i;ready=NULL;run=NULL;finish=NULL;for(i=0;i<N;i++){p=(PCB *)malloc(sizeof(PCB));printf("进程名:");scanf("%s",p->name);printf("到达时间:");scanf("%d",&p->arrivetime);printf("需要时间:");scanf("%d",&p->servicetime);p->starttime=0;p->finishtime=0;p->state='W';if(ready!=NULL)insert2(p);//将新进程插入就绪队列else{p->next=ready;//创建就绪队列的第一个ready=p;}}system("cls");printf(" 先来先服务算法结果输出\n");printf("---------------------------------------------------------------------------\n");prt(alg);}void priority(char alg){while(run!=NULL) //当运行队列不空时,有进程正在运行{run->cputime=run->cputime+1;run->needtime=run->needtime-1;run->prio=run->prio-1; //每运行一次优先数-1if(run->prio<0) //如果优先数减到小于0,则转换成0run->prio=0;if(run->needtime==0) //如果所需时间为0,即完成,将其插入完成队列{run->next=finish;finish=run;run->state='F'; //置状态为完成态run=NULL; //运行队列头指针为空if(ready!=NULL) //如果就绪队列不空firstin(); //将就绪对列的第一个进程投入运行}else //没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列if((ready!=NULL)&&(run->prio<ready->prio)){run->state='W'; //状态改为就绪insert1(run); //将进程按优先数大小插入firstin(); //将就绪队列的第一个进程投入运行}prt(alg); //输出进程PCB信息}}void FCFS(char alg){ int time=0;//系统时间从0开始do{run=ready;//就绪序列的第一个进程放入run队列进行执行run->state='R';//进程开始执行ready=ready->next;//指向下一个time=run->arrivetime>time? run->arrivetime:time;run->starttime=time;//进程开始prt(alg);//显示正在执行的进程time=time+run->servicetime;//计算下个进程最小可开始时间run->finishtime=time;//进程结束时间run->state='F';//结束状态标识prt(alg);//进程结束再显示run->next=finish;finish=run;//进程结束放入结束队列run=NULL;}while(ready!=NULL);}/*菜单显示函数*/void Menu(){system("cls");printf("\t\t+━━━━━━━━━━━━━━━━━━━━━━+\n");printf("\t\t| 进程调度算法| \n");printf("\t\t|━━━━━━━━━━━━━━━━━━━━━━| \n");printf("\t\t| | \n");printf("\t\t| [1]优先数算法| \n");printf("\t\t| | \n");printf("\t\t| [2]先来先服务算法| \n");printf("\t\t| | \n");printf("\t\t| [3]退出系统| \n");printf("\t\t| | \n");printf("\t\t|━━━━━━━━━━━━━━━━━━━━━━| \n");printf("\t\t| By:周敏健| \n");printf("\t\t+━━━━━━━━━━━━━━━━━━━━━━+\n");printf("\t\t请输入编号:");}int main(){char algo; //接收算法编号char mainmenu;//判断是否继续srand((unsigned)time(NULL));system("cls");//清屏do{Menu();//显示菜单scanf("%d",&algo); //输入算法编号switch(algo){case 1:system("cls");printf("您选择的是优先数算法\n");printf("请输入进程数目:");scanf("%d",&N); //输入进程数create1(algo); //创建队列priority(algo);//优先数break;case 2:system("cls");printf("您选择的是先来先服务算法\n");printf("请输入进程数目:");scanf("%d",&N); //输入进程个数create2(algo);//创建队列FCFS(algo);//先来先服务break;case 3:printf("\t\t再见! \n");exit(0);break;default:printf("输入有误\n");break;}printf("\n是否继续操作(Y/N) ");fflush(stdin);mainmenu=getchar();}while(mainmenu=='y'||mainmenu=='Y');return 0;}。