基于优先级调度进程算法的实现(C语言)

合集下载

先来先服务和优先数调度算法c语言

先来先服务和优先数调度算法c语言

先来先服务和优先数调度算法c语言先来先服务和优先数调度算法c语言一、前言操作系统中的进程调度是指在多道程序环境下,按照一定的规则从就绪队列中选择一个进程,将CPU分配给它运行。

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

本文将介绍两种常见的进程调度算法:先来先服务和优先数调度算法,并给出相应的C语言实现。

二、先来先服务算法1. 算法原理FCFS即First Come First Served,也称为FIFO(First In First Out),是一种非抢占式的进程调度算法。

按照任务到达时间的顺序进行处理,即谁先到达谁就被处理。

2. 算法流程(1)按照任务到达时间排序;(2)依次执行每个任务,直至所有任务都完成。

3. C语言实现下面是一个简单的FCFS程序:```c#include <stdio.h>struct process {int pid; // 进程IDint arrival_time; // 到达时间int burst_time; // 执行时间int waiting_time; // 等待时间};int main() {struct process p[10];int n, i, j;float avg_waiting_time = 0;printf("请输入进程数:");scanf("%d", &n);for (i = 0; i < n; i++) {printf("请输入第%d个进程的信息:\n", i + 1); printf("进程ID:");scanf("%d", &p[i].pid);printf("到达时间:");scanf("%d", &p[i].arrival_time);printf("执行时间:");scanf("%d", &p[i].burst_time);}for (i = 0; i < n; i++) {for (j = 0; j < i; j++) {if (p[j].arrival_time > p[j + 1].arrival_time) { struct process temp = p[j];p[j] = p[j + 1];p[j + 1] = temp;}}}int current_time = p[0].arrival_time;for (i = 0; i < n; i++) {if (current_time < p[i].arrival_time) {current_time = p[i].arrival_time;}p[i].waiting_time = current_time - p[i].arrival_time;current_time += p[i].burst_time;}printf("进程ID\t到达时间\t执行时间\t等待时间\n");for (i = 0; i < n; i++) {printf("%d\t%d\t%d\t%d\n", p[i].pid, p[i].arrival_time, p[i].burst_time, p[i].waiting_time);avg_waiting_time += (float)p[i].waiting_time / n;}printf("平均等待时间:%f\n", avg_waiting_time);return 0;}```三、优先数调度算法1. 算法原理优先数调度算法是一种非抢占式的进程调度算法。

c语言 优先级算法

c语言 优先级算法

C语言优先级算法1. 什么是优先级算法在计算机科学中,优先级算法是一种用于确定任务执行顺序的方法。

它基于任务的优先级来决定哪个任务应该首先执行,哪个任务应该等待。

在C语言中,优先级算法可以应用于多线程编程、操作系统调度等领域。

2. 优先级算法的原理优先级算法的原理是通过为每个任务分配一个优先级值,并根据这些值来决定任务的执行顺序。

通常,优先级值越高的任务会被优先执行。

在C语言中,可以使用整型变量来表示任务的优先级,一般情况下,较小的值表示较高的优先级。

3. 优先级算法的实现3.1 优先级队列优先级队列是一种数据结构,用于存储任务及其对应的优先级值。

在C语言中,可以使用数组或链表来实现优先级队列。

数组实现的优先级队列具有固定大小,而链表实现的优先级队列可以动态调整大小。

3.1.1 数组实现#define MAX_SIZE 100typedef struct {int priority;// 其他任务相关的数据} Task;Task priorityQueue[MAX_SIZE];int size = 0;void enqueue(Task task) {if (size == MAX_SIZE) {// 队列已满,无法入队return;}int i;for (i = size - 1; i >= 0; i--) {if (priorityQueue[i].priority > task.priority) {priorityQueue[i + 1] = priorityQueue[i];} else {break;}}priorityQueue[i + 1] = task;size++;}Task dequeue() {if (size == 0) {// 队列为空,无法出队return;}Task task = priorityQueue[0];int i;for (i = 1; i < size; i++) {priorityQueue[i - 1] = priorityQueue[i];}size--;return task;}3.1.2 链表实现typedef struct Node {Task task;struct Node* next;} Node;Node* head = NULL;void enqueue(Task task) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->task = task;newNode->next = NULL;if (head == NULL) {head = newNode;} else if (task.priority < head->task.priority) { newNode->next = head;head = newNode;} else {Node* current = head;while (current->next != NULL && current->next->task.priority <= task.p riority) {current = current->next;}newNode->next = current->next;current->next = newNode;}}Task dequeue() {if (head == NULL) {// 队列为空,无法出队return;}Task task = head->task;Node* temp = head;head = head->next;free(temp);return task;}3.2 任务调度优先级算法的核心是任务调度,即根据任务的优先级来选择下一个要执行的任务。

操作系统进程调度C语言代码

操作系统进程调度C语言代码

操作系统进程调度C语言代码操作系统是计算机系统中的重要组成部分,用于管理和控制计算机资源的分配和使用。

在操作系统中,进程调度是指将系统资源(如 CPU、内存、磁盘、网络等)分配给运行中的进程的过程。

进程调度是操作系统实现多任务、多用户和分时系统的关键。

进程调度的算法有多种。

最常见的是时间片轮转算法、优先级调度算法、最短进程优先算法和先到先服务算法等。

下面我们将介绍一下时间片轮转算法的 C 语言代码实现。

1. 时间片轮转算法时间片轮转算法是一种基于时间片的调度算法,它给每个进程分配一个时间片,当时间片用完后,系统将进程暂停,并将 CPU 分配给下一个进程。

时间片轮转算法可以让所有进程公平地使用 CPU 时间,并且可以避免进程饥饿的情况发生。

2. C 语言代码实现在 C 语言中,可以用结构体来表示一个进程,包括进程 ID、进程状态、优先级、到达时间和需要运行的时间片等属性。

下面是一个简单的进程结构体的定义:```struct Process processes[5];在实现时间片轮转算法之前,需要先实现一个进程调度函数,它的作用是找到就绪进程中优先级最高的进程,并返回它的位置。

下面是一个简单的进程调度函数:```int find_highest_priority_process(struct Process *processes, int n) {int highest_priority = -1;int highest_priority_index = -1;for (int i = 0; i < n; i++) {if (processes[i].state != 2 && processes[i].priority >highest_priority) {highest_priority = processes[i].priority;highest_priority_index = i;}}return highest_priority_index;}```在实现时间片轮转算法之前,需要先定义一些全局变量,包括就绪队列、当前时间、时间片大小和进程数量等。

c语言 优先级算法

c语言 优先级算法

c语言优先级算法在C语言中,优先级算法是一种常用的算法,用于确定多个任务之间的执行顺序。

优先级算法可以根据任务的重要性或紧急程度决定任务的优先级,进而影响任务的执行顺序。

本文将介绍C语言中常用的几种优先级算法,并给出相应的代码示例。

一、静态优先级算法静态优先级算法是指在编写程序时,为每个任务分配一个预先确定的优先级,而不会在运行时改变。

静态优先级算法可以通过宏定义或全局变量来定义任务的优先级。

在实际应用中,可以根据任务的重要性和紧急程度来合理分配任务的优先级。

下面是一个使用静态优先级算法的示例代码:```c#include <stdio.h>#define PRIORITY_A 1#define PRIORITY_B 2#define PRIORITY_C 3void taskA() {printf("This is task A\n");}void taskB() {printf("This is task B\n");}void taskC() {printf("This is task C\n");}int main() {// 任务执行顺序:taskC -> taskB -> taskAtaskC();taskB();taskA();return 0;}```在上述代码中,我们为任务A、任务B和任务C定义了不同的优先级,并在`main`函数中按照优先级顺序调用这些任务。

根据定义的优先级,最终的任务执行顺序为taskC -> taskB -> taskA。

二、动态优先级算法动态优先级算法是指在运行时根据任务的状态和其他因素来动态地调整任务的优先级。

常用的动态优先级算法有抢占式优先级算法和时间片轮转算法。

1. 抢占式优先级算法抢占式优先级算法是指在任务执行过程中,如果有更高优先级的任务需要执行,则会抢占当前正在执行的任务,并立即执行更高优先级的任务。

进程的调度实验报告(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("无效的调度算法选择。

操作系统进程调度C语言代码

操作系统进程调度C语言代码

操作系统进程调度C语言代码(总16页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March// sun.cpp : 定义控制台应用程序的入口点。

//本算法包含四种调度:先到先服务,短作业优先,时间片轮转,优先级优先!#include"stdio.h"#define N 50void main(){ void sjp();void fcfs();void sjf();void yxj();int a;while(true){printf("\n\n");printf("\t\t/*************************/");printf("\n\t\t/* 1、先到先服务调度 */");printf("\n\t\t/* 2、短作业优先调度 */");printf("\n\t\t/* 3、时间片轮转调度 */");printf("\n\t\t/* 4、优先级优先调度 */");printf("\n\t\t/* 0、退出 */\n");printf("\t\t/*************************/");printf("\n\n\t请选择菜单项:\t");scanf("%d",&a);printf("\n");switch(a){case 1: fcfs();break;case 2: sjf();break;case 3: sjp();break;case 4: yxj();break;default: break;}if(a<0&&a>4) break;}}void sjp(){int i,j,n,min,px,sjp,time;float sum1,sum2;bool flag=true;printf("\t请输入有n个进程(0<n<=50):\t"); scanf("%d",&n);while(n>50||n<=0){printf("n\t请重新输入: ");scanf("%d",&n);}printf("\n\n");printf("\t请输入时间片大小(0<sjp):\t"); scanf("%d",&sjp);while(sjp<=0){printf("n\t请重新输入: ");scanf("%d",&sjp);}struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int wct; //完成时刻int st2; //标志是否完成float zt; //周转时间float dczt; //带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间: ");scanf("%d",&a[i].dt);printf("\t服务时间: ");scanf("%d",&a[i].st);a[i].st2 = a[i].st;printf("\n");}for(j=n-1;j>=0;j--){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].st2;a[i].st2=a[i+1].st2;a[i+1].st2=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}time = a[0].dt;//printf("赋值后TIME值为:%d\n",time);min = 0;while(min<n){flag = true;for(i = 0;i<n;i++){if(a[i].st2>0&&a[i].dt<=time)flag = false;}for(i=0;i<n;i++){if(a[i].st2 > 0 ){if(a[i].dt<=time){//printf("当前a[%d].st2值为:%d\n",i,a[i].st2);a[i].st2 = a[i].st2 - sjp;//printf("运算后当前a[%d].st2值为:%d\n",i,a[i].st2);//printf("当前TIME值为:%d\n",time);time = time + sjp;//printf("增加之后TIME值为:%d\n",time);if(a[i].st2<=0){a[i].wct = time + a[i].st2;a[i].zt=(float)(a[i].wct-a[i].dt);a[i].dczt=a[i].zt/a[i].st;min++;}}else if(flag){for(i=0;i<n;i++){if(a[i].st2>0&&a[i].dt>time){time = a[i].dt;break;}}}}}}printf("\t1、按id号依次输出\n");printf("\t2、按完成顺序依次输出\n");printf("\n\t请选择输出顺序:\t");scanf("%d",&px);printf("\nid:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");sum1=0;sum2=0;switch(px){case 2:{for(i=0;i<n;i++){printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i]. zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}case 1:{for(j=0;j<n;j++){for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i]. zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}default: break;}}void fcfs(){int i,j,n,min,px;float sum1,sum2;printf("\t请输入有n个进程(0<n<=50):\t");scanf("%d",&n);while(n>50||n<=0){printf("n\t请重新输入: ");scanf("%d",&n);}printf("\n\n");struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int wct; //完成时刻float zt; //周转时间float dczt; //带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间: ");scanf("%d",&a[i].dt);printf("\t服务时间: ");scanf("%d",&a[i].st);printf("\n");}for(j=n-1;j>=0;j--){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++){if(a[i].dt>a[i-1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i-1].wct+a[i].st;a[i].zt=(float)(a[i].wct-a[i].dt);a[i].dczt=a[i].zt/a[i].st;}}printf("\t1、按id号依次输出\n");printf("\t2、按完成顺序依次输出\n");printf("\n\t请选择输出顺序:\t");scanf("%d",&px);printf("\nid:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");sum1=0;sum2=0;switch(px){case 2:{for(i=0;i<n;i++){printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i]. zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}case 1:{for(j=0;j<n;j++){for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i]. zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}default: break;}}void sjf(){int i,j,n,min,px;int b=0,z;float sum1,sum2;printf("\n\t\t请输入有n个进程(0<n<=50):\t");scanf("%d/n",&n);while(n>50||n<=0){printf("n\t请重新输入: ");scanf("%d",&n);}printf("\n");struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int wct; //完成时刻float zt; //周转时间float dczt; //带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间: ");scanf("%d",&a[i].dt);printf("\t服务时间: ");scanf("%d",&a[i].st);printf("\n");}min=a[0].dt;for(j=n-1;j>=0;j--){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}if(a[i].dt==a[i+1].dt&&a[i].st>a[i+1].st){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++){if(a[i].dt>a[0].wct) ;else b=b+1;}for(j=b-1;j>=1;j--){for(i=1;i<j;i++){if(a[i].st>a[i+1].st){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st; a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}for(i=1;i<n;i++){if(a[i].dt>a[i-1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i-1].wct+a[i].st;a[i].zt=(float)(a[i].wct-a[i].dt);a[i].dczt=a[i].zt/a[i].st;}for(j=i+1,b=j;j<n;j++){if(a[j].dt>a[i].wct) ;else b=b+1;}for(j=b-1;j>=i;j--){for(z=i;z<j;z++){if(a[z].st>a[z+1].st){min=a[z].dt;a[z].dt=a[z+1].dt;a[z+1].dt=min;min=a[z].st;a[z].st=a[z+1].st;a[z+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}}printf("\n\t请选择输出顺序\n");printf("\t1、按id号依次输出\n");printf("\t2、按完成顺序依次输出\n");scanf("%d",&px);printf("\nid:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");sum1=0;sum2=0;switch(px){case 2:{for(i=0;i<n;i++){printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i]. zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}case 1:{for(j=0;j<n;j++){ for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i]. zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n); break;}default: break;}}void yxj(){int i,j,n,min,px;int b=0,z;float sum1,sum2;printf("\n\t\t请输入有n个进程(0<n<=50):\t");scanf("%d/n",&n);while(n>50||n<=0){printf("n\t请重新输入: ");scanf("%d",&n);}printf("\n");struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int yxj; //优先级int wct; //完成时刻float zt; //周转时间float dczt; //带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间: ");scanf("%d",&a[i].dt);printf("\t服务时间: ");scanf("%d",&a[i].st);printf("\t优先级: ");scanf("%d",&a[i].yxj);printf("\n");}min=a[0].dt;for(j=n-1;j>=0;j--) {for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++) {if(a[i].dt>a[0].wct) ;else b++;}for(j=b-1;j>=1;j--){for(i=1;i<j;i++){if(a[i].yxj<a[i+1].yxj){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}}}for(i=1;i<n;i++){if(a[i].dt>a[i-1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i-1].wct+a[i].st;a[i].zt=(float)(a[i].wct-a[i].dt);a[i].dczt=a[i].zt/a[i].st;}for(j=i+1,b=j;j<n;j++){if(a[j].dt>a[i].wct) ;else b=b+1;}for(j=b-1;j>=i;j--){for(z=i;z<j;z++){if(a[z].yxj<a[z+1].yxj){min=a[z].dt;a[z].dt=a[z+1].dt;a[z+1].dt=min;min=a[z].st;a[z].st=a[z+1].st;a[z+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}}printf("\n\t请选择输出顺序\n");printf("\t1、按id号依次输出\n");printf("\t2、按完成顺序依次输出\n");scanf("%d",&px);printf("\nid:到达时间\t服务时间\t优先级\t完成时间\t周转时间\t带权周转时间\n");sum1=0;sum2=0;switch(px){case 2:{for(i=0;i<n;i++){printf("%d: %d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].s t,a[i].wct,a[i].zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}case 1:{for(j=0;j<n;j++){ for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d: %d\t\t%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].s t,a[i].wct,a[i].zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("\n平均周转时间:%.2f\n",sum1/n);printf("\n平均带权周转时间:%.2f\n\n",sum2/n);break;}default: break;}}17。

操作系统进程调度优先级算法C语言模拟

操作系统进程调度优先级算法C语言模拟

操作系统进程调度优先级算法C语言模拟```cstruct Processint pid; // 进程IDint priority; // 优先级};```接下来,我们使用一个简单的示例来说明操作系统进程调度优先级算法的模拟实现。

假设有5个进程需要调度执行,它们的初始优先级和运行时间如下:进程ID,优先级,已运行时间--------,--------,------------P1,4,2P2,3,4P3,1,6P4,2,1P5,5,3首先,我们需要将这些进程按照优先级排序,以得到调度队列。

可以使用冒泡排序算法实现,代码如下:```cvoid bubbleSort(struct Process *processes, int n)for (int i = 0; i < n - 1; i++)for (int j = 0; j < n - i - 1; j++)if (processes[j].priority > processes[j + 1].priority)struct Process temp = processes[j];processes[j] = processes[j + 1];processes[j + 1] = temp;}}}``````c#include <stdio.h>void bubbleSort(struct Process *processes, int n);int maistruct Process processes[] = {{1, 4, 2}, {2, 3, 4}, {3, 1, 6}, {4, 2, 1}, {5, 5, 3}};int n = sizeof(processes) / sizeof(struct Process);bubbleSort(processes, n);printf("初始调度队列:\n");printf("进程ID\t优先级\t已运行时间\n");for (int i = 0; i < n; i++)}//模拟进程调度printf("\n开始模拟进程调度...\n");int finished = 0;while (finished < n)struct Process *current_process = &processes[0];printf("执行进程 P%d\n", current_process->pid);finished++;printf("进程 P%d 执行完毕\n", current_process->pid);} else}bubbleSort(processes, n);}printf("\n所有进程执行完毕,调度队列的最终顺序为:\n"); printf("进程ID\t优先级\t已运行时间\n");for (int i = 0; i < n; i++)}return 0;```以上代码中,我们使用了一个变量`finished`来记录已完成的进程数量,当`finished`等于进程数量`n`时,所有进程执行完毕。

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

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

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号进程成为当前进程,开始执行。

高优先权优先调度算法c语言

高优先权优先调度算法c语言

高优先权优先调度算法c语言高优先权优先调度算法是一种常见的任务调度算法,其基本思想是按照任务的优先级从高到低进行排序,优先级高的任务优先执行。

下面是一个简单的用C语言实现高优先权优先调度算法的示例代码:```cinclude <>include <>struct task {int id; // 任务IDint priority; // 优先级int burst_time; // 执行时间};void swap(struct task a, struct task b) {struct task temp = a;a = b;b = temp;}void print_task(struct task task, int n) {printf("Task ID\tPriority\tBurst Time\n");for (int i = 0; i < n; i++) {printf("%d\t\t%d\t\t%d\n", task[i].id, task[i].priority, task[i].burst_time);}}void sort_task(struct task task, int n) {for (int i = 0; i < n-1; i++) {for (int j = i+1; j < n; j++) {if (task[i].priority < task[j].priority) {swap(&task[i], &task[j]);}}}}int main() {struct task task[5] = {{1, 3, 8},{2, 1, 4},{3, 2, 6},{4, 2, 5},{5, 4, 7}};int n = sizeof(task) / sizeof(struct task);printf("Original Task List:\n");print_task(task, n);sort_task(task, n);printf("Sorted Task List:\n");print_task(task, n);return 0;}```在这个示例代码中,我们定义了一个结构体`task`,用于表示每个任务的相关信息,包括任务ID、优先级和执行时间。

基于优先级调度进程算法的实现

基于优先级调度进程算法的实现

基于优先级调度进程算法的实现优先级调度进程算法是操作系统中常用的调度算法之一,其核心思想是根据进程的优先级来确定调度顺序。

优先级较高的进程会先被调度执行,从而提高系统的响应速度和任务处理效率。

以下是基于优先级调度进程算法的示例代码(使用C语言实现):```c#include<stdio.h>#include<stdlib.h>#define MAX_PROCESS 10typedef struct Processint pid; // 进程IDint priority; // 进程优先级} Process;//按照进程优先级降序排列void sort(Process *p, int n)for (int i = 0; i < n - 1; i++)for (int j = 0; j < n - i - 1; j++)if (p[j].priority < p[j + 1].priority)Process temp = p[j];p[j]=p[j+1];p[j + 1] = temp;}}}for (int i = 1; i < n; i++)}for (int i = 0; i < n; i++)}void display(Process *p, int n)printf("进程ID\t优先级\t执行时间\t等待时间\t周转时间\n"); for (int i = 0; i < n; i++)}int maiint n;Process p[MAX_PROCESS];printf("请输入进程数量:");scanf("%d", &n);printf("请输入进程的优先级和执行时间:\n");for (int i = 0; i < n; i++)p[i].pid = i + 1;printf("进程%d的优先级:", i + 1);scanf("%d", &p[i].priority);printf("进程%d的执行时间:", i + 1);}sort(p, n); // 按照优先级排序display(p, n); // 显示结果return 0;```以上代码实现了基本的优先级调度进程算法,包括输入进程数量、优先级和执行时间,并按照进程的优先级进行排序。

C语言中设置进程优先顺序的方法

C语言中设置进程优先顺序的方法

C语言中设置进程优先顺序的方法在C语言中,可以使用操作系统提供的函数或系统调用来设置进程的优先级顺序。

在大多数操作系统中,进程优先级可以通过设置进程的调度策略和优先级等属性来实现。

有以下几种方法可以设置进程的优先级顺序:1. 通过nice函数设置进程的调度优先级:- nice函数可以增加或降低进程的调度优先级,接受一个整数参数,范围一般是-20到19,负值降低优先级,正值增加优先级,默认为0。

- 调用nice函数可以改变进程的调度优先级,但是范围受到限制,通常只能调整较小的范围。

2.通过调度策略函数来设置进程的优先级:- 在Linux系统中,可以使用sched_setscheduler函数来设置进程的调度策略和优先级。

该函数接受一个进程ID、调度策略和优先级作为参数,可以将进程的优先级设置为较高或较低的值,如FIFO、RR等。

3.使用信号来设置进程的优先级:-在一些情况下,可以通过发送信号来改变进程的优先级。

例如,使用SIGSTOP和SIGCONT信号可以暂停和恢复进程的执行,从而实现优先级的切换。

4.创建多个线程并设置线程的优先级:- 如果在C语言中使用多线程编程,可以使用线程库提供的函数设置线程的优先级。

例如,在POSIX线程库中,可以使用pthread_setschedparam函数来设置线程的调度策略和优先级。

5.在操作系统层面设置进程的优先级:- 在一些操作系统中,可以通过操作系统提供的工具或命令行来设置进程的优先级。

例如,Linux系统中的nice命令可以通过命令行参数设置进程的优先级。

无论使用哪种方法,设置进程的优先级顺序需要有足够的权限来操作。

此外,需要理解不同操作系统可能的调度策略和优先级范围,以确保正确地设置进程的优先级。

需要注意的是,过度调整进程的优先级可能会导致系统性能下降或导致其他进程的执行受到影响。

因此,在设置进程的优先级时,需要权衡系统的整体性能和其他进程的公平性。

c语言 优先级算法

c语言 优先级算法

c语言优先级算法【最新版】目录1.概述2.优先级算法的定义和分类3.优先级算法在 C 语言中的实现4.优先级算法的应用实例5.总结正文1.概述C 语言是一种广泛应用的编程语言,其功能强大,可以进行各种复杂数学运算和逻辑操作。

在 C 语言编程中,优先级算法是一个非常重要的概念。

优先级算法是指,按照一定的规则,对输入的数据进行排序或处理,使得某些数据具有更高的优先级,可以优先被处理或者呈现。

2.优先级算法的定义和分类优先级算法的定义是,按照一定的规则,对输入的数据进行排序或处理,使得某些数据具有更高的优先级,可以优先被处理或者呈现。

优先级算法的分类主要有两种,一种是基于时间的优先级算法,另一种是基于权重的优先级算法。

基于时间的优先级算法是指,按照任务的时间顺序,先到达的任务先被处理。

这种算法的优点是简单易实现,缺点是不能保证任务的优先级。

基于权重的优先级算法是指,按照任务的权重大小,权重大的任务先被处理。

这种算法的优点是可以保证任务的优先级,缺点是可能会导致任务处理顺序的不公平。

3.优先级算法在 C 语言中的实现在 C 语言中,实现优先级算法的方式有很多,其中最常见的是使用队列和优先队列。

队列是一种线性数据结构,按照先进先出的原则进行数据的存储和处理。

在 C 语言中,可以使用数组或者链表实现队列。

优先队列是一种非线性数据结构,按照任务的优先级进行数据的存储和处理。

在 C 语言中,可以使用堆或者队列实现优先队列。

4.优先级算法的应用实例优先级算法在 C 语言中的应用非常广泛,例如,在操作系统中,进程的调度就可以使用优先级算法;在网络编程中,数据的传输也可以使用优先级算法;在人工智能中,决策树的构建也可以使用优先级算法。

5.总结优先级算法是 C 语言编程中非常重要的一个概念,它可以帮助我们更好地处理数据,使得某些数据具有更高的优先级,可以优先被处理或者呈现。

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

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

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

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

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

2、实验内容:用高级语言(要求C语言实验环境)编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.按进程调度算法实现处理机调度。

通过设计相应的数据结构建立进程控制块(PCB)和进程队列,采用先来先服务、优先数优先、轮转法,以及多级反馈轮转法等进程调度算法分别实现处理机调度策略。

3,实验题目:处理器调度4.流程图:(1)主程序流程图:(2)子程序init()流程图:(3) 子程序max_pri_process()流程图:(4)子程序show()流程图:(5)子程序run()流程图:5.源程序//按优先数调度算法实现处理器调度的程序#include "stdio.h"#include "string.h"#define num 5//假定系统中进程个数为5struct PCB{char ID;//进程名int runtime;//要求运行时间int pri;//优先数char state; //状态,R-就绪,F-结束};struct PCB pcblist[num];//定义进程控制块数组void init()//PCB初始化子程序{int i;for(i=0;i<num;i++){printf("PCB[%d]:ID pri runtime \n",i+1);//为每个进程任意指定pri和runtimescanf("%s%d%d",&pcblist[i].ID,&pcblist[i].pri,&pcblist[i].runtime);pcblist[i].state='R';//进程初始状态均为就绪getchar();//接收回车符}}int max_pri_process()//确定最大优先级进程子程序{int max=-100;//max为最大优先数,初始化为-100int i;int key;for(i=0;i<num;i++){if(pcblist[i].state=='r')//r为辅助状态标志,表示正在运行return -1;//返回-1elseif(max<pcblist[i].pri&&pcblist[i].state=='R')//从就绪进程中选取优先数最大的进程{max=pcblist[i].pri;//max存放每次循环中的最大优先数key=i;//将进程号赋给key}}if(pcblist[key].state=='F')//具有最大优先数的进程若已运行完毕return -1;//则返回-1else//否则return key;//将key作为返回值返回}void show()//显示子程序{int i;printf("\n ID pri runtime state\n");printf("-------------------------------------------------\n");for(i=0;i<num;i++)//依次显示每个进程的名、优先数、要求运行时间和状态{printf("%s%6d%8d %s\n",&pcblist[i].ID,pcblist[i].pri,pcblist[i].runtime,&pcblist[i].state); }printf(" press any key to continue...\n");}void run()//进程运行子程序{int i,j;int t=0;//t为运行次数for(j=0;j<num;j++){t+=pcblist[j].runtime;}//运行次数即为各个进程运行时间之和printf("\nbefore run,the conditon is:\n");show(); //调用show()子程序显示运行前PCB的情况getchar();//等待输入回车符for(j=0;j<t;j++){while(max_pri_process()!=-1)//具有最大优先数的进程没有运行完,让其运行{pcblist[max_pri_process()].state='r';//将其状态置为r,表示其正在运行}for(i=0;i<num;i++){if(pcblist[i].state=='r'){ pcblist[i].pri-=1;//将当前运行进程的优先数减1pcblist[i].runtime--;//要求运行时间减1{if(pcblist[i].runtime==0)pcblist[i].state='F';//运行完则将该进程状态置为结束elsepcblist[i].state='R';//未运行完将其状态置为就绪}show();//显示每次运行后各PCB的情况getchar();//等待回车进入下一次运行}}}}void main()//按动态优先数调度主程序{init();//初始化各个进程PCBrun();//进程调度模拟}6,运行的初值和运行结果:初值界面:运行界面1:运行界面2:运行界面3:7.总结和心得:本实验严格按照试验要求,根据要求所涉及的知识点进行了针对性的知识点掌握和复习。

基于动态优先权的进程调度算法的模拟实现

基于动态优先权的进程调度算法的模拟实现
【Key wor ds】dynamic priority schedul ing; proess schedul ing; si mulation
在多道程序环境下, 进程的数目往往多于处理机数 目。这就要求 系统能按照某种算法, 动态的把处理机分配给就绪队列中 的进程, 使 之执行。因此, 处理机调度是操作系统设计的中心问题之一。进程调度 问 题 的 核 心 就 是采 用 什 么 样 的 算 法 把 处 理 机 分 配 给 进 程 。进 程 调 度 算 法 也 是 在 任 何 操作 系 统 中 必 须 配 置 的 一 级 调 度 。好 的 进 程 调 度 算 法 将 有效的提高系统中 各种资源利用 率, 减少处理机 的空闲时间, 避 免部 分 作 业 长 期 得不 到 处 理 机 响 应 等 情 况 的 发 生 。
1 . 动 态 优 先 权 调度 算 法 介 绍 动态优先权调度算法, 以就绪队列中各个进程的优 先权作为进程 调度的依据。各个进程的优先权在创建进程时所赋予, 随着进程的推 进 或 其 等 待 时间 的 增 加 而 改 变 。进 程 的 优 先 权 利 用 某 一 范 围 内 的 整 数 来表示。有的系统数值越小优先权越高, 如 Uni x 系统, 有的系统则反 之。采用该算法时, 每次总是在就绪队列中选择一个优 先权最高的进 程进行调度, 并将处理机分配给该进程。动态优先权调 度算法又分为 抢占式和非抢占式两种。本文采用 C 语言对非抢占式动态优先权调度 算 法 进 行 了 设 计和 实 现 。 2 . 算 法 的 设 计 思路 (1 ) 在算法的设计中各项原则。 首 先 规 定优 先 数 改 变 的 原 则 : ● 进程在就绪队列中呆一个时间片, 优先数增加 1 。 ● 进程每运行一个时间片, 优先数减 3。 其次, 算法的数据结构及操作采 用数组方式, 将输入的 N个 进程 的 PCB 信息保存到一个数组中。用 PCB 数组的插入和 删除动态地模 拟 进 程 调 度 过程 。 (2 ) 系统初始条件。 系统中设有 5 个进程, 每个进程产生时间, 优先级各不相同。利用 进程控制块 PCB 来 描述各个进程。进程控制块 PCB 包括以下字段: ● 进程标识数 ID; ● 进程优先数 PRIORITY, 并规定优先数越大的进程, 其优先权越 高; ● 进程已占用的 CPU 时间 CPUTIME; ● 进 程还 需占 用的 CPU 时间 ALLTIME。 当进 程 运行 完毕 时 , ALLTIME 变为 0 ; ● 进 程 的 阻 塞 时 间 STARTBLOCK, 表 示 当 进 程 再 运 行 STARTBLOCK 个时间片后, 进程将进入阻塞状态; ● 进程 被阻塞 的时间 BLOCKTIME, 表示已 阻塞 的进程 再等 待 BLOCKTIME 个时间片后, 进程将转换成就绪状态; ● 进程状态 STATE, 包括三种状态, 就绪态、阻塞态、完成态; CPU 处理进 程是从就绪队 列中选择当前各 进程中优先权最 大的 进程开始的。由于采用的是非抢占式调度算法, 则当前 进程执行完一 个 时 间 片 之 后有 以 下 几 种 情 况 : ① 当前进程结束则退出系统, 否则排到就绪队列尾 或根据阻塞时

fcfs+hrn调度算法代码c语言

fcfs+hrn调度算法代码c语言

先来解释一下 FCFS(First-Come, First-Served)和 HRN(Highest Response Ratio Next)调度算法:
1.FCFS调度算法:按照任务到达的顺序进行调度,即先到达的任务先被执行。

2.HRN调度算法: HRN是一种动态优先级调度算法,它计算每个任务的响
应比(Response Ratio),响应比定义为(等待时间 + 服务时间) / 服务时间。

HRN选择具有最高响应比的任务来执行。

下面是一个简单的用 C 语言实现 FCFS 和 HRN 调度算法的例子:
这个程序首先让用户输入进程的到达时间和服务时间,然后分别使用 FCFS 和
HRN 调度算法进行调度,最后输出等待时间、周转时间和响应比等信息。

请注意,这是一个简单的演示程序,实际中可能需要更多的功能和错误处理。

处理器调度算法c语言

处理器调度算法c语言

处理器调度算法c语言一、概述处理器调度算法是操作系统中一个非常重要的问题。

在多任务操作系统中,有多个进程同时运行,而处理器只有一个,因此需要对进程进行调度,使得每个进程都能够得到适当的执行时间。

二、常见的处理器调度算法1. 先来先服务(FCFS)FCFS算法是最简单的调度算法之一。

它按照进程到达时间的先后顺序进行调度,即先到达的进程先执行。

这种算法容易实现,但可能会导致长作业等待时间过长。

2. 最短作业优先(SJF)SJF算法是根据每个进程所需的CPU时间来进行排序,并按照顺序进行调度。

这种算法可以减少平均等待时间和平均周转时间,并且可以最大限度地利用CPU资源。

3. 优先级调度优先级调度是根据每个进程的优先级来进行排序,并按照顺序进行调度。

这种算法可以确保高优先级进程得到更多的CPU时间,但可能会出现低优先级进程饥饿问题。

4. 时间片轮转(RR)RR算法将CPU分配给每个任务一定量的时间片,在该时间片内运行任务。

如果任务在该时间片内未完成,则将其放回队列尾部,并分配给下一个任务时间片。

这种算法可以确保公平性,并且可以避免长作业等待时间过长。

三、C语言中的处理器调度算法实现1. FCFS算法实现#include <stdio.h>int main(){int n, i, j;float avg_waiting_time = 0, avg_turnaround_time = 0;printf("Enter the number of processes: ");scanf("%d", &n);int burst_time[n], waiting_time[n], turnaround_time[n];printf("Enter the burst time for each process:\n");for(i=0; i<n; i++)scanf("%d", &burst_time[i]);waiting_time[0] = 0;turnaround_time[0] = burst_time[0];for(i=1; i<n; i++){waiting_time[i] = waiting_time[i-1] + burst_time[i-1];turnaround_time[i] = waiting_time[i] + burst_time[i];avg_waiting_time += waiting_time[i];avg_turnaround_time += turnaround_time[i];}avg_waiting_time /= n;avg_turnaround_time /= n;printf("\nProcess\tBurst Time\tWaiting Time\tTurnaround Time\n");for(i=0; i<n; i++)printf("P%d\t%d\t\t%d\t\t%d\n", i+1, burst_time[i], waiting_time[i], turnaround_time[i]);printf("\nAverage Waiting Time: %.2f\n", avg_waiting_ time);printf("Average Turnaround Time: %.2f\n", avg_turnaround_ time);return 0;}2. SJF算法实现#include <stdio.h>int main(){int n, i, j, temp;float avg_waiting_time = 0, avg_turnaround_time = 0; printf("Enter the number of processes: ");scanf("%d", &n);int burst_time[n], waiting_time[n], turnaround_time[n]; printf("Enter the burst time for each process:\n");for(i=0; i<n; i++)scanf("%d", &burst_time[i]);for(i=0; i<n-1; i++)for(j=i+1; j<n; j++)if(burst_time[i] > burst_time[j]){temp = burst_time[i];burst_time[i] = burst_time[j]; burst_time[j] = temp;}waiting_time[0] = 0;turnaround_time[0] = burst_time[0];for(i=1; i<n; i++){waiting_time[i] = waiting_time[i-1] + burst_time[i-1];turnaround_time[i] = waiting_time[i] + burst_time[i];avg_waiting_time += waiting_time[i];avg_turnaround_time += turnaround_time[i];}avg_waiting_time /= n;avg_turnaround_time /= n;printf("\nProcess\tBurst Time\tWaiting Time\tTurnaround Time\n");for(i=0; i<n; i++)printf("P%d\t%d\t\t%d\t\t%d\n", i+1, burst_time[i], waiting_time[i], turnaround_time[i]);printf("\nAverage Waiting Time: %.2f\n", avg_waiting_ time);printf("Average Turnaround Time: %.2f\n", avg_turnaround_ time);return 0;}3. 优先级调度算法实现#include <stdio.h>int main(){int n, i, j, temp;float avg_waiting_time = 0, avg_turnaround_time = 0;printf("Enter the number of processes: ");scanf("%d", &n);int burst_time[n], waiting_time[n], turnaround_time[n], priority[n];printf("Enter the burst time and priority for each process:\n"); for(i=0; i<n; i++)scanf("%d %d", &burst_time[i], &priority[i]);for(i=0; i<n-1; i++)for(j=i+1; j<n; j++)if(priority[i] > priority[j]){temp = priority[i];priority[i] = priority[j];priority[j] = temp;temp = burst_time[i];burst_time[i] = burst_time[j]; burst_time[j] = temp;}waiting_time[0] = 0;turnaround_time[0] = burst_time[0];for(i=1; i<n; i++){waiting_time[i] = waiting_time[i-1] + burst_time[i-1];turnaround_time[i] = waiting_time[i] + burst_time[i];avg_waiting_ time += waiting_ time[i];avg_turnaround_ time += turnaround_ time[i];}avg_waiting_ time /= n;avg_turnaround_ time /= n;printf("\nProcess\tBurst Time\tPriority\tWaiting Time\tTurnaround Time\n");for(i=0; i<n; i++)printf("P%d\t%d\t\t%d\t\t%d\t\t%d\n", i+1, burst_ time[i], priority[i], waiting_time[i], turnaround_time[i]);printf("\nAverage Waiting Time: %.2f\n", avg_waiting_ time);printf("Average Turnaround Time: %.2f\n", avg_turnaround _ time);return 0;}4. RR算法实现#include <stdio.h>int main(){int n, i, j, time_quantum;float avg_waiting_time = 0, avg_turnaround_time = 0;printf("Enter the number of processes: ");scanf("%d", &n);int burst_time[n], remaining_time[n], waiting_time[n], turnaround_time[n];printf("Enter the burst time for each process:\n");for(i=0; i<n; i++)scanf("%d", &burst_time[i]);printf("Enter the time quantum: ");scanf("%d", &time_quantum);for(i=0; i<n; i++)remaining_time[i] = burst_time[i];int t=0;while(1){int done = 1;for(i=0; i<n; i++){if(remaining_time[i] > 0){done = 0;if(remaining_ time[i] > time_ quantum){t += time_ quantum;remaining_ time[i] -= time_ quantum;}else{t += remaining _ time[i];waiting_time[i] = t - burst_time[i];remaining_ time[i] = 0;turnaround_ time[i] = waiting_time[i] + burst_time[i];avg_waiting_ time += waiting_ time[i];avg_turnaround _ time += turnaround_ time[i];}}}if(done == 1)break;}avg_waiting_ time /= n;avg_turnaround_ time /= n;printf("\nProcess\tBurst Time\tWaiting Time\tTurnaround Time\n");for(i=0; i<n; i++)printf("P%d\t%d\t\t%d\t\t%d\n", i+1, burst_time[i], waiting_time[i], turnaround_time[i]);printf("\nAverage Waiting Time: %.2f\n", avg_waiting_ time);printf("Average Turnaround Time: %.2f\n", avg_turnaround _ time);return 0;}四、总结以上是常见的处理器调度算法的C语言实现方式。

c语言编写的进程调度算法

c语言编写的进程调度算法

c语言编写的进程调度算法C语言编写的进程调度算法进程调度是操作系统的核心功能之一,它负责按照一定的策略和算法,合理地分配CPU资源给正在运行或即将运行的进程,从而提高操作系统的性能和资源利用率。

在操作系统中,存在多种不同的进程调度算法,本文将以C语言编写进程调度算法为主题,一步一步回答。

第一步:定义进程结构体首先,我们需要定义一个进程的数据结构体,以便在调度算法中使用。

进程结构体包括进程ID、进程优先级、进程状态等信息。

以下是一个简单的进程结构体示例:ctypedef struct {int pid; 进程IDint priority; 进程优先级int state; 进程状态} Process;第二步:初始化进程队列进程队列是存储所有待调度进程的数据结构,可以使用链表或数组来实现。

在初始化进程队列之前,需要先创建一个空的进程队列。

以下是一个简单的初始化进程队列函数:c#define MAX_PROCESSES 100 最大进程数Process processQueue[MAX_PROCESSES]; 进程队列int processCount = 0; 当前进程数void initProcessQueue() {processCount = 0;}第三步:添加进程到队列在调度算法中,需要将新创建或运行的进程添加到进程队列中,这样才能对其进行调度。

以下是一个简单的添加进程到队列的函数:void addProcess(int pid, int priority, int state) {if (processCount >= MAX_PROCESSES) {printf("进程队列已满,无法添加进程!\n");return;}Process newProcess;newProcess.pid = pid;newProcess.priority = priority;newProcess.state = state;processQueue[processCount] = newProcess;processCount++;}第四步:实现进程调度算法进程调度算法决定了操作系统如何决定哪个进程应该被调度并获得CPU 资源。

时间片轮转算法和优先级调度算法C语言模拟实现

时间片轮转算法和优先级调度算法C语言模拟实现

时间片轮转算法和优先级调度算法C语言模拟实现时间片轮转算法(Round Robin Scheduling)和优先级调度算法(Priority Scheduling)是操作系统中常用的两种进程调度算法。

下面将分别对这两种算法进行C语言模拟实现,并进行详细解释。

```c#include <stdio.h>#include <stdbool.h>#define MAX_PROC_NUM 10#define TIME_QUANTUM 2typedef struct Processint pid; // 进程ID} Process;void roundRobinScheduling(Process processes[], intnum_processes)for (int i = 0; i < num_processes; i++)} else}}}}int maiProcess processes[MAX_PROC_NUM];int num_processes;printf("Enter the number of processes: "); scanf("%d", &num_processes);for (int i = 0; i < num_processes; i++)printf("Process %d: ", i+1);processes[i].pid = i+1;}roundRobinScheduling(processes, num_processes); return 0;```优先级调度算法模拟实现:```c#include <stdio.h>#include <stdbool.h>#define MAX_PROC_NUM 10typedef struct Processint pid; // 进程IDint priority; // 优先级} Process;void priorityScheduling(Process processes[], int num_processes)int highest_priority = 0;int highest_priority_index;highest_priority = -1;for (int i = 0; i < num_processes; i++)highest_priority = processes[i].priority;highest_priority_index = i;}}if (highest_priority == -1)continue;}} else}}int maiProcess processes[MAX_PROC_NUM];int num_processes;printf("Enter the number of processes: ");scanf("%d", &num_processes);for (int i = 0; i < num_processes; i++)printf("Process %d:\n", i+1);printf("Burst Time: ");printf("Priority: ");scanf("%d", &processes[i].priority);processes[i].pid = i+1;}priorityScheduling(processes, num_processes);return 0;```以上是时间片轮转算法和优先级调度算法的C语言模拟实现。

时间片轮转算法及优先级调度算法C语言模拟实现收藏

时间片轮转算法及优先级调度算法C语言模拟实现收藏

时间片轮转算法及优先级调度算法C语言模拟实现收藏时间片轮转算法是一种常见的CPU调度算法,通过将进程按照到达顺序放置在一个就绪队列中,并且给予每个进程相同的时间片,当进程用完时间片后,将其放到队列的尾部,轮流执行其他进程。

优先级调度算法是根据进程的优先级来决定下一个执行的进程。

下面是使用C语言模拟实现时间片轮转算法和优先级调度算法的代码:```c#include <stdio.h>typedef structchar name[10];int arrivalTime;int burstTime;int remainingTime;} Process;int totalTurnaroundTime = 0;int totalWaitingTime = 0;//初始化每个进程的剩余执行时间for (int i = 0; i < numProcesses; i++)processes[i].remainingTime = processes[i].burstTime;}while (1)int allProcessesFinished = 1; // 标记所有进程是否执行完毕for (int i = 0; i < numProcesses; i++)if (processes[i].remainingTime > 0)allProcessesFinished = 0; // 还有未执行完毕的进程processes[i].remainingTime = 0;} else}printf("%s执行完毕,剩余时间:%d\n", processes[i].name, processes[i].remainingTime);}}if (allProcessesFinished)break; // 所有进程执行完毕,退出循环}}//计算平均周转时间和平均等待时间float averageTurnaroundTime = (float)totalTurnaroundTime / numProcesses;float averageWaitingTime = (float)totalWaitingTime / numProcesses;printf("平均周转时间:%.2f\n", averageTurnaroundTime);printf("平均等待时间:%.2f\n", averageWaitingTime);int maiint numProcesses;printf("请输入进程数量:");scanf("%d", &numProcesses);Process processes[numProcesses];for (int i = 0; i < numProcesses; i++)printf("请输入进程%d的名称、到达时间和执行时间:", i+1);scanf("%s%d%d", processes[i].name, &processes[i].arrivalTime, &processes[i].burstTime);}printf("请输入时间片大小:");return 0;```优先级调度算法:```c#include <stdio.h>typedef structchar name[10];int arrivalTime;int burstTime;int priority;int waitingTime;int turnaroundTime;} Process;void runPriority(Process* processes, int numProcesses)int totalWaitingTime = 0;int totalTurnaroundTime = 0;//对进程按照到达时间进行排序for (int i = 0; i < numProcesses; i++)for (int j = 0; j < numProcesses-i-1; j++)if (processes[j].arrivalTime > processes[j+1].arrivalTime) Process temp = processes[j];processes[j] = processes[j+1];processes[j+1] = temp;}}}processes[0].waitingTime = 0;//计算每个进程的等待时间和周转时间for (int i = 1; i < numProcesses; i++)processes[i].waitingTime = processes[i-1].waitingTime + processes[i-1].burstTime;processes[i].turnaroundTime = processes[i].waitingTime + processes[i].burstTime;totalWaitingTime += processes[i].waitingTime;totalTurnaroundTime += processes[i].turnaroundTime;}//计算平均等待时间和平均周转时间float averageWaitingTime = (float)totalWaitingTime / numProcesses;float averageTurnaroundTime = (float)totalTurnaroundTime / numProcesses;printf("平均等待时间:%.2f\n", averageWaitingTime);printf("平均周转时间:%.2f\n", averageTurnaroundTime);int maiint numProcesses;printf("请输入进程数量:");scanf("%d", &numProcesses);Process processes[numProcesses];for (int i = 0; i < numProcesses; i++)printf("请输入进程%d的名称、到达时间、执行时间和优先级:", i+1);scanf("%s%d%d%d", processes[i].name,&processes[i].arrivalTime, &processes[i].burstTime,&processes[i].priority);}runPriority(processes, numProcesses);return 0;```通过输入进程的信息,可以计算出使用时间片轮转算法和优先级调度算法的平均等待时间和平均周转时间,从而比较它们的效果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(node->count >=NAME_LEN)
{
waitHead = detel_pcb_run(node,waitHead);
node->count = 0;
return node;
}
}
return NULL;
}
void free_finish(PCB *head)
char name[NAME_LEN];
int priority;
int needtime;
}PCB_NODE;
typedef struct node{
struct node *next;
PCB_NODE imm_pcb;
int round;
int cputime;
if(ppnode == NULL)
return runHead;
// return NULL;
if(runHead == ppnode)
return runHead->next;
front = runHead;
for(pnode = runHead;pnode!= NULL;pnode=pnode->next)
else
return NULL;
}
/* 插入完成队列*/
PCB *insert_finish(PCB *ppnode,PCB *finishHead)
{
if(ppnode == NULL)
return NULL;
ppnode->next = finishHead;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME_LEN 10
#define MAX 5
/* 进程的所以状态*/
typedef enum{
WAIT,
READY,
RUNNING,
{
if(pnode == ppnode)
{
front->next = pnode->next;
pnode->next = NULL;
return runHead;
}
else
front = pnode;
}
return runHead;
front->next = pnode;
}
else
{
node->next = pnode;
pnode->next = NULL;
}
return readyHead;
}
/*
* Function:insert_RUNNING
*
* Description:把准备对列中的第一个结点交给运行对列
pnode->cputime =0;
pnode->count =0;
pnode->state = READY;
}
PCB *pcb_malloc(int size)
{
return malloc(size);
}
/*
* Function: creat_pcb
*
* Description:建立一个进程结点,即给进程结点一个实际的意义
*
*/
PCB *insert_run(PCB *runHead,PCB *pnode)
{
if(pnode == NULL)
return runHead;
pnode->next = runHead;
pnode->state = RUNNING;
return pnode;
ppnode->state = WAIT;
return insert_ready(waitHead,ppnode);
}
PCB *detel_pcb(PCB *ppnode)
{
if(ppnode ==NULL)
return NULL;
if(ppnode->imm_pcb.needtime > 0)
printf("N:%s\tP:%d\tCT:%d\tNT:%d\tST:%d\tTT:%d\n",
node->imm_,node->imm_pcb.priority,node->cputime,node->imm_pcb.needtime,node->state,node->count);
int count;
int state;
}PCB;
/*
* Function: init_pcb
*
*Description:初始化进程结点
*
*/
void init_pcb(PCB *pnode)
{
if(pnode == NULL)
return ;
pnode->next = NULL;
*Function:insert_ready
*
*Description:把有实际意义的结点插入到准备对列中。
*
*/
PCB *insert_ready(PCB *readyHead,PCB *pnode)
{
PCB *node;
PCB *front;
if(pnode == NULL)
}
}
PCB *do_wait(PCB *waitHead)
{
PCB *node;
if(waitHead == NULL)
return NULL;
for(node = waitHead;node != NULL; node = node->next)
{
node->count++;
}
/*
*Function:insert_wait
*
*Description:把运行对列中优先级小于准备对列的头结点时,则把这个结点插入等待对列
*
*/
PCB *insert_wait(PCB *ppnode,PCB *waitHead)
{
ppnode->next = NULL;
ppnode->state = FINISH;
return ppnode;
}
PCB *detel_pcb_run(PCB *ppnode,PCB *runHead)
{
PCB *pnode;
PCB *front;
if(runHead == NULL)
return NULL;
*
*/
PCB *creat_pcb(PCB *pnode,PCB_NODE *pcbNode)
{
if(pnode == NULL && pcbNode == NULL)
return NULL;
init_pcb(pnode);
strcpy(pnode->imm_,pcbNode->name);
FINISH
}pcb_state;
/*进程的所有优先级级别*/
typedef enum{
MAX_HIGH=0,
HIGH=10,
MIDDLE=20,
LOW=30,
MIN_LOW=40,
DEFFAULT=50
}pcb_priority;
typedef struct pcb_node{
// pnode->imm_ = NULL;
memset(pnode->imm_,'0',NAME_LEN);
pnode->imm_pcb.priority =MIDDLE;
pnode->imm_pcb.needtime =0;
pnode->round =0;
int i;
PCB *ppnode=NULL,
*pnode=NULL;
PCB *run=NULL,
*finish=NULL,
*wait=NULL,
*ready=NULL;
if(front == node)
{
pnode->next = node;
readyHead = pnode;
}
else
{
pnode->next = node;
front->next = pnode;
}
return NULL;
else
return ppnode;
}
PCB *wait_pcb(PCB *ppnode,PCB *readyHead)
{
if(ppnode ==NULL)
return NULL;
if(ppnode->imm_pcb.priority > MIN_LOW )
return readyHead;
}
else
front = node;
}
/*准备对列中最后一个结点*/
if(pnode->imm_pcb.priority < node->imm_pcb.priority)
{
pnode->next = node;
}
void replace(PCB *head)
相关文档
最新文档