随机进程调度算法

合集下载

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

常用的调度算法

常用的调度算法

常用的调度算法调度算法是指操作系统中用于决定进程何时执行、何时暂停等的一种算法。

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

下面将对这些常用的调度算法进行详细介绍。

一、先来先服务(FCFS)先来先服务是最简单的调度算法之一,它按照进程到达的顺序进行调度,即谁先到谁先执行。

这种算法容易实现,但是存在“饥饿”现象,即如果某个进程长时间等待,则其他进程可能会一直占用CPU资源,导致该进程无法得到执行。

因此,在实际应用中,FCFS很少被使用。

二、短作业优先(SJF)短作业优先是一种以作业运行时间为依据的调度算法。

它通过预测每个进程需要运行的时间,并将其按照运行时间从小到大排序,然后依次执行。

这种算法可以最大限度地减少平均等待时间和平均周转时间,并且不会出现“饥饿”现象。

但是,在实际应用中,由于很难准确预测每个进程需要运行的时间,因此SJF也存在缺陷。

如果预测不准确,那么就会出现长作业等待短作业的情况,导致长作业的等待时间变长。

三、优先级调度优先级调度是一种按照进程优先级进行调度的算法。

每个进程都有一个优先级,系统会根据进程的优先级来决定下一个要执行的进程。

通常情况下,优先级越高的进程越有可能得到CPU资源。

但是,如果某个进程的优先级一直比其他进程高,那么其他进程就会一直等待,导致“饥饿”现象。

此外,在实际应用中,由于不同进程之间的优先级差别较大,因此可能会导致低优先级的进程长时间等待。

四、时间片轮转时间片轮转是一种按照时间片进行调度的算法。

它将CPU资源划分成若干个时间片,并将每个时间片分配给一个正在运行或等待运行的进程。

当一个进程用完了它所分配到的时间片后,系统会将其挂起,并将CPU资源分配给下一个等待运行的进程。

这种算法可以避免“饥饿”现象,并且能够保证所有正在运行或等待运行的进程都能够得到CPU资源。

但是,如果时间片太小,会导致进程频繁切换,影响系统性能;如果时间片太大,会导致长作业等待时间变长。

进程调度算法总结

进程调度算法总结

进程调度算法总结所谓进程,简单来说是计算机中的各种任务,那么计算机如何分配系统资源以供这些任务使⽤呢?此篇博客⽬的就是为⼤家整理⼀下⼏种常见进程调度算法。

进度调度就是按照⼀定的策略,动态地把处理机分配给处于就绪队列的进程,使之执⾏。

常见的进程调度算法:1、先来先服务和短作业(进程)优先调度算法2、⾼优先权优先调度算法3、基于时间⽚的轮转调度算法下⾯细说:1、先来先服务和短作业优先调度算法1.1、先来先服务调度算法这种调度算法由字⾯意思理解很直观,所谓先来先服务,就是谁先来先服务谁。

结合进程,先来先服务调度算法就是对于优先到达就绪队列的进程采取优先服务的策略,直到该进程运⾏结束或发⽣某事件导致阻塞才放弃处理机。

这种调度算法是⼀种最简单的调度算法,适⽤于作业和进程。

当⽤于作业时,先进⼊后备队列的作业先运⾏。

1.2、短作业(进程)优先调度算法短作业(进程)优先调度算法,是对短作业或短进程进⾏得调度算法。

何为短?就是估计运⾏时间短。

该算法从后备队列或就绪队列选择估计运⾏时间较短的作业或进程,将他们调⼊内存运⾏,直到该进程运⾏结束或发⽣某事件导致阻塞才放弃处理机重新进⾏调度。

2、⾼优先权优先调度算法2.1、优先权调度算法上述所说的两种调度算法,过于简单,当系统中有紧急作业或进程,且不满⾜先进队列或运⾏时间短时,这些作业或进程将很难得到资源。

那么对于这些作业或进程,⼜该怎么办呢?因此,⼜有了优先权调度算法,所谓优先权调度算法,顾名思义就是谁的优先权⾼,谁就西安得到资源得以运⾏。

进⼀步将算法分为以下两种:2.1.1、⾮抢占式优先权算法在这种⽅式下,系统⼀旦把处理机分配给就绪队列中优先权最⾼的进程后,该进程便⼀直执⾏下去,直⾄完成;或因发⽣某事件使该进程放弃处理机时,系统⽅可再将处理机重新分配给另⼀优先权最⾼的进程。

这种调度算法主要⽤于批处理系统中;也可⽤于某些对实时性要求不严的实时系统中。

2.1.2、抢占式优先权算法在这种⽅式下,系统同样是把处理机分配给优先权最⾼的进程,使之执⾏。

实验进程调度

实验进程调度

淮海工学院计算机科学系实验报告书课程名:《操作系统原理》题目:实验一进程管理班级:Z软件52学号:2017140595姓名:郭文静1、实验目的与要求进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用C/C++语言编写一个进程调度模拟程序,至少使用最高优先权优先或时间片轮转法两种算法来实现进程调度。

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

1、设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。

2、模拟调度程序至少使用最高优先权优先或时间片轮转法两种算法来实现进程调度。

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

2、实验内容或题目2.1优先级算法说明(1)PCB的结构:优先级算法中,设PCB的结构如右图所示,其中各数据项的含义Array如下:Id:进程标识符号,取值1—5。

Prior:优先级,随机产生,范围5—10。

Used:目前已占用的CPU时间数,初值为0;当该进程被调用执行时,每执行一个时间片,Used加1。

Need:进程尚需的CPU时间数,初值表示该进程需要运行的总时间,取值范围为1—5。

并随机产生,每运行一个时间片need减1;need为0则进程结束。

Status:进程状态R(运行),J(就绪),F(完成);初始时都处于就绪状态。

Next:指向就绪队列中下一个进程的PCB的指针。

(2)初始状态及就绪队列组织:5个进程初始都处于就绪状态,进程标识1—5,used初值都为0。

各进程的优先级随机产生,范围1—5。

处于就绪状态的进程,用队列加以组织,队列按优先级由高到低依次排列,队首指针设为head。

(3)调度原则以及运行时间的处理:正在执行的进程每执行一个时间片,其优先级减1(允许优先级为负)。

进程调度将在以下情况发生:当正在运行的程序其优先级小于就绪队列队首进程的优先级时。

程序中进程的运行时间以逻辑时间片为单位。

2.2时间片轮转算法说明(1)PCB的结构(如下图所示):轮转法中,设PCB的结构如右图所示,其中各数据项的含义如下:Span:在某一轮中,分配给先运行进程的时间片数,取值1—3。

调度算法C语言实现

调度算法C语言实现

调度算法C语言实现调度算法是操作系统中的重要内容之一,它决定了进程在系统中的运行方式和顺序。

本文将介绍两种常见的调度算法,先来先服务(FCFS)和最短作业优先(SJF),并用C语言实现它们。

一、先来先服务(FCFS)调度算法先来先服务(FCFS)调度算法是最简单的调度算法之一、它按照进程到达的先后顺序进行调度,即谁先到达就先执行。

实现这个算法的关键是记录进程到达的顺序和每个进程的执行时间。

下面是一个用C语言实现先来先服务调度算法的示例程序:```c#include <stdio.h>//进程控制块结构体typedef structint pid; // 进程IDint arrivalTime; // 到达时间int burstTime; // 执行时间} Process;int maiint n; // 进程数量printf("请输入进程数量:");scanf("%d", &n);//输入每个进程的到达时间和执行时间Process process[n];for (int i = 0; i < n; i++)printf("请输入进程 %d 的到达时间和执行时间:", i);scanf("%d%d", &process[i].arrivalTime,&process[i].burstTime);process[i].pid = i;}//根据到达时间排序进程for (int i = 0; i < n - 1; i++)for (int j = i + 1; j < n; j++)if (process[i].arrivalTime > process[j].arrivalTime) Process temp = process[i];process[i] = process[j];process[j] = temp;}}}//计算平均等待时间和平均周转时间float totalWaitingTime = 0; // 总等待时间float totalTurnaroundTime = 0; // 总周转时间int currentTime = 0; // 当前时间for (int i = 0; i < n; i++)if (currentTime < process[i].arrivalTime)currentTime = process[i].arrivalTime;}totalWaitingTime += currentTime - process[i].arrivalTime;totalTurnaroundTime += (currentTime + process[i].burstTime) - process[i].arrivalTime;currentTime += process[i].burstTime;}//输出结果float avgWaitingTime = totalWaitingTime / n;float avgTurnaroundTime = totalTurnaroundTime / n;printf("平均等待时间:%f\n", avgWaitingTime);printf("平均周转时间:%f\n", avgTurnaroundTime);return 0;```以上程序实现了先来先服务(FCFS)调度算法,首先根据进程的到达时间排序,然后依次执行每个进程,并计算总等待时间和总周转时间。

5种进程调度算法实验报告

5种进程调度算法实验报告

操作系统教程——进程调度算法院系计算机与软件学院班级08软件工程2班学号20081344066姓名何丽茗进程调度算法的模拟实现⏹实验目的1.本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。

2.利用程序设计语言编写算法,模拟实现先到先服务算法FCFS、轮转调度算法RR、最短作业优先算法SJF、优先级调度算法PRIOR、最短剩余时间优先算法SRTF。

3.进行算法评价,计算平均等待时间和平均周转时间。

⏹实验内容及结果1.先来先服务算法2.轮转调度算法3. 优先级调度算法4. 最短时间优先算法5. 最短剩余时间优先算法实验总结在此次模拟过程中,将SRTF单独拿了出来用指针表示,而其余均用数组表示。

完整代码【Srtf.cpp代码如下:】//最短剩余时间优先算法的实现#include<stdio.h>#include<stdlib.h>#include<time.h>typedef struct{int remain_time; //进程剩余执行时间int arrive_time; //进程到达时间int Tp; //进入就绪队列的时间int Tc; //进入执行队列的时间int To; //进程执行结束的时间int number; //进程编号}Process_Block; //定义进程模块typedef struct _Queue{Process_Block PB;struct _Queue *next;}_Block,*Process; //定义一个进程模块队列中结点typedef struct{Process head; //队列头指针Process end; //队列尾指针}Process_Queue; //进程队列Process_Queue PQ; //定义一个全局队列变量int t; //全局时间Process Run_Now; //当前正在运行的进程,作为全局变量void InitQueue(Process_Queue PQ){PQ.head ->next = NULL;PQ.end ->next = PQ.head;}/*初始化队列*/int IsEmpty(Process_Queue PQ){if(PQ.end->next == PQ.head)return 1; //队列空的条件为头指针指向尾指针并且尾指针指向头指针return 0;}/*判定队列是否为空队列*/void EnQueue(Process_Queue PQ,Process P){Process temp =(Process)malloc(sizeof(_Block));temp = PQ.end;temp->next->next = P;PQ.end->next = P;}/*插入队列操作*/Process DeQueue(Process_Queue PQ){if(IsEmpty(PQ))return NULL;Process temp = PQ.head->next;PQ.head->next= temp ->next;if(PQ.end->next == temp)PQ.end->next = PQ.head;return temp;}/*出列操作*/Process ShortestProcess(Process_Queue PQ){if(IsEmpty(PQ)) //如果队列为空,返回{if(!Run_Now)return NULL;elsereturn Run_Now;}Process temp,shortest,prev;int min_time;if(Run_Now) //如果当前有进程正在执行,{shortest = Run_Now; //那么最短进程初始化为当前正在执行的进程,min_time = Run_Now->PB.remain_time;}else//如果当前没有进程执行,{shortest = PQ.head->next; //则最短进程初始化为队列中第一个进程min_time = PQ.head->next->PB.remain_time;}temp = PQ.head;prev = temp;while(temp->next)if(temp->next->PB.remain_time <min_time) //如果当前进程的剩余时间比min_time短,{shortest = temp->next; //则保存当前进程,min_time = shortest->PB.remain_time;prev=temp; //及其前驱}temp=temp->next;}if(shortest == PQ.end->next) //如果最短剩余时间进程是队列中最后一个进程,PQ.end->next = prev; //则需要修改尾指针指向其前驱prev->next = shortest->next; //修改指针将最短剩余时间进程插入到队头return shortest;}/*调度最短剩余时间的进程至队头*/void Run(){Run_Now->PB.remain_time--; //某一时间运行它的剩余时间减return;}/*运行函数*/void Wait(){return ;}int sum(int array[],int n){int i,sum=0;for(i=0;i<n;i++)sum+=array[i];return sum;}int main(){PQ.head = (Process)malloc(sizeof(_Block));PQ.end = (Process)malloc(sizeof(_Block));Run_Now = (Process)malloc(sizeof(_Block));Run_Now =NULL;InitQueue(PQ);int i,N,Total_Time=0; //Total_Time为所有进程的执行时间之和printf("请输入计算机中的进程数目:\n");scanf("%d",&N);Process *P,temp;P = (Process*)malloc(N*sizeof(Process));int *wt,*circle_t;wt =(int*)malloc(N*sizeof(int));circle_t =(int*)malloc(N*sizeof(int));for(i=0;i<N;i++){P[i] = (Process)malloc(sizeof(_Block));P[i]->PB.number =i+1;P[i]->next =NULL;wt[i] =0;circle_t[i] =0;printf("输入第%d个进程的到达时间及剩余执行时间:\n",i+1);scanf("%d %d",&P[i]->PB.arrive_time,&P[i]->PB.remain_time);}for(i=0;i<N;i++)Total_Time+=P[i]->PB.remain_time;printf("\n进程按顺序运行依次为:\n");i=0;int k=0;for(t=0;;t++){if(Run_Now) //如果当前有进程正在执行{Run();if(t == P[i]->PB.arrive_time) //如果当前时间正好有进程进入{if(P[i]->PB.remain_time < Run_Now->PB.remain_time){temp = P[i];P[i] = Run_Now;Run_Now = temp; //则调度它至运行队列中,Run_Now->PB.Tp=t;Run_Now->PB.Tc=t;wt[Run_Now->PB.number-1]+=Run_Now->PB.Tc-Run_Now->PB.Tp;printf("%d ",Run_Now->PB.number);}EnQueue(PQ,P[i]); //并将当前运行进程重新插入队列中P[i]->PB.Tp=t;k++;i=(i+1)>(N-1)?(N-1):(i+1);}if(Run_Now->PB.remain_time == 0) //如果当前进程运行结束,{Run_Now->PB.To=t; //进程运行结束的时间circle_t[Run_Now->PB.number-1] +=t-Run_Now->PB.arrive_time;free(Run_Now); //则将它所占资源释放掉,Run_Now =NULL; //并修改Run_Now为NULLRun_Now = ShortestProcess(PQ); //从就绪队列中调出最短剩余时间进程至队头,if(!Run_Now) //如果队列为空,转为等待状态{if(IsEmpty(PQ) && k >= N) break;Wait();continue;}else{Run_Now->PB.Tc=t;wt[Run_Now->PB.number-1]+=Run_Now->PB.Tc-Run_Now->PB.Tp;printf("%d ",Run_Now->PB.number);}}}else//如果当前运行进程为空,那么{if(t == P[i]->PB.arrive_time) //如果正好这时有进程入队{k++;EnQueue(PQ,P[i]);Run_Now = DeQueue(PQ); //则直接被调入运行队列中Run_Now->PB.Tp=t;Run_Now->PB.Tc=t;printf("%d ",Run_Now->PB.number);i=(i+1)>(N-1)?(N-1):(i+1);}else{Wait();continue;}}}printf("\n");printf("平均等待时间是:\n%f\n",((float)sum(wt,N))/N);printf("平均周转时间是:\n%f\n",((float)sum(circle_t,N))/N);return 0;}//////////////////////////////////////////////////////【Process.cpp代码如下:】#include<iostream>#include<string>using namespace std;class Process{public:string ProcessName; // 进程名字int Time; // 进程需要时间int leval; // 进程优先级int LeftTime; // 进程运行一段时间后还需要的时间};void Copy ( Process proc1, Process proc2); // 把proc2赋值给proc1 void Sort( Process pr[], int size) ; // 此排序后按优先级从大到小排列void sort1(Process pr[], int size) ; // 此排序后按需要的cpu时间从小到大排列void Fcfs( Process pr[], int num, int Timepice); // 先来先服务算法void TimeTurn( Process process[], int num, int Timepice); // 时间片轮转算法void Priority( Process process[], int num, int Timepice); // 优先级算法void main(){int a;cout<<endl;cout<<" 选择调度算法:"<<endl;cout<<" 1: FCFS 2: 时间片轮换 3: 优先级调度 4: 最短作业优先 5: 最短剩余时间优先"<<endl;cin>>a;const int Size =30;Process process[Size] ;int num;int TimePice;cout<<" 输入进程个数:"<<endl;cin>>num;cout<<" 输入此进程时间片大小: "<<endl;cin>>TimePice;for( int i=0; i< num; i++){string name;int CpuTime;int Leval;cout<<" 输入第"<< i+1<<" 个进程的名字、cpu时间和优先级:"<<endl;cin>>name;cin>> CpuTime>>Leval;process[i].ProcessName =name;process[i].Time =CpuTime;process[i].leval =Leval;cout<<endl;}for ( int k=0;k<num;k++)process[k].LeftTime=process[k].Time ;//对进程剩余时间初始化cout<<" ( 说明: 在本程序所列进程信息中,优先级一项是指进程运行后的优先级!! )";cout<<endl; cout<<endl;cout<<"进程名字"<<"共需占用CPU时间 "<<" 还需要占用时间 "<<" 优先级"<<" 状态"<<endl;if(a==1)Fcfs(process,num,TimePice);else if(a==2)TimeTurn( process, num, TimePice);else if(a==3){Sort( process, num);Priority( process , num, TimePice);}else// 最短作业算法,先按时间从小到大排序,再调用Fcfs算法即可{sort1(process,num);Fcfs(process,num,TimePice);}}void Copy ( Process proc1, Process proc2){proc1.leval =proc2.leval ;proc1.ProcessName =proc2.ProcessName ;proc1.Time =proc2.Time ;}void Sort( Process pr[], int size) //以进程优先级高低排序{// 直接插入排序for( int i=1;i<size;i++){Process temp;temp = pr[i];int j=i;while(j>0 && temp.leval<pr[j-1].leval){pr[j] = pr[j-1];j--;}pr[j] = temp;} // 直接插入排序后进程按优先级从小到大排列for( int d=size-1;d>size/2;d--){Process temp;temp=pr [d];pr [d] = pr [size-d-1];pr [size-d-1]=temp;} // 此排序后按优先级从大到小排列}/* 最短作业优先算法的实现*/void sort1 ( Process pr[], int size) // 以进程时间从低到高排序{// 直接插入排序for( int i=1;i<size;i++){Process temp;temp = pr[i];int j=i;while(j>0 && temp.Time < pr[j-1].Time ){pr[j] = pr[j-1];j--;}pr[j] = temp;}}/* 先来先服务算法的实现*/void Fcfs( Process process[], int num, int Timepice){ // process[] 是输入的进程,num是进程的数目,Timepice是时间片大小while(true){if(num==0){cout<<" 所有进程都已经执行完毕!"<<endl;exit(1);}if(process[0].LeftTime==0){cout<<" 进程"<<process[0].ProcessName<< " 已经执行完毕!"<<endl;for (int i=0;i<num;i++)process[i]=process[i+1];num--;}else if(process[num-1].LeftTime==0){cout<<" 进程"<<process[num-1].ProcessName<< " 已经执行完毕!"<<endl;num--;}else{cout<<endl; //输出正在运行的进程process[0].LeftTime=process[0].LeftTime- Timepice; process[0].leval =process[0].leval-1;cout<<" "<<process[0].ProcessName <<""<<process[0].Time <<" ";cout<<process[0].LeftTime <<""<<process[0].leval<<" 运行";cout<<endl;for(int s=1;s<num;s++){cout<<" "<<process[s].ProcessName <<""<<process[s].Time <<" ";cout<<process[s].LeftTime <<""<<process[s].leval<<" 等待"<<endl; ;}} // elsecout<<endl;system(" pause");cout<<endl;} // while}/* 时间片轮转调度算法实现*/void TimeTurn( Process process[], int num, int Timepice){while(true){if(num==0){cout<<" 所有进程都已经执行完毕!"<<endl;exit(1);}if(process[0].LeftTime==0){cout<<" 进程"<<process[0].ProcessName<< " 已经执行完毕!"<<endl;for (int i=0;i<num;i++)process[i]=process[i+1];num--;}if( process[num-1].LeftTime ==0 ){cout<<" 进程" << process[num-1].ProcessName <<" 已经执行完毕! "<<endl;num--;}else if(process[0].LeftTime > 0){cout<<endl; //输出正在运行的进程process[0].LeftTime=process[0].LeftTime- Timepice;process[0].leval =process[0].leval-1;cout<<" "<<process[0].ProcessName <<""<<process[0].Time <<" ";cout<<process[0].LeftTime <<""<<process[0].leval<<" 运行";cout<<endl;for(int s=1;s<num;s++){cout<<" "<<process[s].ProcessName <<""<<process[s].Time <<" ";cout<<process[s].LeftTime <<""<<process[s].leval;if(s==1)cout<<" 就绪"<<endl;elsecout<<" 等待"<<endl;}Process temp;temp = process[0];for( int j=0;j<num;j++)process[j] = process[j+1];process[num-1] = temp;} // elsecout<<endl;system(" pause");cout<<endl;} // while}/* 优先级调度算法的实现*/void Priority( Process process[], int num, int Timepice){while( true){if(num==0){cout<< "所有进程都已经执行完毕!"<<endl;exit(1);}if(process[0].LeftTime==0){cout<<" 进程" << process[0].ProcessName <<" 已经执行完毕! "<<endl; for( int m=0;m<num;m++)process[m] = process[m+1]; //一个进程执行完毕后从数组中删除num--; // 此时进程数目减少一个}if( num!=1 && process[num-1].LeftTime ==0 ){cout<<" 进程" << process[num-1].ProcessName <<" 已经执行完毕!"<<endl;num--;}if(process[0].LeftTime > 0){cout<<endl; //输出正在运行的进程process[0].LeftTime=process[0].LeftTime- Timepice;process[0].leval =process[0].leval-1;cout<<" "<<process[0].ProcessName <<" "<<process[0].Time <<" ";cout<<process[0].LeftTime <<""<<process[0].leval<<" 运行";cout<<endl; // 输出其他进程for(int s=1;s<num;s++){cout<<" "<<process[s].ProcessName <<" "<<process[s].Time <<" ";cout<<process[s].LeftTime <<""<<process[s].leval ;if(s==1)cout<<" 就绪"<<endl;elsecout<<" 等待 "<<endl;}} // elseSort(process, num);cout<<endl;system(" pause");cout<<endl;} // while}。

进程调度算法实验报告

进程调度算法实验报告

操作系统实验报告(二)实验题目:进程调度算法实验环境:C++实验目的:编程模拟实现几种常见的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。

实验内容:编程实现如下算法:1.先来先服务算法;2.短进程优先算法;3.时间片轮转调度算法。

设计分析:程序流程图:1.先来先服务算法2.短进程优先算法3.时间片轮转调度算法实验代码:1.先来先服务算法#include <iostream.h>#define n 20typedef struct{int id; //进程名int atime; //进程到达时间int runtime; //进程运行时间}fcs;void main(){int amount,i,j,diao,huan;fcs f[n];cout<<"请输入进程个数:"<<endl;cin>>amount;for(i=0;i<amount;i++){cout<<"请输入进程名,进程到达时间,进程运行时间:"<<endl; cin>>f[i].id;cin>>f[i].atime;cin>>f[i].runtime;}for(i=0;i<amount;i++) //按进程到达时间的先后排序{ //如果两个进程同时到达,按在屏幕先输入的先运行for(j=0;j<amount-i-1;j++){ if(f[j].atime>f[j+1].atime){diao=f[j].atime;f[j].atime=f[j+1].atime;f[j+1].atime=diao;huan=f[j].id;f[j].id=f[j+1].id;f[j+1].id=huan;}}}for(i=0;i<amount;i++){cout<<"进程:"<<f[i].id<<"从"<<f[i].atime<<"开始"<<","<<"在"<<f[i].atime+f[i].runtime<<"之前结束。

调度算法OS

调度算法OS

调度算法OS调度算法(OS)2011-04-05 20:59处理机调度的分级高级、中级和低级调度作业从提交开始直到完成,往往要经历下述三级调度:高级调度:(High-Level Scheduling)又称为作业调度,它决定把后备作业调入内存运行;低级调度:(Low-Level Scheduling)又称为进程调度,它决定把就绪队列的某进程获得CPU;中级调度:(Intermediate-Level Scheduling)又称为在虚拟存储器中引入,在内、外存对换区进行进程对换。

1.进程调度算法(处理器管理)A).先来先服务和短作业(进程)优先调度算法B).高优先权优先调度算法C).基于时间片的轮转调度算法2.作业调度算法2)短作业优先法SJF、3)最高响应比优先法HRN、4定时轮转法和优先数法3.移臂(磁盘)调度算法(设备管理根本目的在于有效利用磁盘,保证磁盘的快速访问)1)先来先服务算法;(根据访问者提出访问请求的先后次序来决定执行次序。

)2)最短寻找时间优先调度算法;(从等待的访问者中挑选寻找时间最短的那个请求执行,而不管访问者的先后次序。

)3)电梯4)单向扫描4.页式调度算法(存储器管理)1先进先出调度算法2最近最少调度算法3最近最不常用调度算法/////////////////////////////调度算法是指:根据系统的资源分配策略所规定的资源分配算法。

进程调度算法(处理器管理)一、先来先服务和短作业(进程)优先调度算法1.先来先服务调度算法先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。

FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。

由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。

2.短作业(进程)优先调度算法短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。

5种进程调度算法

5种进程调度算法

5种进程调度算法进程调度算法是操作系统中的重要组成部分,用于确定哪个进程将获得CPU的使用权。

根据不同的算法,进程可以以不同的顺序运行,并根据优先级、运行时间、等待时间等因素进行调度。

本文将介绍和分析五种常见的进程调度算法,包括先来先服务(FCFS)、最短作业优先(SJF)、高响应比优先(HRRN)、轮转调度(RR)和多级反馈队列调度(MFQ)。

1.先来先服务(FCFS)先来先服务是最简单的进程调度算法,按照进程到达的顺序分配CPU片段。

当一个进程执行完成或者遇到I/O请求时,CPU被分配给下一个进程。

该算法简单直观,但可能导致长作业等待时间增加,且无法满足实时性要求。

2.最短作业优先(SJF)最短作业优先调度算法根据预计的执行时间为进程分配CPU时间。

在所有就绪队列中,选择执行时间最短的进程。

该算法可以最大程度地减少平均等待时间,但需要准确预测进程的执行时间,而实际中很难精确估计。

3.高响应比优先(HRRN)高响应比优先是一个动态优先级调度算法,根据进程等待时间的长度为进程分配CPU时间。

等待时间越长,优先级越高。

因此,较长等待的进程将获得更多的处理时间,以保证公平性。

该算法在处理短作业时效果较好,但容易导致无限等待。

4.轮转调度(RR)轮转调度算法按照轮询的方式为每个进程分配固定的时间片,通常为几十毫秒。

当时间片用尽时,进程将被暂停,下一个进程得到时间片。

该方法保证了公平性,但对于长时间的进程,可能会浪费大量的CPU时间在进程切换上。

5.多级反馈队列调度(MFQ)多级反馈队列调度算法将进程划分为多个队列,根据进程特性和优先级的不同,为每个队列分配不同的时间片或优先级。

当进程进入就绪队列时,首先进入最高优先级的队列,若运行时间超过时间片,则移入下一级队列。

该算法综合了前几种算法的优点,可以同时满足长短作业的需求。

通过对这五种进程调度算法的介绍和分析,我们可以看到每种算法都有其优点和缺点。

选择适合的进程调度算法取决于系统的需求和特定场景的要求。

计算机操作系统—调度算法

计算机操作系统—调度算法

计算机操作系统—调度算法# 有些计算会有问题谅解经典进程的同步问题1、吃⽔果桌上有⼀只盘⼦,每次只能放⼊⼀只⽔果,爸爸专向盘⼦中放苹果(apple),妈妈专向盘⼦中放桔⼦(orange),⼀个⼉⼦专等吃盘⼦中的桔⼦,⼀个⼥⼉专等吃盘⼦中的苹果。

只要盘⼦中空则爸爸或妈妈可向盘⼦中放⼀只⽔果,仅当盘中有⾃⼰需要的⽔果时,⼉⼦或⼥⼉可从中取出。

把爸爸、妈妈、⼉⼦、⼥⼉看做四个进程,⽤wait、signal操作进⾏管理,使这4个进程能正确地并发执⾏。

如图所⽰。

.png)1、定义信号量的含义与赋值定义⼀个是否允许向盘⼦中存放⽔果的信号量S,其初值为“1” ;定义两个信号量SP和SO分别表⽰盘⼦中是否有苹果或桔⼦的消息,初值均为“0” ,⼀个互斥信号量\[SP=表⽰盘⼦中有苹果;SO=表⽰盘⼦⾥⾯有桔⼦ \]2、写伪代码begin:S,SP,SO:semaphere; //设置信号量S:=1; SP:=0; SO:=0; //进⾏初始赋值Process 爸爸{BeginL1:准备⼀个苹果;wait(S); //申请空盘⼦的互斥信号量将苹果放⼊盘⼦中signal(SP); //盘⼦中有苹果,返回SPGoto L1; //调⽤L1⼥⼉取⾛盘⼦中的苹果end;}Process 妈妈{BeginL2:准备⼀个桔⼦;wait(S); //申请空盘⼦的互斥信号量将桔⼦放⼊盘⼦中signal(SO); //盘⼦中有桔⼦,返回SOGoto L2; //调⽤L2⼉⼦取⾛盘⼦中的桔⼦end;}Process ⼉⼦{beginL3:.wait(SO); //等待盘⼦中有桔⼦从盘⼦中拿⾛桔⼦signal(S); //拿⾛桔⼦后,盘⼦为空;由SO向S转变end;}Process ⼥⼉{beginL4:.wait(SP); //等待盘⼦中有苹果从盘⼦中拿⾛苹果signal(S); //拿⾛苹果后,盘⼦为空;由SP向S转变end;}end;2、共享打印机现有四个进程R1,R2,W1,W2,它们共享可以存放⼀个数的缓冲区。

操作系统各种调度算法

操作系统各种调度算法

操作系统各种调度算法操作系统的调度算法是操作系统中的重要组成部分,它决定了进程在CPU上的执行顺序和调度策略。

不同的调度算法应用于不同的场景和需求,目的是提高CPU利用率、降低响应时间、提高吞吐量等。

本文将介绍几种常见的调度算法,包括先来先服务调度算法(FCFS)、最短作业优先调度算法(SJF)、时间片轮转调度算法(RR)和多级反馈队列调度算法(MFQ)。

先来先服务调度算法(FCFS)是最简单的调度算法之一,该算法按照进程到达的先后顺序分配CPU资源。

当一个进程在CPU上执行时,其他进程需要等待,直到该进程完成。

FCFS调度算法具有易于实现和公平性的优点,但是由于没有考虑进程的执行时间,可能导致长作业的久等和短作业的饥饿问题。

最短作业优先调度算法(SJF)根据进程的预计执行时间来调度。

该算法假设可以获得每个进程的执行时间,并选择执行时间最短的进程执行。

SJF调度算法可以最小化平均等待时间和响应时间,但是由于无法准确预测进程的执行时间,可能导致长作业的饥饿问题。

时间片轮转调度算法(RR)将CPU时间切分成固定长度的时间片,每个进程在一个时间片中执行。

当一个进程的时间片用完后,系统将该进程重新加入到就绪队列的末尾,让其他就绪进程获得CPU执行。

RR调度算法能够保证每个进程都能获得一定的CPU时间,但是当进程的执行时间过长时,可能需要频繁的上下文切换,导致系统开销增加。

多级反馈队列调度算法(MFQ)是一种结合了FCFS和RR的调度算法。

该算法将就绪队列划分成多个队列,每个队列有不同的优先级,并且每个队列采用RR调度算法。

进程首先进入高优先级队列,如果时间片用完仍未完成,则降低优先级进入下一级队列,直到最低优先级队列。

此时,进程将拥有更长的时间片并能够执行较长时间。

MFQ调度算法兼顾了短作业的优先执行和长作业的公平性,但是需要根据实际情况设置多个队列和时间片长度,较为复杂。

除了以上介绍的几种调度算法,还有其他一些调度算法可供选择,如最高响应比优先调度算法(HRRN)、最早截止时间优先调度算法(EDF)等。

基于Linux随机进程调度算法的实现

基于Linux随机进程调度算法的实现
L i n U X内核 重新 编译 1 、 L i n u x进 程 调 度 过 程
时 间 和其 指定 的优先 级 以及进 程 类 型 相 匹 配 . 消 绪态 进程 依次从 小 到大标 号 . 并 统计 处 于就 绪态
除进 程对 C P U资源 的饥饿 状态
进 程 的总数 s u m。利用 i i f i f e s 产生 随机 数 , 选 择标
l { ) 8
福 建 电

2 0 1 3年 第 2 期
基于 L i n u x随机进 程调度算法的实现
俞 露 (南京师 范大 学 计 算机科 学与技 术 学 院 江苏 南京 2 1 0 0 0 0)
【 摘 要 】 : 本文 分析 了 L i n u x 0 . 1 1版本 中的进 程调 度 算 法 ,并在 此基 础上设 计 了一种 新 的 调度 算 法—— 进 程 随机 调度 算 法。本 文利 用 Wi n l ma g e 软 件 导 出( 导入 ) 相 应 的进 程调 度 文件 至 Wi n d o ws 系统 ( L i n u x系统 ) , 利用E d i t p l u s 软件 将 原 有 的进 程 调度 算 法替 换 成新 的调 k S - 法, 实
数 s c h e d u l e 0 负 责选 择 系 统 中 下 一 个 将要 运行 的
进程。
同时 . 和上 述算 法一致 . 若 所有 进 程 的时 问片 是 否都 已耗尽 .则 重置 每个任 务 的运行 时 间片 值
Hale Waihona Puke 它 首先对所 有 的任 务进行 选 择 .唤 醒任 何 一 count er。 3 . 1 实验平 台 个 已经得 到信 号 的任务 其次 . 针对任 务 数组 中 的每 个任 务 , 检查 其 报 硬件平 台 : P C机

进程的调度算法

进程的调度算法

进程的调度算法调度算法的实质是:根据系统的资源分配策略所规定的资源分配算法。

先介绍⼀下进程调度与作业调度的区别:进程调度是真正让某个就绪状态的进程到处理机上运⾏,⽽作业调度只是使作业具有了竞争处理机的机会。

进程调度(⼜称微观调度、低级调度、短程调度):是按照某种调度算法从就绪状态的进程中选择⼀个进程到处理机上运⾏。

负责进程调度功能的内核程序称为进程调度程序。

作业调度(⼜称⾼级调度、宏观调度、长程调度):是按某种调度算法从后备作业队列中选择作业装⼊内存运⾏;另外当该作业执⾏完毕后,还负责回收系统资源。

完成作业调度功能的程序称为作业调度程序。

下⾯介绍⼏种常见的调度算法:先来先服务(FCFS,first come first served)FCFS调度算法是⼀种最简单的调度算法,该调度算法既可以⽤于作业调度也可以⽤于进程调度。

在作业调度中,算法每次从后备作业队列中选择最先进⼊该队列的⼀个或⼏个作业,将它们调⼊内存,分配必要的资源,创建进程并放⼊就绪队列。

在进程调度中,FCFS调度算法每次从就绪队列中选择最先进⼊该队列的进程,将处理机分配给它,使之投⼊运⾏,直到完成或因某种原因⽽阻塞时才释放处理机。

优点:保证了公平性,规则简单缺点:有利于长进程⽽不利于短进程,有利于CPU 繁忙的进程,⽽不利于I/O 繁忙的进程短作业优先(SJF,Shortest Job First)短作业(进程)优先调度算法是指对短作业(进程)优先调度的算法。

短作业优先(SJF)调度算法是从后备队列中选择⼀个或若⼲个估计运⾏时间最短的作业,将它们调⼊内存运⾏。

⽽短进程优先(SPF)调度算法,则是从就绪队列中选择⼀个估计运⾏时间最短的进程,将处理机分配给它,使之⽴即执⾏,直到完成或发⽣某事件⽽阻塞时,才释放处理机。

优点:相⽐FCFS 算法,该算法可改善平均周转时间和平均带权周转时间,缩短进程的等待时间,提⾼系统的吞吐量。

缺点:该算法对长作业不利,SJF调度算法中长作业的周转时间会增加。

进程调度算法实验报告

进程调度算法实验报告

实验报告实验一:进程调度算法一、实验目的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(),这三个函数分别实现先来先服务算法,时间片轮转算法和优先级算法,最后分别打印。

操作系统进程调度模拟算法附源码

操作系统进程调度模拟算法附源码
常见进程调度算法
先来先服务(FCFS)
定义:按照进程到 达的先后顺序进行 调度
优点:实现简单, 适用于CPU繁忙型 进程
缺点:等待时间较 长,可能导致饥饿 现象
适用场景:适用于 CPU密集型进程, 不适用于I/O密集 型进程
最短作业优先(SJF)
定义:按照作业的估计运行时间进行排序,选择最短作业优先执行 优点:响应时间快,作业平均等待时间少 缺点:存在饥饿现象,长作业可能长时间得不到执行 适用场景:适用于作业量较大且作业到达时间间隔较长的情况
Part Five
模拟实验结果及分 析
实验环境及参数设置
处理器:Intel Core i78700K
操作系统:Linux
内存:16GB DDR4 硬盘:256GB SSD
实验结果展示
实验数据:模拟算法在不同情况下的运行结果 数据分析:对实验数据进行分析,得出结论 结果对比:将模拟算法与实际操作系统进行对比,分析差异 结果展示:以图表、表格等形式展示实验结果
优先级调度算法
定义:根据进 程的优先级进 行调度,优先 级高的进程优 先获得处理器
资源
分类:静态优 先级调度算法 和动态优先级
调度算法
静态优先级调 度算法:优先 级在进程创建 时就确定,且 在运行过程中
保持不变
动态优先级调 度算法:优先 级根据进程的 行为和需求动
态调整
轮转法(RR)
定义:轮转法是 一种简单且常用 的进程调度算法, 也称为循环调度
算法。
原理:按照进程 到达的先后顺序, 按照固定的时间 片进行循环调度。
特点:每个进程 分配一个固定时 间片,时间片用 完后自动切换到 下一个进程,如 果时间片未用完, 则一直运行直到

进程调度知识点总结大全

进程调度知识点总结大全

进程调度知识点总结大全一、进程调度概述进程调度是操作系统中的一个重要部分,它负责决定哪个进程在某个时刻获得处理器的使用权。

进程调度有两个关键的作用:一是确保CPU的高效利用,二是提供响应时间。

了解进程调度的知识对于理解操作系统的工作原理和性能优化非常重要。

进程调度的基本目标是实现公平性(Fairness)、高吞吐量(High throughput)和低延迟(Low latency)。

在不同的系统中,对这三个目标的重视程度有所不同,具体的调度算法也会有所区别。

二、进程调度的分类1. 批处理系统批处理系统是指没有人机交互的自动化操作系统,它主要用于处理大宗数据的任务。

批处理系统的调度算法通常以吞吐量为优先考虑因素。

2. 交互式系统交互式系统是指需要与用户进行交互的操作系统,例如个人电脑和服务器等。

交互式系统的调度算法通常以响应时间和公平性为优先考虑因素。

3. 实时系统实时系统是指对响应时间和执行时间要求非常严格的系统,如航空航天、工业控制等领域。

实时系统的调度算法通常以任务的截止时间和执行时间为优先考虑因素。

三、进程调度的基本概念1. 进程在操作系统中,进程是程序的执行实例。

每个进程都有自己的地址空间、寄存器上下文和状态。

进程是操作系统中的基本执行单元,进程之间相互独立,彼此之间不会干扰。

2. 进程状态进程在执行过程中会处于不同的状态,常见的进程状态包括就绪状态(Ready)、运行状态(Running)、阻塞状态(Blocked)和终止状态(Terminated)。

3. 进程控制块(PCB)进程控制块是操作系统中用来描述和管理进程的数据结构。

PCB中包含了进程的基本信息,如进程的标识符、状态、优先级、寄存器上下文等。

4. 进程调度器进程调度器是操作系统中的一个重要组成部分,它负责根据一定的调度算法决定哪个就绪的进程将获得处理器的使用权。

进程调度器会根据系统的运行状态和调度策略来做出决策。

5. 调度队列调度队列是操作系统中用来存储进程的数据结构,不同的调度队列可能按照不同的优先级或调度策略来组织。

进程调度实验报告

进程调度实验报告

进程调度实验报告进程调度实验报告一、实验目的本实验旨在通过模拟进程调度算法,加深对操作系统进程调度的理解,掌握进程调度算法的实现方法。

二、实验环境操作系统:Windows 10编程语言:C++开发工具:Visual Studio 2019三、实验内容1. 实现进程调度算法本实验实现了三种进程调度算法:先来先服务(FCFS)、短作业优先(SJF)和时间片轮转(RR)。

其中,FCFS算法按照进程到达的先后顺序进行调度,SJF算法按照进程执行时间的长短进行调度,RR算法则按照时间片轮转的方式进行调度。

2. 模拟进程调度过程本实验模拟了多个进程的调度过程,包括进程的创建、调度、执行和结束。

在模拟过程中,每个进程都有自己的进程ID、到达时间、执行时间和优先级等属性。

通过模拟进程调度过程,可以更好地理解进程调度算法的实现原理。

3. 统计调度结果本实验统计了每种进程调度算法的平均等待时间、平均周转时间和平均带权周转时间。

通过统计调度结果,可以比较不同进程调度算法的优劣,为实际应用提供参考。

四、实验结果1. 进程调度算法的实现本实验实现了三种进程调度算法,分别是FCFS、SJF和RR。

其中,FCFS算法的实现比较简单,只需要按照进程到达的先后顺序进行调度即可。

SJF算法则需要根据进程的执行时间进行排序,然后按照排序后的顺序进行调度。

RR算法则需要设置时间片大小,每个进程执行一个时间片后,将其放入就绪队列的末尾,然后轮到下一个进程执行。

2. 模拟进程调度过程本实验模拟了多个进程的调度过程,包括进程的创建、调度、执行和结束。

在模拟过程中,每个进程都有自己的进程ID、到达时间、执行时间和优先级等属性。

通过模拟进程调度过程,可以更好地理解进程调度算法的实现原理。

3. 统计调度结果本实验统计了每种进程调度算法的平均等待时间、平均周转时间和平均带权周转时间。

通过统计调度结果,可以比较不同进程调度算法的优劣,为实际应用提供参考。

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

《操作系统原理》实验报告
实验名称:Linux随机进程调度算法实现
班级:
学号:
姓名:
日期: 2012/12/31
一、实验名称
Linux随机进程调度算法实现
二、所属课程名称
《操作系统原理》
三、实验原理
linux 0.11内核目录linux/kernel中的sched.c函数是内核中进程调度管理的程序,其中schedule()函数负责选择系统中下一个要运行的进程。

schedule()函数首先对所有任务(进程)进行检测,唤醒任何一个已经得到信号的进程。

具体方法是任务数组中的每个进程,检查其报警定时值alarm。

如果进程的alarm时间已经过期(alarm<jiffies),则在它的信号为图中设置SIGALRM信号,然后清alarm值。

如果进程的信号位图中除被阻塞的信号外还有其他信号,并且读进程处于可中断睡眠状态(TASK_INTERRUPTIBLE),则置该进程为就绪状态(TASK_RUNNING)。

随后是进程调度函数的核心处理部分,即while循环。

这个部分代码根据随机调度机制(jiffies % NR_TASKS+1随机产生进程在task[]数组中的位置号),来选择随后要执行的进程。

他首先检查进程任务数组中的所有任务,只要任务(进程)处于就绪(TASK_RUNNING)状态,就利用switch_to()函数切换到到该进程。

若所有的就绪态任务的该值都等于零,表示此刻所有任务(进程)都已经运行完毕,再重新执行循。

四、实验内容和步骤
参数说明:
jiffies: 系统从开机开始算起的滴答数(10ms/滴答);
NR_TASKS:系统能容纳的最大进程数(64个);
task[]:任务(进程)数组;
更改代码如下:(linux 0.11内核目录下linux/kernel/sched.c
源文件的scheduling()函数while(1)循环)while (1) {
//定义c用来判断系统中是否可运行的任务(进程)存在;
c=-1; //c初值设为-1,默认不存在可运行进程;
next = 0;//next记录下一个即将运行的进程;
i=jiffies % NR_TASKS+1; //i的值是随机产生的;
p=&task[i];//p指向在task表中下标为i的进程;
while (--i) { //遍历task[];
if(!*--p)continue; //如果task[i]不包含进程,跳过;
//如果task[i]包含进程且该进程处于就绪状态,记录
//该任务(进程)序号,跳出无限循环while(1),转向
//switch_to()函数执行该任务(进程);
if ((*p)->state == TASK_RUNNING)
{ next = i; c=i; break; }
}
if (c) break;//如果没有任何任务(进程)要执行,则跳出,
//转向switch_to(),执行0号进程(idle)。

}
实验步骤:
(1)修改linux 0.11内核目录下linux/kernel/sched.c源文件拷贝出来,并修改其scheduling()函数,如下图:
更改后的schedule()函数(原创)
(2)将sched.c文件拷贝到diska盘(即系统b盘)中;
(3)运行linux 0.11 系统,使用mcopy命令将sched.c拷贝到/usr/src/linux/kernel目录中,替换原有文件;
(4)使用cd命令进入到usr/src/linux中,先后使用make clean、make指令编译新的Image文件。

(5)关闭linux 0.11系统,将新的Image文件拷贝出,替换linux 0.11文件夹中的旧的Image文件,即bootimage-0.11-hd文件;
(6)重新启动linux 0.11系统,验证新系统运行是否正常。

五、实验结果
说明:下图是经过修改过的linux 0.11 系统,运行正常。

使用了cd、ls、mcopy等命令运行均正常,新、旧linux 0.11系统的区别
是:旧的系统采用的是剩余执行时间最长优先的进程调度策略,而新的
系统采用的是随机进程调度策略。

新的linux 0.11 运行正常。

相关文档
最新文档