操作系统实验——处理器调度
来源:互联网 发布:网络建设与管理方案 编辑:程序博客网 时间:2024/05/20 18:02
Main.c
#include "tools.h"#include "dispatch.h"/** 定义进程数据结构*/int main(){ pro myPro[5] = {{"A",0,3},{"B",2,6},{"C",4,4},{"D",6,5},{"E",8,2}}; for(int i=0;i<n;i++){ print(myPro[i]);//打印进程 } FCFS(myPro,5);//先来先服务 RR(myPro,5);//乱转,q=1 SPN(myPro,5);//最短进程优先 SRT(myPro,5);//最短剩余时间 HRRN(myPro,5);//最高响应比 return 0;}
tools.h
#define Num 100typedef struct pro{ char name[20]; //进程名称 int arrTime; //到达时间 int serTime; //服务时间 int finTime; //结束时间 int cycTime; //周转时间 float resRation; //响应比}pro;void printResult(pro process[], int n);void copy(pro process[], pro tempPro[], int n);void sortByArrTime(pro process[], int n);void sortOfPro(pro process[], int sort[],int n);int isFinish(pro process[], int n);void print(pro process);
tools.c
#include<stdio.h>#include<string.h>#define Num 100typedef struct pro{ char name[20]; //进程名称 int arrTime; //到达时间 int serTime; //服务时间 int finTime; //结束时间 int cycTime; //周转时间 float resRation; //响应比}pro;void print(pro process){ printf("进程:%s\n", process.name); printf("\t到达时间:%d\n", process.arrTime); printf("\t服务时间:%d\n", process.serTime); printf("\t结束时间:%d\n", process.finTime); printf("\t周转时间:%d\n", process.cycTime);}void printResult(pro process[], int n){ for (int i = 0; i<n; i++) { printf("进程 %s:\n", process[i].name); //printf("\t到达时间:%d\n", process[i].arrTime); //printf("\t服务时间:%d\n", process[i].serTime); printf("\t完成时间:%d\n", process[i].finTime); printf("\t周转时间:%d\n", process[i].cycTime); printf("\t响应比: %.2f\n", process[i].resRation); }}void copy(pro process[], pro tempPro[], int n){ for (int i = 0; i<n; i++) { tempPro[i] = process[i]; //print(tempPro[i]); }}void sortByArrTime(pro process[], int n){ for (int i = 0; i<n; i++) { for (int j = 0; j<n - i - 1; j++) { if (process[j].arrTime>process[j + 1].arrTime) { pro temp = process[j]; process[j] = process[j + 1]; process[j + 1] = temp; } } }}void sortOfPro(pro process[], int sort[],int n){ pro tempPro[Num]; copy(process, tempPro, n); int hasSort[Num] = { 0 }; sortByArrTime(tempPro, n); for (int i = 0; i<n; i++) { for (int j = 0; j<n; j++) { if (hasSort[j]) { continue; } if (strcmp(process[j].name, tempPro[i].name) == 0) { sort[j] = i; break; } } }}int isFinish(pro process[], int n){ for (int i = 0; i<n; i++) { if (process[i].serTime>0) { return 0; } } return 1;}
dispatch.h
void FCFS(pro process[], int n);void RR(pro process[], int n);void SPN(pro process[], int n);void SRT(pro process[], int n);void HRRN(pro process[], int n);
FCFS.c
#include "tools.h"/** 先来先服务 FCFS*/void FCFS(pro process[],int n){ pro tempPro[Num];copy(process, tempPro, n);int sort[Num];sortOfPro(process,sort, n);sortByArrTime(tempPro, n);//按达到时间排序,排序后依次执行int currTime = 0;for (int i = 0; i<n; i++) {currTime += tempPro[i].serTime;process[sort[i]].finTime = currTime;process[sort[i]].cycTime = process[sort[i]].finTime - process[sort[i]].arrTime;process[sort[i]].resRation = process[sort[i]].cycTime * 1.0 / process[sort[i]].serTime;}printf("\n------ FCFS -------\n");printResult(process, n);//打印运行结果}
HRRN.c
#include "tools.h"/** 最高响应比优先*/void HRRN(pro process[],int n){ int sort[Num];//进程的对应的顺序 sortOfPro(process, sort, n); pro tempPro[Num];//拷贝进程数组,防止该表进程数组,影响其他算法的结果 copy(process, tempPro, n); int currTime = 0; int maxK, maxResRation;//maxK、maxResRation分别记录最高相应比的对应的进程下标和大小 int k = 0; int ready[Num]; int m; while (k<n) { m = 0; for (int i = 0; i<n; i++) { if (tempPro[sort[i]].serTime>0) { if (m==0) { maxK = sort[i]; maxResRation = tempPro[maxK].resRation; } if (tempPro[sort[i]].arrTime <= currTime) { tempPro[sort[i]].resRation = (currTime - tempPro[sort[i]].arrTime)*1.0 / tempPro[sort[i]].serTime; ready[m++] = sort[i]; } else { break; } } } //若m=0,说明当前无可运行进程,更新当前时间 if (m == 0) { currTime = process[maxK].arrTime; } else { for (int j = 0; j<m; j++) { if (tempPro[ready[j]].resRation > maxResRation) { maxK = ready[j]; maxResRation = tempPro[maxK].resRation; } } k++; currTime += process[maxK].serTime; //记录完成时间、周转时间、响应比 process[maxK].finTime = currTime; process[maxK].cycTime = process[maxK].finTime - process[maxK].arrTime; process[maxK].resRation = process[maxK].cycTime * 1.0 / process[maxK].serTime; tempPro[maxK].serTime = 0; } } printf("\n------ HRRN -------\n"); printResult(process, n);}
RR.c
#include "tools.h"#include<stdio.h>/** 轮转 (轮转时间片为1)*/void RR(pro process[], int n){ int sort[Num]; sortOfPro(process, sort, n); pro tempPro[Num]; copy(process, tempPro, n); int currTime = 0; int k = 1; int stack[Num]; int m = 1;//堆栈下个运行 stack[0] = sort[0]; int p = 0;//堆栈当前指针 while (1) { if (isFinish(tempPro, n)) break;//如果所有的进程都已经执行完毕,则终止执行 currTime++; tempPro[stack[p]].serTime--; while (k<n && currTime >= tempPro[sort[k]].arrTime) {//如果下一个进程已经到达,则将其加入到队列中来 if (sort[k] != stack[m]) { stack[m++] = sort[k]; if (m == n)m = 0; } k++; } if (tempPro[stack[p]].serTime == 0) { process[stack[p]].finTime = currTime; process[stack[p]].cycTime = process[stack[p]].finTime - process[stack[p]].arrTime; process[stack[p]].resRation = process[stack[p]].cycTime * 1.0 / process[stack[p]].serTime; } else { stack[m++] = stack[p]; if (m == n)m = 0; } p++; if (p == n)p = 0; } printf("\n------ RR -------\n"); printResult(process, n);//打印相关数据}
SPN.c
#include "tools.h"#include<stdio.h>/** 最短进程优先*/void SPN(pro process[], int n){ int sort[Num]; sortOfPro(process, sort, n); pro tempPro[Num]; copy(process, tempPro, n); int currTime = 0; int minK, minSerTime; int k = 0; int ready[Num]; int m; while (k<n) { m = 0; for (int i = 0; i<n; i++) { if (tempPro[sort[i]].serTime>0) { if (m==0) { minK = sort[i]; minSerTime = tempPro[minK].serTime; } if (tempPro[sort[i]].arrTime <= currTime) { ready[m++] = sort[i]; } else { break; } } } if (m == 0) {//如果ready数组为空,说明当前无可运行进程,将当前时间只为下一个可执行进程的到达时间 currTime = process[minK].arrTime; } else { //找出最短进程 for (int j = 1; j<m; j++) { if (tempPro[ready[j]].serTime < minSerTime) { minK = ready[j]; minSerTime = tempPro[minK].serTime; } } k++; currTime += minSerTime; process[minK].finTime = currTime; process[minK].cycTime = process[minK].finTime - process[minK].arrTime; process[minK].resRation = process[minK].cycTime * 1.0 / process[minK].serTime; tempPro[minK].serTime = 0; } } printf("\n------ SPN -------\n"); printResult(process, n);}
SRT.c
#include "tools.h"#include<stdio.h>/** 最短剩余时间*/void SRT(pro process[], int n){ int sort[Num]; sortOfPro(process, sort, n); pro tempPro[Num]; copy(process, tempPro, n); int currTime = 0; int minK, minSerTime; int k = 0; int next = 0; int ready[Num]; int m; while (k<n) { if (next < (n-1)) { while (currTime >= process[sort[next]].arrTime) {//如果下一个进程已经到达,则将其加入到队列中来 next++; } } m = 0; for (int i = 0; i<n; i++) { if (tempPro[sort[i]].serTime > 0) { if (m==0) { minK = sort[i]; minSerTime = tempPro[minK].serTime; } if (tempPro[sort[i]].arrTime <= currTime) { ready[m++] = sort[i]; } else { break; } } } //m==0说明当前无可执行进程,更新当前时间 if (m == 0) { currTime = process[minK].arrTime; } else { //找出最短进程 for (int j = 1; j<m; j++) { if (tempPro[ready[j]].serTime < minSerTime) { minK = ready[j]; minSerTime = tempPro[minK].serTime; } } int interval = tempPro[sort[next]].arrTime - currTime; //如果当前时间与即将到来的进程的时间间隔小于最短剩余时间,则只执行间隔时间 if (interval>0 && interval < minSerTime) { minSerTime = interval; } tempPro[minK].serTime -= minSerTime; currTime += minSerTime; if (tempPro[minK].serTime == 0) { k++; process[minK].finTime = currTime; process[minK].cycTime = process[minK].finTime - process[minK].arrTime; process[minK].resRation = process[minK].cycTime * 1.0 / process[minK].serTime; } } } printf("\n------ SRT -------\n"); printResult(process, n);}
0 0
- 操作系统实验——处理器调度
- 操作系统—处理器调度
- 操作系统原理——处理器调度
- C#版操作系统实验—CPU调度
- 操作系统实验之单处理器系统的进程调度
- 操作系统 单处理器进程调度模拟实验(c++)
- 操作系统--处理器调度
- 处理器调度(操作系统)
- 【操作系统】--处理器调度
- 操作系统 处理器调度
- 处理器调度(操作系统)
- 实验一 处理器调度
- 处理器调度实验
- 操作系统—处理器
- 【操作系统】处理器的二级调度
- 操作系统 调度算法实验
- 操作系统实验------处理机调度
- 《操作系统》——处理器管理
- A1100. Mars Numbers (20)
- sparkmlib使用Pipeline实现简单的逻辑回归
- 实际工程中提升机器学习算法性能的建议
- Win7 Python 2.7.13 软件包的安装
- 我的第一篇CSDN博客!
- 操作系统实验——处理器调度
- HEXO搭建个人博客
- H5 打开百度和高德地图的方式
- EasyUI总结二
- linux上很方便的上传下载文件工具rz和sz
- Javascript 装载和执行
- PL/SQL 内建函数
- 求第k大
- 数据结构与算法分析笔记与总结(java实现)--数组1:二维数组中的查找