操作系统原理 实验一:进程调度实验报告书-模板

合集下载

计算机操作系统进程调度实验报告

计算机操作系统进程调度实验报告

计算机操作系统进程调度实验报告实验报告:计算机操作系统进程调度1.实验背景与目的计算机操作系统是一种负责管理和协调计算机硬件和软件资源的系统。

进程调度作为操作系统的重要功能之一,主要负责决定哪些进程可以运行、何时运行以及运行多长时间等问题。

本实验旨在通过实践学习进程调度的原理和实现细节,加深对操作系统的理解。

2.实验原理与步骤(1)实验原理:进程调度的目标是充分利用计算机资源,提高系统的吞吐率和响应时间。

常用的调度算法有先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)等。

在本实验中,我们将实现时间片轮转调度算法,并对比不同算法的性能差异。

(2)实验步骤:1)设计进程数据结构:创建进程控制块(PCB)结构体,包含进程的标识符、到达时间、服务时间、剩余时间、等待时间等信息。

2)生成进程:根据指定的进程个数和服务时间范围,生成随机的进程并初始化进程控制块。

3)时间片轮转调度算法:根据时间片大小,按照轮转调度的方式进行进程调度。

4)性能评估:通过记录进程的等待时间和周转时间,比较不同调度算法的性能差异。

3.实验结果与分析通过实验我们生成了10个进程,并使用时间片大小为2进行轮转调度。

下表列出了各个进程的信息及调度结果。

进程到达时间服务时间剩余时间等待时间周转时间P108068P214004P3291310P4350115P542032P6570147P763063P8761714P981071P1093104从实验结果可以看出,时间片轮转调度算法相对公平地分配了CPU给各个进程,减少了等待时间和周转时间。

但是,对于长时间服务的进程,可能出现饥饿问题,即一些耗时较长的进程无法得到充分的CPU时间。

与时间片轮转算法相比,先来先服务(FCFS)算法对于短作业具有更好的响应时间,但可能导致长作业等待时间过长。

最短作业优先(SJF)算法能够最大化短作业的优先级,提高整体性能。

4.实验总结与体会本次实验通过实践了解了进程调度的原理与实现细节,加深了对操作系统的理解。

操作系统实验报告进程调度

操作系统实验报告进程调度

操作系统实验报告进程调度操作系统实验报告:进程调度引言在计算机科学领域中,操作系统是一个重要的概念,它负责管理和协调计算机系统中的各种资源,包括处理器、内存、输入/输出设备等。

其中,进程调度是操作系统中一个非常重要的组成部分,它负责决定哪个进程在何时获得处理器的使用权,以及如何有效地利用处理器资源。

实验目的本次实验的目的是通过对进程调度算法的实验,深入理解不同的进程调度算法对系统性能的影响,并掌握进程调度算法的实现方法。

实验环境本次实验使用了一台配备了Linux操作系统的计算机作为实验平台。

在该计算机上,我们使用了C语言编写了一些简单的进程调度算法,并通过模拟不同的进程调度场景进行了实验。

实验内容1. 先来先服务调度算法(FCFS)先来先服务调度算法是一种简单的进程调度算法,它按照进程到达的顺序进行调度。

在本次实验中,我们编写了一个简单的FCFS调度算法,并通过模拟多个进程同时到达的情况,观察其对系统性能的影响。

2. 短作业优先调度算法(SJF)短作业优先调度算法是一种根据进程执行时间长度进行调度的算法。

在本次实验中,我们编写了一个简单的SJF调度算法,并通过模拟不同长度的进程,观察其对系统性能的影响。

3. 时间片轮转调度算法(RR)时间片轮转调度算法是一种按照时间片大小进行调度的算法。

在本次实验中,我们编写了一个简单的RR调度算法,并通过模拟不同时间片大小的情况,观察其对系统性能的影响。

实验结果通过实验,我们发现不同的进程调度算法对系统性能有着不同的影响。

在FCFS 算法下,长作业会导致短作业等待时间过长;在SJF算法下,长作业会导致短作业饥饿现象;而RR算法则能够较好地平衡不同进程的执行。

因此,在实际应用中,需要根据具体情况选择合适的进程调度算法。

结论本次实验通过对进程调度算法的实验,深入理解了不同的进程调度算法对系统性能的影响,并掌握了进程调度算法的实现方法。

同时,也加深了对操作系统的理解,为今后的学习和研究打下了良好的基础。

进程调度程序实验报告

进程调度程序实验报告

一、实验目的通过本次实验,加深对进程调度原理和算法的理解,掌握进程调度程序的设计与实现方法。

实验要求我们使用高级编程语言编写一个简单的进程调度程序,实现不同调度算法的模拟,并通过实验验证算法的性能。

二、实验环境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调度算法简单,但可能导致长作业等待时间过长。

实验一、进程调度实验报告

实验一、进程调度实验报告

实验一、进程调度实验报告一、实验目的进程调度是操作系统中的核心功能之一,其目的是合理地分配 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分析:先来先服务调度算法简单直观,但对于短作业可能会造成较长的等待时间,导致平均等待时间和平均周转时间较长。

操作系统原理 实验一:进程调度实验报告书-模板

操作系统原理 实验一:进程调度实验报告书-模板

计算机科学系实验报告书课程名:《操作系统原理》题目:进程调度班级:学号:姓名:操作系统原理实验——进程调度实验报告一、目的与要求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(); //让程序停下来,可以查看结果。

进程调度操作系统实验报告

进程调度操作系统实验报告

进程调度操作系统实验报告一、实验目的本次实验的主要目的是深入理解操作系统中进程调度的概念和原理,通过实际编程和模拟,观察不同调度算法对系统性能的影响,并掌握进程调度的实现方法。

二、实验环境操作系统:Windows 10编程语言:C++开发工具:Visual Studio 2019三、实验原理进程调度是操作系统的核心功能之一,它负责决定哪个进程在何时获得 CPU 资源进行执行。

常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)、优先级调度等。

先来先服务算法按照进程到达的先后顺序进行调度,先到达的进程先获得 CPU 执行。

这种算法简单直观,但可能导致短作业等待时间过长。

短作业优先算法优先调度执行时间短的进程,能有效减少平均等待时间,但可能导致长作业饥饿。

时间片轮转算法将 CPU 时间划分成固定大小的时间片,每个进程轮流获得一个时间片进行执行。

如果进程在时间片内未完成,则被放回就绪队列等待下一轮调度。

优先级调度根据进程的优先级来决定调度顺序,优先级高的进程先获得 CPU 资源。

四、实验步骤1、设计进程结构体定义进程的标识号(PID)、到达时间、服务时间、剩余时间、优先级等属性。

2、实现先来先服务算法按照进程到达的先后顺序将它们放入就绪队列。

从就绪队列中取出第一个进程进行调度执行,直到其完成。

3、实现短作业优先算法计算每个进程的剩余服务时间。

将进程按照剩余服务时间从小到大排序,放入就绪队列。

从就绪队列中取出剩余服务时间最短的进程进行调度执行。

4、实现时间片轮转算法设定时间片大小。

将进程放入就绪队列,按照先来先服务的原则依次分配时间片执行。

进程在时间片内未完成的,放回就绪队列末尾。

5、实现优先级调度算法为每个进程设置优先级。

将进程按照优先级从高到低排序,放入就绪队列。

从就绪队列中取出优先级最高的进程进行调度执行。

6、计算平均周转时间和平均带权周转时间周转时间=完成时间到达时间带权周转时间=周转时间/服务时间平均周转时间=总周转时间/进程数平均带权周转时间=总带权周转时间/进程数7、输出调度结果包括每个进程的调度顺序、开始时间、结束时间、周转时间、带权周转时间等。

操作系统进程调度实验报告

操作系统进程调度实验报告

《计算机操作系统》课程实验报告题目实验一进程调度学院: 计算机学院专业: 计算机科学与技术姓名班级学号2015年10月21日实验一进程调度1.实验目的:通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。

2.实验内容:用C语言实现对N个进程采用某种进程调度算法先来先服务调度、短作业优先调度的调度。

3.设计实现:要求给出设计源码,设计源码要有详细注释,#include <stdio.h>#include<iostream>using namespace std;struct program{char name; /*进程名*/int atime; /*到达时间*/int stime; /*服务时间*/int ftime; /*完成时间*/int rtime; /*周转时间*/float qrtime; /*带权周转时间*/};void xianshi(struct program a[],int n){int i,j;struct program t;/*将进程按时间排序*/printf("根据到达时间重新排序:\n");printf("*****进程*************到达时间***************服务时间*****\n");for(j=0;j<n-1;j++)for(i=0;i<n-1-j;i++)if(a[i].atime>a[i+1].atime){t.atime=a[i].atime;a[i].atime=a[i+1].atime;a[i+1].atime=t.atime;=a[i].name;a[i].name=a[i+1].name;a[i+1].name=;t.stime=a[i].stime;a[i].stime=a[i+1].stime;a[i+1].stime=t.stime;}for(i=0;i<n;i++)printf(" %c %d %d |\n",a[i].name,a[i].atime,a[i].stime);printf("----------------------------------------------------\n"); }void fcfs(struct program a[],int n){int i;int time=0;for(i=0;i<n;i++){time=time+a[i].stime;a[i].ftime=a[0].atime+time;a[i].rtime=a[i].ftime-a[i].atime;a[i].qrtime=(float)a[i].rtime/a[i].stime;}printf("\nFCFS算法:\n");printf("*****进程****到达时间****完成时间******周转时间*******带权周转时间*****\n");for(i=0;i<n;i++){printf(" %c %d %.2d %.2d %.2f |\n",a[i].name,a[i].atime,a[i].ftime,a[i].rtime,a[i].qrtime);}printf("-----------------------------------------------------------------------\n");}void main(){int i,m;struct program pro[4];/*创建进程 */printf(" ******先来先服务算法****** \n");printf("请输入进程的数目:\n");scanf("%d",&m);i=m;for(i=0;i<m;i++){printf("请输入进程%d的进程名,到达时间,服务时间\n",i+1);cin>>pro[i].name>>pro[i].atime>>pro[i].stime;}xianshi(pro,m);fcfs(pro,m);getchar();}#include <stdio.h>#include<iostream>using namespace std;struct program{char name; /*进程名*/float atime; /*到达时间*/float stime; /*服务时间*/float ftime; /*完成时间*/float rtime; /*周转时间*/float qrtime; /*带权周转时间*/};void xianshi(struct program a[],int n){int i,j;struct program t;/*将进程按时间排序*/printf("重新排序:\n");printf("*****进程*************到达时间***************服务时间*****\n");for(j=0;j<n-1;j++)for(i=1;i<n-1-j;i++)if(a[i].stime>a[i+1].stime){t.atime=a[i].atime;a[i].atime=a[i+1].atime;a[i+1].atime=t.atime;=a[i].name;a[i].name=a[i+1].name;a[i+1].name=;t.stime=a[i].stime;a[i].stime=a[i+1].stime;a[i+1].stime=t.stime;}for(i=0;i<n;i++)printf(" %c %f %f |\n",a[i].name,a[i].atime,a[i].stime);printf("----------------------------------------------------\n"); }void SJF(struct program a[],int n){int i;a[0].ftime=a[0].atime+a[0].stime;a[0].rtime=a[0].ftime-a[0].atime;a[0].qrtime=a[0].rtime/a[0].stime;for(i=1;i<n;i++){a[i].ftime=a[i-1].ftime+a[i].stime;a[i].rtime=a[i].ftime-a[i].atime;a[i].qrtime=a[i].rtime/a[i].stime;}printf("\nSJF算法:\n");printf("*****进程****到达时间****完成时间******周转时间*******带权周转时间*****\n");for(i=0;i<n;i++){printf(" %c %.2f %.2f %.2f %.2f |\n",a[i].name,a[i].atime,a[i].ftime,a[i].rtime,a[i].qrtime);}printf("-----------------------------------------------------------------------\n");}void main(){int i,m;struct program pro[4];/*创建进程 */printf(" ******短作业优先算法****** \n");printf("请输入进程的数目:\n");scanf("%d",&m);i=m;for(i=0;i<m;i++){printf("请输入进程%d的进程名,到达时间,服务时间\n",i+1);cin>>pro[i].name>>pro[i].atime>>pro[i].stime;}xianshi(pro,m);SJF(pro,m); getchar(); }4.实验结果5.实验过程中出现的问题及解决办法先来先服务调度算法就是根据进程达到的时间为依据,哪一个进程先来那么该进程就会先执行;最短进程优先调度算法则是以每个进程执行所需时间长短为依据,某一个进程执行所需花的时间要短些那么该进程就先执行。

进程的调度实验报告(3篇)

进程的调度实验报告(3篇)

第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("无效的调度算法选择。

操作系统实验——动态优先级进程调度实验报告

操作系统实验——动态优先级进程调度实验报告

1.实验名称:动态优先权调度过程中就绪队列的模拟2.实验要求:采用动态优先权的进程调度算法,用C语言编程模拟调度过程中每个时间片内的就绪队列。

3.实验内容:(1)每个进程控制块PCB用结构描述,包括以下字段:*进程标识符id*进程优先数priority,并规定优先数越大的进程,其优先权越高。

*进程已占用的CPU时间cputime*进程还需占用的CPU时间alltime,当进程运行完毕时,aiitime变为0*进程的阻塞时间startblock,当进程再运行startblock个时间片后,进程将进入阻塞状态*进程被阻塞的时间blocktime,已阻塞的进程再等待blocktime个时间片后,将转换成就绪状态*进程状态state*队列指针next,将PCB排成队列。

2)调度前,系统中有五个进程,它们的初始状态如下:3)进程在就绪队列呆一个时间片,优先数增加1。

4)进程每运行一个时间片,优先数减3。

5)按下面格式显示每个时间片内就绪队列的情况:READY_QUEUE:->id1->id24.任务分析进程控制块用结构体来表示,包含它的各项属性。

建立两个队列:一个就绪队列,一个阻塞队列。

创建一个进程控制块表示当前正在运行的进程。

程序开始运行时,所有进程都在就绪队列中。

当startblock减少到0时,进程进入阻塞队列。

在阻塞队列中的进程,当blocktime减少到0时,转入就绪队列。

在就绪队列中的进程,如果优先级比当前正在执行的进程高,就可以取代当前进程获取时间片。

当前进程如果运行完毕,就绪队列中优先级最高的进程就可以成为新当前进程。

5.程序流程图#include〈iostream〉#include〈string〉usingnamespace std;#define LEN5typedefenum STATE{READYBLOCKEND}STATE;//定义进程控制块typedefstruct PCB{int id;int priority;int cputime;int alltime;int startblock;int blocktime;STATE state;}PCB;//定义队列typedefstruct queue{int si ze;PCB*data[LEN];}Queue;PCB ps[LEN];PCB*cp; //进程最大数量//进程状态//就绪//阻塞//完成//进程标识符//进程优先级//已占用的CPU时间//还需占用的CPu时间//阻塞时间//被阻塞时间//进程状态//队列中进程的数量//进程的指针//进程数组//当前正在运行的进程6.程序清单Queue rQueue,bQueue;//就绪队列和阻塞队列//就绪队列按优先级降序排序(使用了冒泡排序法)void rQueueSort(){ PCB*temp;for(int i=0;i<rQueue.size-1;i++){for(int j=0;j<rQueue.size-1-i;j++){if(rQueue.data[j]-〉priority<rQueue.data[j+1]-〉priority){temp=rQueue.data[j];rQueue.data[j]=rQueue.data[j+1];}}rQueue.dataj+1]=temp;}}//初始化void init(){//给进程赋值for(int i=0;i<LEN;i++){ps[i].id=i;ps[i].state=READY;ps[i].cputime=0;ps[i].alltime=3;ps[i].blocktime=0;ps[i].startblock=T;}ps[0].priority=9;ps[1].priority=38;ps[2].priority=30;ps[3].priority=29;ps[4].priority=0;ps[2].alltime=6;ps[4].alltime=4;ps[0].startblock=2;ps[0].blocktime=3;cp=NULL;//当前进程赋空bQueue.size=0;//阻塞队列没有进程for(int i=0;i<LEN;i++){bQueue.data[i]=NULL;rQueue.data[i]=&ps[i];}rQueue.size=5;//所有进程全部进入就绪队列rQueueSort();//对就绪队列排序}//打印void print(){cout〈〈"\nRUNNINGPROG:";if(cp!=NULL){cout〈〈cp->id;}cout<<"\nREADY_QUEUE:";for(int i=0;i<rQueue.size;i++){cout〈〈"-〉"〈〈rQueue.data[i]-〉id; }cout<<"\nBLOCK_QUEUE:";for(int i=0;i<bQueue.size;i++){cout〈〈"-〉"〈〈bQueue.data[i]-〉id; }cout〈〈"\n"<<endl;cout<<"ID\t\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].id<<"\t";}cout<<"\nPRI0RITY\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].priority〈〈"\t";}cout<<"\nCPUTIME\t\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].cputime〈〈"\t";}cout<<"\nALLTIME\t\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].alltime〈〈"\t";}cout<<"\nSTARTBLOCK\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].startblock<<"\t";}cout<<"\nBLOCKTIME\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].blocktime<<"\t";}cout<<"\nSTATE\t\t";for(int i=0;i<LEN;i++){if(ps[i].state==READY){cout<<"READY"<<"\t";}elseif(ps[i].state==BLOCK){cout<<"BLOCK"<<"\t";}elseif(ps[i].state==END){cout〈〈"END"<<"\t";}}cout〈〈endl;}//出队,返回进程指针PCB*pop(Queue*q){PCB*temp;if(q-〉size>0){temp=q-〉data[0];//取出队首进程for(int i=0;i<q-〉size-1;i++){q-〉data[i]=q-〉data[i+1];//其他进程依次向前移动}q->size__;return temp;//返回队首进程}return NULL;}//入队void push(Queue*q,PCB*p){if(q_>size<LEN){q_>data[q_〉size]=p;//将入队的进程放在队尾q_>size++;}return;}//运行进程void run(){if(rQueue.size〉0||bQueue.size〉0){if(cp==NULL){//程序一开始运行时,从就绪队列取出首进程cp=pop(&rQueue);}//当前进程没有结束,但优先级比就绪队列首进程低if(cp_〉alltime〉0&&cp_>priority<rQueue.data[0]_〉priority){}push(&r Queue,c//改变进程状态//从就绪队列取出新的当前进程//修改当前进程的状态 //将当前进程加入阻塞队列 //从就绪队列取出新的当前进程{//当前进程的startblock 为正数时//运行一次减一个时间片//减到0时,修改进程状态//每运行一个时间片//就绪队列中的进程优先级+1//每运行一个时间片//阻塞队列中的进程blocktime-1//将当前进程放入就绪队列 //就绪队列队首进程成为当前进程if (cp-〉alltime==0){cp->state =END ;cp=pop(&rQueue); }//如果当前进程运行结束//startblock 为0,标志着当前进程要进入阻塞状态if (cp —>startblock==0&&cp —>blocktime>0){cp —>state=BLOCK ; push(&bQueue,cp); cp=pop(&rQueue); }elseif (cp —>startblock>0)cp —>st artblock 一; }cp —>alltime ——;if (cp —>alltime==0){cp —>state=END ;for (int i=0;i<rQueue.size;i++){rQueue.data[i]-〉priority++; }for (int i=0;i<bQueue.size;i++){if (bQueue.data[i]-〉blocktime>0){bQueue.data[i]-〉blocktime--; }//当阻塞队列队首进程blocktime 为0时if (bQueue.size 〉0&&bQueue.data[0]-〉blocktime==0){bQueue.data[0]-〉state=READY ;//修改进程状态push(&rQueue,pop(&bQueue));//将阻塞队列首进程取出,放入就绪队列cp —〉priority-=3;//修改当前进程的优先级cp —>cputime++; //当前进程占用CPU 时间片+1 if (cp —>alltime>0){//当前进程还需运行的时间片-1}//每运行一个时间片,就绪队列排一次序rQueueSort();} }//主函数int main(){init();//初始化 print();//打印进程信息 while (1){_sleep(1000);if (rQueue.size==0&&bQueue.size==0){//当两个队列都为空时,结束程序cp-〉state=END ;break ; }run();//运行进程 print();//打印进程信息 }return 0; }7.实验过程记录m 匚:\WINDQWS\system32\cmd.exe程序开始执行,当前进程是优先级最高的1号进程,1号进程的优先级减3、cputime++、执行几次之后,1号进程执行完毕而且优先级也不是最高的了,所以优先级为33的2号进程成为当前进程,开始执行。

操作系统(进程调度)实验报告

操作系统(进程调度)实验报告

操作系统原理(进程调度)实验报告实验一:动态优先权一.实验目的:(1).理解进程创建的相关理论;(2).掌握进程创建方法;(3).掌握进程相关的数据结构;(4).了解进程的调度算法;二.实验内容:1、最好采用图形界面;2、可随时增加进程;3、规定道数,设置后备队列和挂起状态。

若内存中进程少于规定道数,可自动从后备队列调度一作业进入。

被挂起进程入挂起队列,设置解挂功能用于将指定挂起进程解挂入就绪队列。

4、每次调度后,显示各进程状态。

三.实验步骤1.创建进程PCB。

包括进程ID,优先权,执行时间,占用cpu时间,状态五个部分;struct Process{int id;int priority;int cputime;int alltime;enum STATE state;}process[N];2.初始化进程队列。

进程号用ID表示,优先权随机设定,状态均置为ready;void Init(){srand((unsigned)time(NULL));for(int i=0;i<N;i++){process[i].id = Rseq[i] = i;process[i].priority = rand()%20;process[i].cputime = 0;process[i].alltime = rand()%3+3;process[i].state = ready;TIME += process[i].alltime;}Sort();Print();flag = 1;}3.运行进程。

首轮按优先权大小排列进程执行顺序,优先权最大的最先执行,首轮执行后,运行程序优先权减2,未执行程序优先权加1.第二轮再按优先权顺序排序执行,以此类推,直到所有程序执行完成。

..........附录(源代码):#include<stdio.h>#include<stdlib.h>#include<time.h>#define N 5enum STATE{ready,run,finish};struct Process{int id;int priority;int cputime;int alltime;enum STATE state;}process[N];int Rseq[N];int flag = 0;int TIME = 0;void Print(){printf("=============================================================\n");printf(" id priority cputime alltime state \n");for(int i=0;i<N;i++){printf(" %d %d %d %d",process[i].id,process[i].priority,process[i].cputime,process[i].alltime);switch(process[i].state){case 0:printf("ready\n");break;case 1:printf("run\n");break;case 2:printf("finish\n");}}printf(" Next Run sequence :");for(int i=0;i<N;i++)if(i != N-1)printf("%d -> ",Rseq[i]);else printf("%d\n",Rseq[i]);printf("=============================================================\n\n"); }void Sort(){int temp;for(int i=0;i<N-1;i++)for(int j=i+1;j<N;j++)if(process[Rseq[i]].priority <= process[Rseq[j]].priority){temp = Rseq[i];Rseq[i] = Rseq[j];Rseq[j] = temp;}}void Init(){srand((unsigned)time(NULL));for(int i=0;i<N;i++){process[i].id = Rseq[i] = i;process[i].priority = rand()%20;process[i].cputime = 0;process[i].alltime = rand()%3+3;process[i].state = ready;TIME += process[i].alltime;}Sort();Print();flag = 1;}void Run(){for(int i=0;i<=TIME;i++){printf(" run process:%d\n",Rseq[0]);for(int j=0;j<N;j++){if(process[j].state == run) process[j].state = ready;}for(int j=0;j<N;j++){if(process[Rseq[j]].alltime == 0){process[Rseq[j]].priority = 0;process[Rseq[j]].state = finish;}else if(j == 0 && process[Rseq[j]].alltime != 0){process[Rseq[j]].priority -= 2;process[Rseq[j]].cputime++;process[Rseq[j]].alltime--;process[Rseq[j]].state = run ;}else process[Rseq[j]].priority++;}Sort();Print();}}main(){Init();Run();}实验二:循环首次适应法(一)需求分析该算法是首次适应算法的变种。

操作系统进程调度实验报告

操作系统进程调度实验报告

操作系统进程调度实验报告操作系统进程调度实验报告引言:操作系统是计算机系统中的核心软件之一,负责管理计算机的硬件资源并提供用户与计算机硬件之间的接口。

进程调度作为操作系统的重要功能之一,负责决定哪个进程可以获得处理器的使用权,以及进程如何在处理器上运行。

本实验旨在通过设计和实现一个简单的进程调度算法,加深对操作系统进程调度原理的理解。

一、实验目的本实验的主要目的是通过编写代码模拟操作系统的进程调度过程,掌握进程调度算法的实现方法,深入理解不同调度算法的特点和适用场景。

二、实验环境本实验使用C语言进行编程实现,可在Linux或Windows系统下进行。

三、实验内容1. 进程调度算法的选择在本实验中,我们选择了最简单的先来先服务(FCFS)调度算法作为实现对象。

FCFS算法按照进程到达的先后顺序进行调度,即先到先服务。

这种调度算法的优点是简单易实现,但缺点是无法适应不同进程的执行时间差异,可能导致长作业效应。

2. 进程调度的数据结构在实现进程调度算法时,我们需要定义进程的数据结构。

一个进程通常包含进程ID、到达时间、执行时间等信息。

我们可以使用结构体来表示一个进程,例如:```struct Process {int pid; // 进程IDint arrival_time; // 到达时间int burst_time; // 执行时间};```3. 进程调度算法的实现在FCFS调度算法中,我们需要按照进程到达的先后顺序进行调度。

具体实现时,可以使用一个队列来保存待调度的进程,并按照到达时间的先后顺序将进程入队。

然后,按照队列中的顺序依次执行进程,直到所有进程执行完毕。

4. 实验结果分析通过实现FCFS调度算法,我们可以观察到进程调度的过程和结果。

可以通过输出每个进程的执行顺序、等待时间和周转时间等指标来分析调度算法的效果。

通过比较不同调度算法的指标,可以得出不同算法的优缺点。

四、实验步骤1. 定义进程的数据结构,包括进程ID、到达时间和执行时间等信息。

操作系统进程调度实验报告1

操作系统进程调度实验报告1

一、实验目的通过对进程调度算法的模拟加深对进程概念和进程调度算法的理解。

二、实验要求编写程序实现对5个进程的调度模拟,要求至少采用两种不同的调度算法(先来先服务算法,短作业算法)分别进行模拟调度。

三、实验内容编程实现如下算法1.先来先服务算法;2.短作业算法四、实验代码1.先来先服务算法#include"stdio.h"#include"stdlib.h"typedef struct PCB //定义进程控制块{ char name[10]; //进程名char state; //运行状态int ArriveTime; //到达时间int StartTime; //进程开始时间int FinishTime; //进程结束时间int ServiceTime; //服务时间float WholeTime; //周转时间float WeightWholeTime;//带权周转时间double AverageWT_FCFS; //平均周转时间double AverageWWT_FCFS;//带权平均周转时间struct PCB *next; //指向下个进程}pcb;double x=0,y=0;int i;int time; //计时器int n; //进程个数pcb *head=NULL,*p,*q; //进程链表指针void run_FCFS(pcb *p1) //运行未完成的进程{time = p1->ArriveTime > time? p1->ArriveTime:time;p1->StartTime=time;printf("\n时刻:%d, 当前开始运行作业%s\n\n",time,p1->name);time+=p1->ServiceTime;p1->state='T';p1->FinishTime=time;p1->WholeTime=p1->FinishTime-p1->ArriveTime;p1->WeightWholeTime=p1->WholeTime/p1->ServiceTime;x+=p1->WholeTime;y+=p1->WeightWholeTime;p1->AverageWT_FCFS=p1->WholeTime/n;p1->AverageWWT_FCFS=p1->WeightWholeTime/n;printf(" 到达时间开始时间服务时间完成时间周转时间带权周转时间\n");printf("%6d %10d %10d %8d %10.1f %10.2f \n ",p1->ArriveTime,p1->StartTime,p1->ServiceTime,p1->FinishTime,p1->WholeTime,p1->WeightWholeTime);printf("\n平均周转时间平均带权周转时间\n");printf(" %10.2f %10.2f\n ",p1->AverageWT_FCFS,p1->AverageWWT_FCFS);}void FCFS() //找到当前未完成的进程{int i;p=head;for(i=0;i<n;i++){if(p->state=='F'){ q=p; //标记当前未完成的进程run_FCFS(q);}p=p->next;}}void getInfo() //获得进程信息并创建进程{int num;printf("\n进程个数:");scanf("%d",&n);for(num=0;num<n;num++){p=(pcb *)malloc(sizeof(pcb));printf("依次输入:\n进程名到达时间服务时间\n");scanf("%s\t%d\t%d",&p->name,&p->ArriveTime,&p->ServiceTime);if(head==NULL){head=p;q=p;time=p->ArriveTime;}if(p->ArriveTime < time)time=p->ArriveTime;q->next=p;p->StartTime=0;p->FinishTime=0;p->WholeTime=0;p->WeightWholeTime=0;p->next=NULL;p->state='F';q=p;}}void main(){printf("先来先服务FCFS算法模拟\n");getInfo();p=head;FCFS();}2.短作业调度算法#include<iostream>#include<stdio.h>#include<iomanip>#include<queue>#include<deque>using namespace std;class JCB{public:int start,end,arrive,runtime,zhou,weizhou;string name;char state;void Show(){cout.width(9);cout<<name;cout.width(9);cout<<arrive;cout.width(11);cout<<runtime;cout.width(13);cout<<start;cout.width(10);cout<<end;cout.width(10);cout<<zhou;cout.width(9);cout<<(double)zhou/runtime<<endl;}bool operator<(const JCB& node)const{return arrive<node.arrive;}};int main(){int num;deque<JCB> Q;JCB jcb;cout<<"(SJF)请输入作业数目:";cin>>num;for(int i=1; i<=num; i++){cout<<"\n请输入作业名,到达时间,运行时间:";cin>>>>jcb.arrive>>jcb.runtime;jcb.state='W';Q.push_back(jcb);}deque<JCB>::iterator it,jt,current;current=Q.begin();current->start=current->arrive;current->end=current->start+current->runtime;current->zhou=current->end-current->arrive;current->state='R';for(int i=2; i<=num; i++){int flag=0;for(it=Q.begin(); it!=Q.end(); it++){if(flag==0)for(jt=Q.begin(); jt!=Q.end(); jt++)if(jt->state=='W') break;if(it->state=='W'&&it->arrive<=current->end&&it->runtime<jt->runtime){ jt=it; flag=1;}}if(jt->arrive<=current->end)jt->start=current->end;else jt->start=jt->arrive;jt->end=jt->start+jt->runtime;jt->zhou=jt->end-jt->arrive;jt->state='R';current=jt;}cout<<"\n作业名到达时间服务时间开始执行时间完成时间周转时间带权周转时间"<<endl;cout.setf(ios::left);double sum=0;while(!Q.empty()){jcb=Q.front();jcb.Show();sum+=(double )jcb.zhou/jcb.runtime;Q.pop_front();}cout<<"\n短作业优先算法(SJF)平均带权周转时间:"<<sum/num<<endl;return 0;}五、实验结果1.执行结果2.结果分析先来先服务调度算法就是根据进程达到的时间为依据,哪一个进程先来那么该进程就会先执行;最短进程优先调度算法则是以每个进程执行所需时间长短为依据,某一个进程执行所需花的时间要短些那么该进程就先执行。

操作系统-进程调度实验报告

操作系统-进程调度实验报告

程序中使用的数据结构及符号说明按优先数调度算法实现处理器调度的程序用C语言对其进程的数据结构进行定义如下:struct PCB //定义进程的数据结构{char name[20]; //进程的名称char point; //指针int time; //要求运行时间int math; //优先数char state; //状态};使用的调度算法:void diaodu() //核心算法,进程调度算法{int g,h;struct PCB Y;for(g=0;g<m;g++)for(h=g+1;h<m;h++)if(P[g].math<P[h].math) //按优先级判断,如果优先级低,就进行交换{ Y=P[g];P[g]=P[h];P[h]=Y;}}按时间片轮转法实现处理器调度的程序#define PCB_NUM 10 /* 该程序包含十个PCB */#define EXAMPLES 3 /* 该程序最多可模拟三个运行着的进程 */ /* 定义进程控制块 */typedef struct pcb{struct pcb *next; /* 进程的下一个进程 */char name[20]; /* 进程的名字 */int time; /* 进程运行的时间 */}PCB;/* 定义全局变量 */PCB pcbTable[PCB_NUM]; /* 进程控制表 */PCB *pcbCurrent = NULL; /* 当前运行的进程 */PCB *pcbFree = NULL; /* 空闲进程 */PCB *pcbReady = NULL; /* 就绪进程 */PCB *pcbReadyRear = NULL;int currentProcesses = 0; /* 当前进程数 *//* 函数声明 */void InitPcbTable(); /* 初始化进程表 */void DisplayIdle(); /* 显示空闲队列 */int CreateProcesses(); /* 创建进程 */void DisplayReadys(); /* 显示就绪进程 */void Run();PCB* Schedule();/* 主函数 */void main()三、源程序及注释#include<stdio.h>char E;int m=5; //进程的数量struct PCB //定义进程的数据结构{char name[20]; //进程的名称char point; //指针int time; //要求运行时间int math; //优先数char state; //状态};struct PCB P[5]={ //定义一个PCB结构的数组,用于存放五个进程{"p1",'k1',2,3,'R'}, //分别对五个“进程”赋初值{"p2",'k4',3,5,'R'},{"p3",'k5',1,3,'R'},{"p4",'k3',2,4,'R'},{"p5",'k1',4,6,'R'}};void diaodu() //核心算法,进程调度算法{int g,h;struct PCB Y;for(g=0;g<m;g++)for(h=g+1;h<m;h++)if(P[g].math<P[h].math) //按优先级判断,如果优先级低,就进行交换{ Y=P[g];P[g]=P[h];P[h]=Y;}}void main() //主函数{int i,j;for(i=0;i<m;i++) //打印五个进程的初始值printf("%d %s %c %d %c\n",P[i].math,P[i].name,P[i].point,P[i].time,P[i].state);do{diaodu();printf("%s\n",P[0].name);P[0].time-2; //每进行一次调度之后,时间和优先级都减2P[0].math-2;if(P[0].time==0) //对运行时间进行判0,如果为0,则将其状态设为End{P[0].state='E';P[0].math=0;}for(i=0;i<m;i++) //调度一次之后,再次打印当前进程状态printf("%d %s %c %d %c \n",P[i].math,P[i].name,P[i].point,P[i].time,P[i].state);}while(P[0].state!='E'||P[1].state!='E'||P[2].state!='E'||P[3] .state!='E'||P[4].state!='E');}#include <stdio.h>#include <conio.h>#include <string.h>/* 定义宏 */#define PCB_NUM 10 /* 该程序包含十个PCB */#define EXAMPLES 3 /* 该程序最多可模拟三个运行着的进程 *//* 定义进程控制块 */typedef struct pcb{struct pcb *next; /* 进程的下一个进程 */char name[20]; /* 进程的名字 */int time; /* 进程运行的时间 */}PCB;/* 定义全局变量 */PCB pcbTable[PCB_NUM]; /* 进程控制表 */PCB *pcbCurrent = NULL; /* 当前运行的进程 */PCB *pcbFree = NULL; /* 空闲进程 */PCB *pcbReady = NULL; /* 就绪进程 */PCB *pcbReadyRear = NULL;int currentProcesses = 0; /* 当前进程数 *//* 函数声明 */void InitPcbTable(); /* 初始化进程表 */void DisplayIdle(); /* 显示空闲队列 */int CreateProcesses(); /* 创建进程 */void DisplayReadys(); /* 显示就绪进程 */void Run();PCB* Schedule();/* 主函数 */void main(){InitPcbTable(); /* 初始化进程表 */DisplayIdle(); /* 显示空闲进程队列 */CreateProcesses(); /* 创建一个进程 */DisplayIdle();DisplayReadys(); /* 显示就绪进程 */while(pcbReady != NULL){pcbCurrent = Schedule();printf("current process is:%s\n",pcbCurrent->name); Run();DisplayIdle();getch();DisplayReadys();getch();}}void InitPcbTable() //初始化进程表函数{int i = 0;pcbFree = &pcbTable[0]; /* pcbFree是一个指向进程表表头的指针*/pcbTable[PCB_NUM-1].next = NULL; /* 处理进程表中表尾位置的PCB */pcbTable[PCB_NUM-1].time = 0;strcpy(pcbTable[PCB_NUM-1].name,"idle");for(i = 0; i < PCB_NUM-1; i++) /* 处理进程表中除表尾PCB的其余PCB*/{pcbTable[i].next = &pcbTable[i+1];pcbTable[i].time = 0;strcpy(pcbTable[i].name,"idle");}}void DisplayIdle() //显示空闲进程队列函数{PCB *p = pcbFree; /* p来搜索空闲进程队列 */printf("number of idles:%d\n", PCB_NUM - currentProcesses);while(p != NULL){printf("%s ", p->name);p = p->next;}printf("\n");}int CreateProcesses() //创建进程函数{PCB *p;int i = 0;for(i = 0; i < EXAMPLES; i++) /* EXAMPLE为最大可模拟的进程数目 */{if(pcbFree == NULL) /* 当前没有空闲进程,则返回错误信息*/return(-1);p = pcbFree;pcbFree = pcbFree->next ;printf("enter p %d's name:\n", i);scanf("%s", p->name);printf("enter p %d's time:(1~5)\n", i);scanf("%d", &p->time);currentProcesses++;p->next = NULL;if(pcbReady == NULL) /* 判断当前状态是否有就绪进程 */ {pcbReadyRear = p;pcbReady = pcbReadyRear;}else{pcbReadyRear->next = p;pcbReadyRear = p;}}return(currentProcesses);}void DisplayReadys() //显示就绪队列函数{PCB *p;p = pcbReady;printf("name time\n");while(p != NULL){printf("%s %d\n",p->name, p->time); p = p->next ;}}PCB *Schedule() //进程调度函数{PCB *p;if(pcbReady != NULL){p = pcbReady;pcbReady = pcbReady->next ;return (p);}elsereturn(NULL);}void Run() //运行函数{pcbCurrent->time--;if(pcbCurrent->time == 0){pcbCurrent->next = pcbFree;pcbFree = pcbCurrent;currentProcesses--;}else{pcbReadyRear->next = pcbCurrent;pcbReadyRear = pcbCurrent;pcbReadyRear->next = NULL;} } 四、运行结果:。

实验一:进程调度实验报告书

实验一:进程调度实验报告书

实验一:进程调度实验报告书淮海工学院计算机科学系实验报告书课程名:《操作系统原理》题目: 进程调度班级: 网络091学号: 110912133姓名: 钟学圣评语:成绩: 指导教师:批阅时间: 年月日《操作系统原理》实验报告 - 1 -操作系统原理实验——进程调度实验报告一、目的与要求1)进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C语言编写一个进程调度模拟程序,使用优先级或时间片轮转法实现进程调度。

本实验可加深对进程调度算法的理解。

)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关2实验数据与运行结果)3)于2011年10月22日以前提交本次实验报告(含电子和纸质报告,由学习委员以班为单位统一打包提交)。

2 实验内容或题目1)设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。

2)模拟调度程序可任选两种调度算法之一实现(有能力的同学可同时实现两个调度算法)。

3)程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。

4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。

3 实验步骤与源程序(1) 编写进程控制块数据结构typedef struct node{char name[10];/*进程名*/int prio; /*进程优先级*/int round; /*循环轮转法进程每次轮转的时间片*/int cputime; /*进程累计消耗的CUP时间*/int needtime; /*进程到完成还需要的CUP时间*/int count; /*循环轮转法一个是时间片内进程运行时间*/char state; /*进程的状态:'R':运行,'W':等待,'F':结束*/struct node *next;/*指向下一个进程的链指针*/}PCB;(2)在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中void prior_init(char chose)/*进程优先级法初始化将进程按优先级插入到就绪队列里*/{PCB *p;int i,time1;char na[10];ready=NULL;finish=NULL;run=NULL;《操作系统原理》实验报告 - 2 -printf("\t\t进程优先级算法模拟全过程\n\n");printf("输入进程的个数 N:\n");scanf("%d",&N); for(i=0;i<N;i++)(3)进程优先级法初始化将进程按优先级插入到就绪队列里void prior_init(char chose)/*进程优先级法初始化将进程按优先级插入到就绪队列里*/ {PCB *p;int i,time1;char na[10];ready=NULL;finish=NULL;run=NULL;printf("\t\t进程优先级算法模拟全过程\n\n");printf("输入进程的个数 N:\n");scanf("%d",&N); for(i=0;i<N;i++)(4)进程优先级算法总函数void priority(char chose)//进程优先级算法总函数 { int i=1;while(run!=NULL){run->cputime+=1;run->needtime-=1;run->prio-=1;if(run->needtime==0){run->next=finish;finish=run;run->state='F';run->prio=0;run=NULL;firstin(); }else{if((ready!=NULL)&&(run->prio<ready->prio)) {run->state='W';insert_prio(run);run=NULL;firstin();}《操作系统原理》实验报告 - 3 -}详细代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <windows.h>#include <time.h>/*进程控制块数据结构*/typedef struct node{char name[10];/*进程名*/int prio; /*进程优先级*/int round; /*循环轮转法进程每次轮转的时间片*/ int cputime; /*进程累计消耗的CUP时间*/int needtime; /*进程到完成还需要的CUP时间*/int count; /*循环轮转法一个是时间片内进程运行时间*/ char state; /*进程的状态:'R':运行,'W':等待,'F':结束*/ struct node *next;/*指向下一个进程的链指针*/ }PCB;PCB *finish,*ready,*tail,*run;/*指向三个队列的队首的指针,finish为完成队列头指针,ready为就绪队列头指针,tail为就绪队列的队尾指针,run为当前运行进程头指针*/int N;/*定义进程的数目*/void firstin(void); //调度就绪队列的第一个进程投入运行; voidprint1(char a); //打印表头行信息void print2(char chose,PCB *p); //打印每一行的状态信息 voidprint(char chose); //打印每执行一次算法后所有的进程的状态信息 void insert_prio(PCB *q); //在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中;void prior_init(char chose); //进程优先级法初始化将进程按优先级插入到就绪队列里void priority(char chose); //进程优先级算法总函数 void insert_rr(PCB *q); //在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程的PCB,插到就绪队列的队尾;void roundrun_init(char chose); //循环轮转法初始化将就绪队列保存为FIFO队列void roundrun(char chose); //循环轮转法总算法void main()//主函数{char chose=' ';《操作系统原理》实验报告 - 4 -while((chose!='e')&&(chose!='E')){fflush(stdin);system("cls");printf("\t\t\t两种进程调度算法的模拟\n\n");printf("\tP.进程优先级算法模拟\n\n"); printf("\tR.循环轮转算法模拟\n\n"); printf("\tE.推出程序\n\n");printf("\t请输入你的选择:");scanf("%c",&chose);if((chose!='e')&&(chose!='E')){system("cls");if((chose=='P')||(chose=='p')){prior_init(chose);priority(chose);system("cls");}else if((chose=='r')||(chose=='R')) {roundrun_init(chose);roundrun(chose);system("cls");}}}printf("\n\t\t谢谢使用~~~\n");}void firstin(void)//调度就绪队列的第一个进程投入运行; { if(ready!=NULL){run=ready;ready=ready->next;run->state='R';run->next=NULL;}else《操作系统原理》实验报告 - 5 -{run=NULL;}}void print1(char a)//打印表头行信息{if(toupper(a)=='P'){printf("name cputime needtime priority state \n");}else{printf("name cputime needtime count round state \n"); }}void print2(char chose,PCB *p)//打印每一行的状态信息 {if(toupper(chose)=='P') {printf("%s\t%d\t%d\t%d\t %c\n",p->name,p->cputime,p->needtime,p->prio,p->state);}else{printf("%s\t%d\t%d\t%d\t%d\t%c\n",p->name,p->cputime,p->needtime,p->count,p->round,p->state);}}void print(char chose)//打印每执行一次算法后所有的进程的状态信息{PCB *p;print1(chose);if(run!=NULL){print2(chose,run);}p=ready;while(p!=NULL){print2(chose,p);p=p->next;}《操作系统原理》实验报告 - 6 -p=finish;while(p!=NULL){print2(chose,p);p=p->next;}}void insert_prio(PCB *q)/*在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中;*/ {PCB *p,*s,*r; /*p,r用来控制就绪队列滚动,S指向插入的队列*/s=q;p=ready;r=p;if(s->prio>ready->prio)// 要插入的进程的优先级大于ready的优先级{s->next=ready;ready=s;}else//要插入的进程的优先级不大于ready的优先级 {while(p){if(p->prio>=s->prio) {r=p;p=p->next;}elsebreak;} //找到要插入的位置s->next=p;r->next=s;}}void prior_init(char chose)/*进程优先级法初始化将进程按优先级插入到就绪队列里*/ {PCB *p;int i,time1;char na[10];ready=NULL;《操作系统原理》实验报告 - 7 -finish=NULL;run=NULL;printf("\t\t进程优先级算法模拟全过程\n\n"); printf("输入进程的个数 N:\n");scanf("%d",&N); for(i=0;i<N;i++){p=(PCB*)malloc(sizeof(PCB));printf("输入第%d个进程名\n",i+1); scanf("%s",na);printf("完成进程需要的时间片数\n"); scanf("%d",&time1); strcpy(p->name,na); p->cputime=0;p->needtime=time1; p->state='W';srand((unsigned)time(NULL));//用当前时间,设置种子int ss=1+rand()%6; p->prio=ss;//设置进程优先值初值if(ready==NULL){ready=p;ready->next=NULL; }else{insert_prio(p); }printf("当前就绪队列的进程的信息\n"); print(chose);}printf("%d个进程已按优先级从高到低进到就绪队列中\n",N);printf("按回车键开始模拟优先级算法.....\n");fflush(stdin);getchar();firstin();}void priority(char chose)//进程优先级算法总函数 {int i=1;while(run!=NULL){run->cputime+=1;《操作系统原理》实验报告 - 8 -run->needtime-=1;run->prio-=1;if(run->needtime==0) {run->next=finish;finish=run;run->state='F';run->prio=0;run=NULL;firstin(); }else{if((ready!=NULL)&&(run->prio<ready->prio)) {run->state='W';insert_prio(run);run=NULL;firstin();}}printf("第%d次执行优先级算法\n",i++);print(chose);if(run){printf("按回车键继续下一次优先级算法.....\n");}elseprintf("优先级算法模拟过程结束~~\n");fflush(stdin);getchar();}}void insert_rr(PCB *q)//在轮转法中,将执行了一个时间片单位(为2),//但尚未完成的进程的PCB,插到就绪队列的队尾; {tail->next=q;tail=q;q->next=NULL;}void roundrun_init(char chose)/*循环轮转法初始化将就绪队列保存为FIFO队列*/《操作系统原理》实验报告 - 9 -{PCB *p;int i,time1;char na[10];ready=NULL;finish=NULL;run=NULL;printf("\t\t循环轮转算法模拟全过程\n\n");printf("输入进程的个数 N:\n");scanf("%d",&N); for(i=0;i<N;i++){p=(PCB*)malloc(sizeof(PCB));printf("输入第%d个进程名\n",i+1); scanf("%s",na);printf("完成进程需要的时间片数\n"); scanf("%d",&time1); strcpy(p->name,na); p->cputime=0;p->needtime=time1; p->count=0;p->state='W';p->round=2;if(ready!=NULL){insert_rr(p);}else{p->next=ready;ready=p;tail=p;}printf("当前就绪队列的进程的信息\n"); print(chose); }printf("%d个进程已按FIFO进到就绪队列中\n",N); printf("按回车键开始模循环轮转算法.....\n");fflush(stdin);getchar();run=ready;ready=ready->next; run->state='R';}void roundrun(char chose)//循环轮转法总算法《操作系统原理》实验报告 - 10 -{int i=1;while(run!=NULL){run->cputime+=1;run->needtime-=1; run->count+=1;if(run->needtime==0) {run->next=finish;finish=run;run->state='F';run->prio=0;run=NULL;if(ready!=NULL){firstin();}}else{if(run->count==run->round){run->count=0;if(ready!=NULL){run->state='W';insert_rr(run);firstin();}}}printf("第%d次执行循环轮转算法\n",i++);print(chose);if(run){printf("按回车键继续下一次循环轮转算法.....\n"); }elseprintf("循环轮转算法模拟过程结束~~\n"); fflush(stdin);getchar();}}《操作系统原理》实验报告 - 11 -4 测试数据与实验结果(可以抓图粘贴)一、使用优先级实现进程调度1. 输入以下数据,并且随机产生1—5优先级2.按回车开始模拟优先级算法《操作系统原理》实验报告 - 12 - 3.运行结果二、时间片轮转算法1. 输入以下数据2. 开始模拟运行《操作系统原理》实验报告 - 13 - 3. 运行结束5 结果分析与实验体会经检查,所运行结果正确。

操作系统原理---进程调度实验报告

操作系统原理---进程调度实验报告

一、实验目的通过对进程调度算法的设计,深入理解进程调度的原理。

进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

进程调度分配处理机,是控制协调进程对CPU的竞争,即按一定的调度算法从就绪队列中选中一个进程,把CPU的使用权交给被选中的进程。

进程通过定义一个进程控制块的数据结构(PCB)来表示;每个进程需要赋予进程ID、进程到达时间、进程需要运行的总时间的属性;在RR中,以1为时间片单位;运行时,输入若干个进程序列,按照时间片输出其执行序列。

二、实验环境VC++三、实验内容实现短进程优先调度算法(SPF)和时间片轮转调度算法(RR)[提示]:(1) 先来先服务(FCFS)调度算法原理:每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。

该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。

将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。

它优先考虑在系统中等待时间最长的作业,而不管要求运行时间的长短。

按照就绪进程进入就绪队列的先后次序进行调度,简单易实现,利于长进程,CPU繁忙型作业,不利于短进程,排队时间相对过长。

(2) 时间片轮转调度算法RR原理:时间片轮转法主要用于进程调度。

采用此算法的系统,其程序就绪队列往往按进程到达的时间来排序。

进程调度按一定时间片(q)轮番运行各个进程.进程按到达时间在就绪队列中排队,调度程序每次把CPU分配给就绪队列首进程使用一个时间片,运行完一个时间片释放CPU,排到就绪队列末尾参加下一轮调度,CPU分配给就绪队列的首进程。

固定时间片轮转法:1 所有就绪进程按FCFS 规则排队。

2 处理机总是分配给就绪队列的队首进程。

3 如果运行的进程用完时间片,则系统就把该进程送回就绪队列的队尾,重新排队。

操作系统 进程调度实验报告

操作系统 进程调度实验报告

实验报告课程名称计算机操作系统实验名称进程调度算法模拟专业班级计1103学生姓名贾梦洁指导教师王潇潇实验报告课程名称操作系统原理实验名称实验一进程调度算法模拟姓名贾梦洁学号201107010330专业班级计1103实验日期2014年 4月11日成绩指导教师王潇潇一.实验要求:①进程数不少于5个;②进程调度算法任选;可以用动态优先数加时间片轮转法实现进程调度,每运行一个时间片优先数减3;③用C语言编程;④程序运行时显示进程调度过程。

二.实验内容设计一个简单的进程调度算法,模拟OS中的进程调度过程;三.实验步骤:①设计PCB及其数据结构:进程标识数:ID进程优先数:PRIORITY(优先数越大,优先级越高)进程已占用时间片:CPUTIME,每得到一次调度,值加1;进程还需占用时间片:ALLTIME,每得到一次调度,该值减1,一旦运行完毕,ALLTIME为0)进程队列指针:NEXT,用来将PCB排成队列进程状态:STATE(一般为就绪,可以不用)②设计进程就绪队列及数据结构;③设计进程调度算法,并画出程序流程图;④设计输入数据和输出格式;结构格式:当前正运行的进程:0当前就绪队列:2,1,3,4⑤编程上机,验证结果。

假设调度前,系统中有5个进程,其初始状态如下:ID 0 1 2 3 4PRIORITY 9 38 30 29 0 可否考虑用CPUTIME 0 0 0 0 0 数组或链表ALLTIME 3 2 6 3 4去实现STA TE ready ready ready ready ready①以时间片为单位调度运行;②每次调度ALLTIME不为0,且PRIORITY最大的进程运行一个时间片;③上述进程运行后其优先数减3,再修改其CPUTIME和ALLTIME,重复②,③④直到所有进程的ALLTIME均变为0。

实验源代码:#include<stdio.h>#include<malloc.h>typedef int Status;#define ERROR 0#define OK 1typedef struct PCB{char NAME[10]; //进程名字int PRIO; //进程优先数int ROUNT; //轮转时间片int COUNT; //计数器int NEEDTIME; //需要的CPU时间int CPUTIME; //占用cpu时间char *STATE; //进程状态}ElemPCB;typedef struct QNode{ElemPCB pcb;struct QNode *next;}QNode, *QueuePtr;typedef struct{ //就绪队列QueuePtr RUN; //当前运行进程指针QueuePtr READY; //头指针QueuePtr TAIL; //尾指针}READYQueue;typedef struct{ //完成队列QueuePtr FINISH; //头指针QueuePtr TAIL; //尾指针}FINISHQueue;Status Create(READYQueue &ready);Status Print(READYQueue ready,FINISHQueue finish);Status Printr(READYQueue ready,FINISHQueue finish);Status Fisrt(READYQueue &ready);Status Insert1(READYQueue &ready);Status Insert2(READYQueue &ready);Status Prisch(READYQueue &ready,FINISHQueue &finish);Status Roundsch(READYQueue &ready,FINISHQueue &finish);void main(){char ch;READYQueue ready;FINISHQueue finish;ready.READY=ready.TAIL=(QueuePtr)malloc(sizeof(QNode)); //存储分配ready.RUN=(QueuePtr)malloc(sizeof(QNode));ready.RUN->next=NULL;finish.FINISH=finish.TAIL=(QueuePtr)malloc(sizeof(QNode));Create(ready);//创建后就绪对列中printf("\n就绪对列中初始值:\n");Print(ready,finish);Fisrt(ready);printf("请输入要选择调度的算法(p--优先数调度,r--时间片轮转法):\n");while(1){do{ch=getchar();scanf("%c",&ch);}while(ch!='p' && ch!='r');switch(ch){case 'p'://优先数调度Prisch(ready,finish);break;case 'r'://时间片轮转法Roundsch(ready,finish);break;}}}Status Print(READYQueue ready,FINISHQueue finish){ //打印就绪队列中的进程状态QueuePtr p,q;p=ready.READY;q=finish.FINISH;//运行中的进程if(ready.RUN->next!=NULL){printf("%s",ready.RUN->next->);printf(":%s\t",ready.RUN->next->pcb.STATE);printf("优先数:%d\n",ready.RUN->next->pcb.PRIO);}//就绪队列的进程while(p!=ready.TAIL){printf("%s",p->next->);printf(":%s\t",p->next->pcb.STA TE);printf("优先数:%d\n",p->next->pcb.PRIO);p=p->next;}//完成队列的进程while(q!=finish.TAIL){printf("%s",q->next->);printf(":%s\t",q->next->pcb.STA TE);printf("优先数:%d\n",q->next->pcb.PRIO);q=q->next;}return OK;}Status Printr(READYQueue ready,FINISHQueue finish){ //打印就绪队列中的进程状态QueuePtr p,q;p=ready.READY;q=finish.FINISH;//运行中的进程if(ready.RUN->next!=NULL){printf("%s",ready.RUN->next->);printf(":%s\t",ready.RUN->next->pcb.STATE);printf("剩余时间:%d\n",ready.RUN->next->pcb.NEEDTIME);}//就绪队列的进程while(p!=ready.TAIL){printf("%s",p->next->);printf(":%s\t",p->next->pcb.STA TE);printf("剩余时间:%d\n",p->next->pcb.NEEDTIME);p=p->next;}//完成队列的进程while(q!=finish.TAIL){printf("%s",q->next->);printf(":%s\t",q->next->pcb.STA TE);printf("剩余时间:%d\n",q->next->pcb.NEEDTIME);q=q->next;}return OK;}Status Create(READYQueue &ready){QueuePtr p;int n;printf("请输入进程个数:");scanf("%d",&n);while(i<n){p=(QueuePtr)malloc(sizeof(QNode));printf("输入第%d进程名:",i+1);scanf("%s",p->);printf("输入进程需要的时间:");scanf("%d",&p->pcb.NEEDTIME);printf("输入进程的进程优先数:");scanf("%d",&p->pcb.PRIO);p->pcb.STATE="W";p->pcb.ROUNT=2;p->pcb.COUNT=0;i++;p->next=NULL;ready.TAIL->next=p;ready.TAIL=p;}return OK;}Status Fisrt(READYQueue &ready){if(ready.READY==ready.TAIL)return ERROR;ready.RUN->next=ready.READY->next;ready.RUN->next->pcb.STA TE="RUN"; //修改进程状态if(ready.TAIL==ready.READY->next)ready.READY=ready.TAIL;elseready.READY->next=ready.READY->next->next; //头指针后移printf("\n%s被从就绪队列调度运行\n",ready.RUN->next->);}Status Insert1(READYQueue &ready){int i=0,j=0;QueuePtr p=ready.READY,q;ElemPCB temp;QueuePtr s=(QueuePtr)malloc(sizeof(QNode));s->pcb=ready.RUN->next->pcb;s->next=NULL; //将未完成的进程插入就绪队列ready.TAIL->next=s;ready.TAIL=s;//按优先数从大到小排序for(p;p!=ready.TAIL;p=p->next){for(q=p->next;q!=ready.TAIL;q=q->next){if(p->next->pcb.PRIO < q->next->pcb.PRIO){temp=p->next->pcb;p->next->pcb=q->next->pcb;q->next->pcb=temp;}}}return OK;}Status Insert2(READYQueue &ready){QueuePtr p=ready.RUN->next;if(p->pcb.NEEDTIME > 0){ready.TAIL->next=p; //插入到就绪队列ready.TAIL=p;ready.RUN->next=NULL;}return OK;}Status Prisch(READYQueue &ready,FINISHQueue &finish){int i=0 ;while(ready.RUN->next!=NULL){ready.RUN->next->pcb.CPUTIME++;ready.RUN->next->pcb.NEEDTIME--;ready.RUN->next->pcb.PRIO-=3;if(ready.RUN->next->pcb.NEEDTIME==0){finish.TAIL->next=ready.RUN->next; //插入到完成队列finish.TAIL=ready.RUN->next; //尾指针后移ready.RUN->next->pcb.STA TE="FINISH";ready.RUN->next=NULL;if(ready.READY!=ready.TAIL){Fisrt(ready);}}else if(ready.READY != ready.TAIL && (ready.RUN->next->pcb.PRIO) < (ready.READY->next->pcb.PRIO)){ready.RUN->next->pcb.STA TE="W";printf("%s被调到就绪队列里\n",ready.RUN->next->);Insert1(ready);Fisrt(ready);}i++;printf("\n进程执行第%d个时间片的结果:\n",i);Print(ready,finish);}return OK;}Status Roundsch(READYQueue &ready,FINISHQueue &finish){int i=0;while(ready.RUN->next!=NULL){ready.RUN->next->pcb.CPUTIME++;ready.RUN->next->pcb.NEEDTIME--;ready.RUN->next->pcb.COUNT++;if(ready.RUN->next->pcb.NEEDTIME==0){finish.TAIL->next=ready.RUN->next; //插入到完成队列finish.TAIL=ready.RUN->next; //尾指针后移ready.RUN->next->pcb.STA TE="FINISH";ready.RUN->next=NULL;if(ready.READY!=ready.TAIL){Fisrt(ready);}}else if(ready.RUN->next->pcb.COUNT==ready.RUN->next->pcb.ROUNT){ready.RUN->next->pcb.COUNT=0;if(ready.READY != ready.TAIL){ready.RUN->next->pcb.STATE="W";printf("%s被调到就绪队列里\n",ready.RUN->next->);Insert2(ready);Fisrt(ready);}}i++;printf("\n进程执行第%d个时间片的结果:\n",i);Printr(ready,finish);}return OK;}四.实验运行结果:(中间过程截图略)五.实验总结通过这次实验,对于进程调度算法的知识有了更加深刻的掌握。

操作系统实验之进程调度报告

操作系统实验之进程调度报告

实验一:进程调度一、实习内容1.模拟批处理多道操作系统的进程调度;2.模拟实现同步机构避免并发进程执行时可能与时间相关的错误;二、实习目的进程调度时进程管理的主要内容之一,通过设计,编制,调试一个简单的进程调度模拟系统,对进程调度,进程运行状态变换及PV操作加深理解和掌握。

三、实习题目采用剥夺式优先算法,对三个进程进行模拟调度模拟PV操作同步机构,用PV操作解决进程进入临界区的问题。

【提示】(1)对三个进程进行模拟调度,对各进程的优先数静态设置,P1,P2,P3三个进程的优先数为1,2,3,并指定P1的优先数最高,P3的优先数最低,每个进程都处于执行态“e”,就绪态“r”,等待态“w”三种状态之一,并假定初始态为“r”。

(2)每一个进程用一个PCB表,PCB表的内容根据具体情况设置,该系统在运行过程中能显示或打印各进程和参数的变化情况,以便观察各进程的调度。

(3)在完成必要的初始化后,便进入进程调度程序,首先由P1进入执行,当执行进程因等待某各事件被阻塞或唤醒某个进程等待进程时,转进程调度。

(4)在进入临界区前后,调PV操作。

(5)如果被唤醒的进程优先数高于现有执行的进程,则剥夺现行进程的执行权。

(6)当三个进程都处于等待状态时,本模拟系统退出执行。

四、示例1.数据结构:(1)进程控制块PCBstruct{int id;char status;int priority;int waiter1;}(2)信号量struct{int value;int waiter2;}sem[2](3)现场保护栈stackchar stack[11][4]每个进程都有一个大小为10个字的现场保护栈,用来保护被中断时的断点地址等信息。

(4)全局变量int i;用以模拟一个通用寄存器char addr;用以模拟程序计数器int m1,m2;为系统设置的公用数据被三个进程共享使用。

五、程序框图:六、程序说明:本程序是用C语言编写,模拟三个进程的运行情况,过程在运行中要调用P操作申请信号量,如果该过程得到其申请的信号量,就继续运行,否则P操作阻塞该申请过程的运行,并将过程置为所申请信号量的等待者,如果已有其它过程在等待同一信号量则将该申请过程排在所有等待进程之后。

进程调度实验报告范文

进程调度实验报告范文

进程调度实验报告范文i快鬲紳狡犬爹整芦SHAAN某IUNIVERSITYOFSCIENCE&TECHNOLOG¥操作系统实验报告实验1进程调度算法报告日期:2022-6-10姓名:学号:班级:任课教师:实验1进程调度算法一、实验内容按优先数调度算法实现处理器调度。

二、实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。

当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。

本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。

三、实验原理设计一个按优先数调度算法实现处理器调度的程序。

假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:进程名指针要求运行时间优先数状态其中,进程名一一作为进程的标识,假设五个进程的进程名分别为Pi,P2,P3,P4,P5。

指针一一按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”要求运行时间一一假设进程需要运行的单位时间数。

优先数一一赋予进程的优先数,调度时总是选取优先数大的进程先执行。

状态——可假设有两种状态,“就绪”状态和“结束”状态。

五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。

在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。

为了调度方便,把五个进程按给定的优先数从大到小连成队列。

用一单元指出队首进程,用指针指出队列的连接情况。

例:队首标志K2KiPiK2P2K3P3K4P4K5P5K4K5K3K12312415342RRRRRPCB1PCB2PCB3PCB4PCB5处理器调度总是选队首进程运行。

采用动态改变优先数的办法,进程每运行一次优先数就减“1”。

由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:优先数-1要求运行时间-1来模拟进程的一次运行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机科学系
实验报告书
课程名:《操作系统原理》
题目:进程调度
班级:
学号:
姓名:
操作系统原理实验——进程调度实验报告
一、目的与要求
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 0
struct 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(); //让程序停下来,可以查看结果。

while(head!=null)
{
run=head;
temp=head;
temp->used=temp->used+1;
temp->need=temp->need-1;
temp->prior=temp->prior-1;
temp->status='R';
head=head->next;
if (run->need!=0)
{
if (head!=null && run->prior<head->prior)
{
temp=head->next;
}
else
{
head=run;
}
}
else
{
temp->status='F';
}
}
printf("所有进程均已运行结束!,程序退出\n\n");
}
4 测试数据与实验结果(可以抓图粘贴)
5 结果分析与实验体会
通过本次实验,加深了对进程调度算法的理解。

明白了进程是操作系统最重要的概念之一。

但在本次试验中,因为基础知识的不牢固,也出现很多问题,没有达到预期的效果。

但在老师的指导下,代码逐渐完善,能够无差错并成功运行。

相关文档
最新文档