实验一、进程调度实验报告
操作系统实验报告进程调度
操作系统实验报告进程调度操作系统实验报告:进程调度引言在计算机科学领域中,操作系统是一个重要的概念,它负责管理和协调计算机系统中的各种资源,包括处理器、内存、输入/输出设备等。
其中,进程调度是操作系统中一个非常重要的组成部分,它负责决定哪个进程在何时获得处理器的使用权,以及如何有效地利用处理器资源。
实验目的本次实验的目的是通过对进程调度算法的实验,深入理解不同的进程调度算法对系统性能的影响,并掌握进程调度算法的实现方法。
实验环境本次实验使用了一台配备了Linux操作系统的计算机作为实验平台。
在该计算机上,我们使用了C语言编写了一些简单的进程调度算法,并通过模拟不同的进程调度场景进行了实验。
实验内容1. 先来先服务调度算法(FCFS)先来先服务调度算法是一种简单的进程调度算法,它按照进程到达的顺序进行调度。
在本次实验中,我们编写了一个简单的FCFS调度算法,并通过模拟多个进程同时到达的情况,观察其对系统性能的影响。
2. 短作业优先调度算法(SJF)短作业优先调度算法是一种根据进程执行时间长度进行调度的算法。
在本次实验中,我们编写了一个简单的SJF调度算法,并通过模拟不同长度的进程,观察其对系统性能的影响。
3. 时间片轮转调度算法(RR)时间片轮转调度算法是一种按照时间片大小进行调度的算法。
在本次实验中,我们编写了一个简单的RR调度算法,并通过模拟不同时间片大小的情况,观察其对系统性能的影响。
实验结果通过实验,我们发现不同的进程调度算法对系统性能有着不同的影响。
在FCFS 算法下,长作业会导致短作业等待时间过长;在SJF算法下,长作业会导致短作业饥饿现象;而RR算法则能够较好地平衡不同进程的执行。
因此,在实际应用中,需要根据具体情况选择合适的进程调度算法。
结论本次实验通过对进程调度算法的实验,深入理解了不同的进程调度算法对系统性能的影响,并掌握了进程调度算法的实现方法。
同时,也加深了对操作系统的理解,为今后的学习和研究打下了良好的基础。
实验一、进程调度实验报告
实验一、进程调度实验报告一、实验目的进程调度是操作系统中的核心功能之一,其目的是合理地分配 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分析:先来先服务调度算法简单直观,但对于短作业可能会造成较长的等待时间,导致平均等待时间和平均周转时间较长。
操作系统实验报告进程调度
操作系统实验报告进程调度操作系统实验报告:进程调度引言操作系统是计算机系统中最核心的软件之一,它负责管理和调度计算机的资源,提供良好的用户体验。
在操作系统中,进程调度是其中一个重要的功能,它决定了进程的执行顺序和时间片分配,对于提高计算机系统的效率和响应能力至关重要。
本篇实验报告将重点介绍进程调度的相关概念、算法和实验结果。
一、进程调度的概念进程调度是操作系统中的一个重要组成部分,它负责决定哪个进程可以使用CPU,并为其分配执行时间。
进程调度的目标是提高系统的吞吐量、响应时间和公平性。
在多道程序设计环境下,进程调度需要考虑多个进程之间的竞争和协作,以实现资源的合理利用。
二、进程调度算法1. 先来先服务调度(FCFS)先来先服务调度算法是最简单的进程调度算法之一,它按照进程到达的顺序进行调度,即先到达的进程先执行。
这种算法的优点是公平性高,缺点是无法适应长作业和短作业混合的情况,容易产生"饥饿"现象。
2. 最短作业优先调度(SJF)最短作业优先调度算法是根据进程的执行时间来进行调度的,即执行时间最短的进程先执行。
这种算法的优点是能够最大程度地减少平均等待时间,缺点是无法适应实时系统和长作业的情况。
3. 时间片轮转调度(RR)时间片轮转调度算法是一种抢占式调度算法,它将CPU的执行时间划分为固定大小的时间片,并按照轮转的方式分配给各个进程。
当一个进程的时间片用完后,它将被挂起,等待下一次调度。
这种算法的优点是能够保证每个进程都能够获得一定的执行时间,缺点是无法适应长作业和短作业混合的情况。
4. 优先级调度(Priority Scheduling)优先级调度算法是根据进程的优先级来进行调度的,优先级高的进程先执行。
这种算法的优点是能够根据进程的重要性和紧急程度进行灵活调度,缺点是可能会导致低优先级的进程长时间等待。
三、实验结果与分析在实验中,我们使用了不同的进程调度算法,并对其进行了性能测试。
实验一 进程调度
PCB1->name=PCB2->name;
PCB1->state=PCB2->state;
PCB1->CPU_time=PCB2->CPU_time;
}
void main()
{
InitQ();
Sleep(1000);
system("cls");
dispath();}
原始数据纪录:
试验原始数据
**************
洛阳理工学院实验报告
系别
数据科学与大数据系
班级
学号
姓名
课程名称
操作系统
实验日期
实验名称
进程调度
成绩
实验目的:
通过本次实验,加深对进程概念的理解,进一步掌握进程状态的转变及进程调度策略。
实验条件:
操作系统:Windows10
IDE:VScode
编译:gcc
实验原理:
设计程序模拟进程的时间片轮转法调度过程。假设初始状态为:有ready个进程处于就绪状态,有blocked个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过counter个时间片,唤醒处于阻塞队列队首的进程。
deleteNode->PCB.state=1;
printf("--进程状态变为:%d\n",deleteNode->PCB.state);
counte=0;
}
}
}else
return;
}
}
void InitQ()
{
int revalrq=createQueue(&rq);
进程调度 实验报告
一、实验目的
多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。因而引起进程调度。本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。
二、实验内容
1.优先权法、轮转法
简化假设
1)进程为计算型的(无I/O)
2)进程状态:ready、running、finish
{
int num; //进程号
int attime,servtime; //进程到达时间,服务时间
process *next;
};
struct process*creatlist(int); //新建一个链表
void insert(struct process *first,struct process *s); //插入一个节点(尾插法)
}
}
void privilege(struct process1 *first)
{
struct process1* p,*r=first,*t;
p=first->next;
int b=0;
while (first->next)
{
r=first;
p=first->next;
cout<<"/********************"<<b<<"*****************************/"<<endl;
{
struct process1 *p,*r;
p=first->next;
r=first;
int a=1;
while (a)
进程调度实验报告
进程调度实验报告这篇文章将讨论进程调度的相关实验及其结果。
进程调度是指计算机在多任务环境下对进程进行管理和调度,以便最大化系统的效率和可靠性。
在进程调度实验中,我们使用了Linux操作系统,并编写了一段程序来模拟具有多个进程的计算机系统。
我们首先定义了三个不同类型的进程:I/O Bound进程、CPU Bound进程和Interactive进程。
I/O Bound进程是一个需要从磁盘读取数据并进行处理的进程,CPU Bound进程则是一个需要使用CPU来完成复杂计算的进程,而Interactive进程是用户与系统交互的进程。
实验中,我们使用了三个不同的进程调度算法:Round Robin、先来先服务(FCFS)和最短作业优先(SJF)。
Round Robin是最简单的进程调度算法,它会将CPU时间分配给每个进程一段时间,然后切换到下一个进程。
FCFS根据队列中进程的顺序分配CPU时间。
SJF则是根据进程执行所需时间的长度进行调度的。
在我们的实验中,我们评估了每个算法的性能,并得出了以下结论:Round Robin算法的结果最好。
我们发现这种算法的表现非常良好,因为它能在繁忙的计算机系统中平均分配CPU时间,并避免长时间运行的进程占用计算机资源。
FCFS算法的性能很糟糕。
我们发现在FCFS算法中,长时间运行的进程会占用系统资源,而短时间运行的进程则需要等待很久才能获得CPU时间。
这样会导致整个计算机系统的效率下降。
SJF算法表现一般。
我们发现,在繁忙的系统中,SJF算法会基于当前进程的下一步行动来调度进程。
但是,如果多个进程具有相似的执行时间,并且它们需要同时运行,则存在一定的竞争和时间分配的缺陷。
总体来说,进程调度算法是计算机系统中非常重要的一部分,因为它会直接影响系统的效率和可靠性。
在我们的实验中,我们发现Round Robin算法是最好的选择,它能够抵消系统中不同进程需要不同时间的差异,确保每个进程都能获得相应的时间来完成任务。
进程调度实验报告
进程调度实验报告一、实验目的。
本实验旨在通过对进程调度算法的模拟和实验,加深学生对进程调度原理的理解,掌握各种进程调度算法的特点和应用场景,提高学生的实际操作能力和分析问题的能力。
二、实验环境。
本次实验使用了C语言编程语言,通过模拟实现了先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)和多级反馈队列(MFQ)四种进程调度算法。
三、实验过程。
1. 先来先服务(FCFS)调度算法。
先来先服务调度算法是一种非抢占式的调度算法,按照进程到达的先后顺序进行调度。
在本次实验中,我们通过模拟多个进程到达并排队等待CPU执行,观察其平均等待时间和平均周转时间。
实验结果表明,先来先服务调度算法适用于作业长度差异较大的情况,但容易产生“饥饿”现象。
2. 最短作业优先(SJF)调度算法。
最短作业优先调度算法是一种非抢占式的调度算法,按照作业执行时间的长短进行调度。
在本次实验中,我们通过模拟多个作业的执行时间,观察其平均等待时间和平均周转时间。
实验结果表明,最短作业优先调度算法能够最大程度地减少平均等待时间,但可能会导致长作业被“饿死”。
3. 时间片轮转(RR)调度算法。
时间片轮转调度算法是一种抢占式的调度算法,每个进程被分配一个时间片,当时间片用完后,该进程被放到队尾等待。
在本次实验中,我们通过模拟多个进程的执行和时间片的调度,观察其平均等待时间和平均周转时间。
实验结果表明,时间片轮转调度算法能够保证每个进程都能得到一定的执行时间,但可能会导致上下文切换频繁。
4. 多级反馈队列(MFQ)调度算法。
多级反馈队列调度算法是一种综合性的调度算法,根据进程的优先级和执行时间进行动态调整。
在本次实验中,我们通过模拟多个进程的执行和不同优先级队列的调度,观察其平均等待时间和平均周转时间。
实验结果表明,多级反馈队列调度算法能够兼顾短作业和长作业,提高了系统的整体性能。
四、实验总结。
通过本次实验,我们深入理解了不同进程调度算法的特点和适用场景。
实验进程调度的实验报告
一、实验目的1. 加深对进程概念和进程调度算法的理解。
2. 掌握进程调度算法的基本原理和实现方法。
3. 培养编程能力和系统分析能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验内容1. 实现进程调度算法2. 创建进程控制块(PCB)3. 模拟进程调度过程四、实验原理进程调度是操作系统核心功能之一,负责将CPU分配给就绪队列中的进程。
常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转(RR)等。
1. 先来先服务(FCFS)算法:按照进程到达就绪队列的顺序进行调度。
2. 短作业优先(SJF)算法:优先调度运行时间最短的进程。
3. 优先级调度算法:根据进程的优先级进行调度,优先级高的进程优先执行。
4. 时间片轮转(RR)算法:每个进程分配一个时间片,按顺序轮流执行,时间片结束后进行调度。
五、实验步骤1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、运行时间、优先级、状态等信息。
2. 创建进程队列,用于存储就绪队列、等待队列和完成队列。
3. 实现进程调度算法:a. FCFS算法:按照进程到达就绪队列的顺序进行调度。
b. SJF算法:优先调度运行时间最短的进程。
c. 优先级调度算法:根据进程的优先级进行调度。
d. 时间片轮转(RR)算法:每个进程分配一个时间片,按顺序轮流执行。
4. 模拟进程调度过程:a. 初始化进程队列,将进程添加到就绪队列。
b. 循环执行调度算法,将CPU分配给就绪队列中的进程。
c. 更新进程状态,统计进程执行时间、等待时间等指标。
d. 当进程完成时,将其移至完成队列。
六、实验结果与分析1. FCFS算法:按照进程到达就绪队列的顺序进行调度,简单易实现,但可能导致短作业等待时间过长。
2. SJF算法:优先调度运行时间最短的进程,能提高系统吞吐量,但可能导致进程饥饿。
进程的调度实验报告(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]
实验一进程调度一.实验题目:(1)、编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。
2)、编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。
二:实验目的用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.三.实验内容:<一>最高优先级优先调度算法1)优先级简介动态优先数是指在进程创建时先确定一个初始优先数,以后在进程运行中随着进程特性的改变不断修改优先数,这样,由于开始优先数很低而得不到CPU的进程,就能因为等待时间的增长而优先数变为最高而得到CPU运行。
例如:在进程获得一次CPU后就将其优先数减少1。
或者,进程等待的时间超过某一时限时增加其优先数的值,等等。
2)详细设计优先权调度算法:1、设定系统中有五个进程,每一个进程用一个进程控制块( PCB)表示,进程队列采用链表数据结构。
2、进程控制块包含如下信息:进程名、优先数、需要运行时间、已用CPU时间、进程状态等等。
3、在每次运行设计的处理调度程序之前,由终端输入五个进程的“优先数”和“要求运行时间”。
4、进程的优先数及需要的运行时间人为地指定.进程的运行时间以时间片为单位进行计算。
5、采用优先权调度算法,将五个进程按给定的优先数从大到小连成就绪队列。
用头指针指出队列首进程,队列采用链表结构。
6、处理机调度总是选队列首进程运行。
采用动态优先数办法,进程每运行一次优先数减“1”,同时将已运行时间加“1”。
7、进程运行一次后,若要求运行时间不等于已运行时间,则再将它加入就绪队列;否则将其状态置为“结束”,且退出就绪队列。
8、“就绪”状态的进程队列不为空,则重复上面6,7步骤,直到所有进程都成为“结束”状态。
9、在设计的程序中有输入语句,输入5个进程的“优先数”和“要求运行时间”,也有显示或打印语句,能显示或打印每次被选中进程的进程名、运行一次后队列的变化,以及结束进程的进程名。
进程调度算法 实验报告
进程调度算法实验报告
《进程调度算法实验报告》
一、实验目的
本实验旨在通过对进程调度算法的实验研究,探究不同调度算法对系统性能的影响,进一步加深对操作系统进程调度的理解。
二、实验内容
本次实验选择了三种常见的进程调度算法,包括先来先服务(FCFS)、最短作业优先(SJF)和轮转调度(RR),并通过模拟不同进程的到达时间和执行时间,分别对这三种算法进行实验比较。
三、实验步骤
1. 设计实验用例:确定不同进程的到达时间和执行时间,以及不同调度算法的时间片大小。
2. 模拟执行:根据设计的实验用例,使用模拟工具模拟不同调度算法的执行过程,并记录每个进程的执行情况和系统的运行情况。
3. 数据分析:根据实验结果,对比不同调度算法的平均等待时间、平均周转时间等指标,分析各算法的优缺点。
四、实验结果
通过实验比较,得出以下结论:
1. 先来先服务(FCFS)算法:适用于执行时间较短的进程,但容易导致长作业等待时间过长。
2. 最短作业优先(SJF)算法:能够最大程度地减少平均等待时间和平均周转时间,但无法处理长作业优先的情况。
3. 轮转调度(RR)算法:能够保证每个进程都能及时得到执行,但可能导致部分进程的等待时间过长。
五、实验结论
根据实验结果,不同的进程调度算法适用于不同的场景。
在实际应用中,需要根据系统的实际情况和需求选择合适的调度算法,以最大程度地提高系统的性能和效率。
六、实验总结
通过本次实验,加深了对进程调度算法的理解,同时也了解了不同算法在实际应用中的优缺点。
希望通过本次实验,能够为进程调度算法的研究和应用提供一定的参考和借鉴。
实验一:进程调度实验报告书
淮海工学院计算机工程学院实验报告书课程名:《操作系统原理A》题目:进程调度班级:软件132学号: 07姓名:孙莹莹操作系统原理实验——进程调度实验报告一、目的与要求1)进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C 语言编写一个进程调度模拟程序,使用优先级或时间片轮转法实现进程调度。
本实验可加深对进程调度算法的理解。
2)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果)3)于2015年4月18日以前提交本次实验报告(含电子和纸质报告,由学习委员以班为单位统一打包提交)。
二、实验内容或题目1)设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。
2)模拟调度程序可任选两种调度算法之一实现(有能力的同学可同时实现两个调度算法)。
3)程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。
4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。
三、实验步骤与源程序(1)流程图(2)实验步骤1)PCB的结构:优先级算法中,设PCB的结构如下图所示,其中各数据项的含义如下:Id:进程标识符号,取值1—5。
Priority:优先级,随机产生,范围1—5。
Used:目前已占用的CPU时间数,初值为0;当该进程被调用执行时,每执行一个时间片,Used 加1。
Need:进程尚需的CPU时间数,初值表示该进程需要运行的总时间,取值范围为5—10。
并随机产生,每运行一个时间片need减1;need为0则进程结束。
Status:进程状态R(运行),W(就绪),F(完成);初始时都处于就绪状态。
Next:指向就绪队列中下一个进程的PCB的指针。
2)初始状态及就绪队列组织:5个进程初始都处于就绪状态,进程标识1—5,used初值都为0。
各进程的优先级随机产生,范围1—5。
处于就绪状态的进程,用队列加以组织,队列按优先级由高到低依次排列,队首指针设为head,队尾指针为tail。
进程调度算法实验报告
实验报告实验一:进程调度算法一、实验目的1.利用高级语言实现三种不同及进程调度算法:短作业优先算法、时间片轮转调度算法和优先级调度算法。
2.通过实验理解有关进程控制块,进程队列等的概念。
二、实验原理各调度算法思想:1.先来先服务算法(FCFS):按照进程进入就绪队列的先后次序来分配CPU,一旦一个进程占有CPU,就一直运行下去,知道该进程完成工作,才释放CPU。
2.时间片轮转算法:系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择队列中的第一个进程执行,且仅能执行一个时间片,在使用完一个时间片后,即使进程并未完成其运行,也必须将CPU交给下一个进程;如果一个时间片未使用完就完成了该进程,则剩下的时间分配给下一个进程。
3.优先权调度算法;在创建进程时就确定优先权,确定之后在整个程序运行期间不再改变,根据优先级排列,系统会把CPU分配给优先权最高的进程。
三、实验步骤、数据记录及处理1、算法流程抽象数据类型的定义:PCB块结构体类型struct PCB{int name;int arrivetime; //到达时间int servicetime; //服务时间//int starttime[max]; //开始时间int finishtime; //完成/结束时间int turntime; //周转时间int average_turntime; //带权周转时间int sign; //标志进程是否完成int remain_time; //剩余时间int priority; //优先级}pcb[max];主程序的流程以及各程序模块之间的层次(调用)关系:主程序中从键盘得到进程的数量,创建PCB,调用layout()函数显示选择界面。
Layout()函数中选择相应的算法并调用相关函数如:FCFS()、time_segment();、Priority(),这三个函数分别实现先来先服务算法,时间片轮转算法和优先级算法,最后分别打印。
操作系统实验之进程调度报告
实验一:进程调度一、实习内容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操作阻塞该申请过程的运行,并将过程置为所申请信号量的等待者,如果已有其它过程在等待同一信号量则将该申请过程排在所有等待进程之后。
进程调度实验报告
进程调度实验报告引言:进程调度是操作系统中一个重要的概念,它决定了一个进程何时开始执行、何时暂停、何时唤醒等等。
一个良好的进程调度算法可以提高系统的效率和响应时间。
在这次实验中,我们将对不同的进程调度算法进行测试和对比分析,旨在探究不同算法对系统性能的影响。
实验步骤:1. 实验准备在实验开始前,我们需要准备一个充分复杂的测试环境,包括不同类型的进程、不同进程的优先级、进程执行时间等参数。
这些参数的设置将影响我们对不同调度算法的评估。
2. 先来先服务调度算法(FCFS)先来先服务调度算法是最简单的一种调度算法,按照进程到达CPU的顺序依次执行。
在这个实验中,我们首先对先来先服务调度算法进行测试。
结果显示,对于短时进程,FCFS算法效果较好,但在遇到长时进程时,会出现“饥饿”现象,易导致优先级较低的进程无法获得CPU时间。
3. 短作业优先调度算法(SJF)短作业优先调度算法根据进程执行时间的长短来进行调度。
在实验中,我们通过设置不同长度的进程来对SJF算法进行测试。
结果显示,SJF算法能够较好地避免“饥饿”现象,但如果长作业在一个时间片内到达,就会导致短作业等待时间过长。
4. 优先级调度算法(Priority)优先级调度算法通过为每个进程指定一个优先级来进行调度,优先级高的进程先执行。
在实验中,我们设置不同优先级的进程,测试Priority算法的效果。
结果显示,Priority算法能够合理地根据优先级分配CPU时间,但如果优先级的划分不合理,可能导致某些进程优先级一直很低,影响整体系统性能。
5. 时间片轮转调度算法(Round Robin)时间片轮转调度算法是一种较为公平的调度算法,每个进程被分配一个时间片,在时间片用完后,进程暂停执行,并被放置于“就绪队列”尾部,等待下一个时间片。
在测试中,我们可以通过设置不同的时间片长度来观察时间片轮转算法的效果。
结果显示,时间片轮转算法能够较好地平衡进程的等待时间和执行时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
—
结果分析:根据上述输入的三个进程的信息可以得到:优先级最高的是进程
cc
最先调度进程 cc 的状态为运行态,需要执行的时间为 10 当前就绪队列状态为:进程
aa 先级比较高,处于就绪队列前面,而进程 bb 先级是三者中最低的,所以处于就绪
队列的最后。而此时这两个进程的状态都为就绪态。
欢迎下载
2
—
printf("\n 请输入进程的个数: "); num = geti(); for(i=0; i < num; i++) {
printf("\n 进程号 No.%d:\n",i+1); p=getpch(PCB); printf("\n 输入进程名 :"); scanf("%s",p->name); printf("\n 输入进程运行时间 :"); p ->ntime = geti();
printf("\t 输入有误 !! 输入只能为正整数,请重新输入 ...\n");
fflush(stdin);
i = 0;
ch = getchar();
欢迎下载
7
—
}else{ i = i*10 + (ch - '0'); ch = getchar();
} } return i; }
void findpos()///////
流程图如下:
欢迎下载
5
—
开始 初始化 PCB,输入进程信息 各进程按 FCFS 原则排队等待调度
所有队列都 为空
就绪队列首进程投入运行 时间片到, 运行进程已 占用 CPU 时间 +1
插入新的 进程
运行进程已占用 CPU 时间已达到所
需的运行时间
把运行进程插入到下一 个队列的队尾
进程完成,撤 消该进程
printf(" |%d\t",pr->rtime);
printf(" |%d\t",pr->etime);
printf("\n");
}
void check()/* 建立进程查看函数 */
{
PCB *pr;
printf("\n ****
当前正在运行的进程是 :%s",ready->name);/* 显示当前运行的进
广东技术师范学院实验报告
学院:
计算机科学学 院
姓名:
实验地点:
专业:
计算机科学与 技术(师范)
班级:
学号:
组别:
成绩: 组员:
实验日期:
指导教师签名:
预习情况
操作情况
考勤情况
数据处理情况
实验名称: 实验一、进程调度实验 一、实验目的
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的 理解
{
printf("\nname\t state\t queue\t ntime\t rtime\t
在队列可停留时间 \t \n");
printf("|%s\t",pr->name);
printf(" |%c\t",pr->state);
printf(" |%d\t",pr->queue);
printf(" |%d\t",pr->ntime);
{
char ch;
int i = 0;
fflush(stdin);
ch = getchar();
while(ch == '\n'){
printf("\tf 输入不能为空 .. 请重新输入 \n");
fflush(stdin);
ch = getchar();
}
while(ch != '\n'){
if(ch > '9' || ch < '0'){
程 */
disp(ready);
pr= ready ->link;
printf("\n**** 当前就绪队列状态为 :\n");/* 显示就绪队列状态 */
欢迎下载
10
—
while(pr!=NULL) {
disp(pr); pr=pr->link; } }
void sort()// 调整进程队列
{ if(!ready->link ||ready->queue < ready->link->queue) return;
欢迎下载
9
—
printf("\n"); p->rtime=0; p->state='w'; p->queue =1; p->etime = TIME; p->link=NULL; insert();/* 调用 insert 函数 */ } }
void disp(PCB *pr)/* 建立进程现实函数,用于显示当前进程 */
printf("\nThe execute name:%s\n",ready ->name); ready ->state = 'R'; check(); running(); printf("\n 按 i 键添加新进程 .... 按其他任意键继续运行 ..."); fflush(stdin); ch = getchar(); if (ch == 'i'|| ch=='I')
二、实验类别 综合性实验。综合高级语言编程、进程调度模型、进程调度算法及数据结构等多方
面的知识
三、实验内容和步骤
1.编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进 程进行调度。
“最高优先数优先”调度算法的基本思想是把 CPU 分配给就绪队列中优先数最高 的进程。
静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。 动态优先数是指进程的优先数在创建进程时可以给定一个初始值, 并且可以按一定 原则修改优先数。例如:在进程获得一次 CPU后就将其优先数减少 1。或者,进程等待 的时间超过某一时限时增加其优先数的值,等等 该题根据老师给的代码用 Visual C++ 运行,结果以及分析如下:
更新状态量
{
PCB *ps = pfend;
if(!ps || !ps -> link || (ps-> link->queue - ps->queue) > 1)
pinsert = ps;
else{
while (ps->link && ps ->link->queue != (pfend ->queue +2))
int etime;
//// 进程在本队列可运行的时间片
struct pcb *link;
}PCB;
PCB *ready = NULL, *pinsert = NULL, *pfend = NULL,*p =NULL; 列,进程插入位置的变量 */
/* 就 绪 队
int geti()
// 使用户仅能输入整数
结果分析:当调度进程中只剩下进程 aa 程 cc 这时根据进程优先级的大小,进程 aa 入运行态。当进程 aa 调度时,进程调度程序中直剩下进程 cc 这时进程 cc 进入运行 态,而当前就绪队列将为空。
欢迎下载
4
—
直到:
结果分析:当进程 i 的 CPU 占用时间等于所需要的执行时间时, 进程 cc 调度完成, 则这时进程调度中已经没有需要调度的进程了,则整个进程调度完成。
input();
}
} void destroy()/* 建立进程撤销函数 ( 进程运行结束,撤销进程 )*/ {
printf("\n 进程 [%s] 已完成 .\n",ready->name); p = ready; ready = ready->link; free(p); if (ready && ready -> queue == pinsert ->queue)
}
void addnew()// 添加新的进程 {
if(ready ->queue != 1){ (ready -> queue)++; ready->etime *= 2; ready -> state='w';
欢迎下载
11
—
sort();/* 调用 sort 函数 */ input(); } else{
findpos(); }
void running()/* 建立进程就绪函数 ( 进程运行时间到,置就绪状态 )*/ {
(ready -> rtime)++; ready ->etime --; if(ready->rtime == ready->ntime){
destroy(); return; }else if(ready ->etime == 0){ int time = 2; (ready -> queue)++;
拟多个逻辑上的队列,通过维护几个链表的状态信息来找到每个进程运行完后应该插入的地方,还 有一个标志位 Fend 用来表明新插入的队列的位置。
(2)在建立优先数就绪队列时主要运用,链表插入模型。但是由于本题是从建立、到完 成一个就绪对列,所以必须分多种情况讨论。 五、实验体会和收获 ( 1)本次试验后对优先数调度算法和时间片轮转调度算法实现的过程,有了很清楚的 认识、理解。设计计数器来对进程执行状态的时间分析, 使得进程调度这一抽象模型得 到具体化。之后,便是对进程的插入(执行完,插入到完成队列,否则插入到就绪)和 再次调度(当改进程再次满足条件时,从就绪队列调度到执行队列)重复过程。 ( 2)通过设计 PCB 结构,模拟进程调度,加深了对进程的理解。 ( 3)提高了 C 语言编程动手能力