C语言编程模拟实现进程调度算法 (FCFS与SPF算法) (1)设计一个具有n(5≦n≦10)个并发进程的进程调度程序。每个进程用一个进程控制块(PCB)表示并作为管理的依据,采用结构体类型即可。进程控制块一般包含下列信息:进程名,进程到达时间、进程要求服务的时间,还需占用CPU的时间、进程优先级数以及进程的状态等。具体参数可以根据调度算法的不同进行增删,或者设计成一个通用的PCB。 (2)调度程序应包含两种不同的调度算法:FCFS和SPF调度算法。运行时,可由用户通过终端任选一种,以便进行各种算法的分析比较。 (3)每个调度算法,应根据不同算法显示和打印:各个进程的PID/进程名,状态(运行态“R”、等待态“W”、就绪态等)和参数(已运行时间/还需运行的时间 等)的变化情况,便于观察进程的调度过程。 (4)所有进程结束后,要打印输出各进程的执行次序,各进程的完成时间,各进程的周转时间及带权周转时间等参数指标,最后计算平均周转时间和平均带权周转时间。
时间: 2024-02-06 08:12:03 浏览: 86
设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。 模拟调度程序可任选两种调度算法之一实现(有能力的同学可同时实现两个调度算法)。 程序执行中
5星 · 资源好评率100%
好的,以下是C语言编程模拟实现进程调度算法(FCFS与SPF算法)的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PROCESS_NUM 10 // 最大进程数
#define MAX_PROCESS_NAME_LENGTH 10 // 进程名最大长度
// 进程状态
typedef enum {
READY,
RUNNING,
WAITING,
FINISHED
} ProcessStatus;
// 进程控制块
typedef struct {
char name[MAX_PROCESS_NAME_LENGTH]; // 进程名
int arriveTime; // 到达时间
int serviceTime; // 服务时间
int remainingTime; // 剩余服务时间
int priority; // 优先级
ProcessStatus status; // 状态
int startTime; // 开始时间
int finishTime; // 结束时间
int turnaroundTime; // 周转时间
float weightedTurnaroundTime; // 带权周转时间
} PCB;
// 进程数组
PCB processes[MAX_PROCESS_NUM];
// 进程数
int processNum;
// FCFS调度算法
void fcfs() {
printf("FCFS调度算法\n\n");
int i;
int curTime = 0;
int finishedNum = 0; // 已完成进程数
// 按到达时间排序
for (i = 0; i < processNum; i++) {
int j;
for (j = 0; j < processNum - i - 1; j++) {
if (processes[j].arriveTime > processes[j + 1].arriveTime) {
PCB tmp = processes[j];
processes[j] = processes[j + 1];
processes[j + 1] = tmp;
}
}
}
// 执行进程
while (finishedNum < processNum) {
for (i = 0; i < processNum; i++) {
PCB* p = &processes[i];
if (p->status == READY) {
p->status = RUNNING;
p->startTime = curTime;
}
if (p->status == RUNNING) {
p->remainingTime--;
curTime++;
if (p->remainingTime == 0) {
p->status = FINISHED;
p->finishTime = curTime;
p->turnaroundTime = p->finishTime - p->arriveTime;
p->weightedTurnaroundTime = (float)p->turnaroundTime / p->serviceTime;
finishedNum++;
}
}
}
}
}
// SPF调度算法
void spf() {
printf("SPF调度算法\n\n");
int curTime = 0;
int finishedNum = 0; // 已完成进程数
int minRemainingTime; // 剩余服务时间最小值
int minProcessIndex; // 剩余服务时间最小的进程下标
// 按到达时间排序
int i;
for (i = 0; i < processNum; i++) {
int j;
for (j = 0; j < processNum - i - 1; j++) {
if (processes[j].arriveTime > processes[j + 1].arriveTime) {
PCB tmp = processes[j];
processes[j] = processes[j + 1];
processes[j + 1] = tmp;
}
}
}
// 执行进程
while (finishedNum < processNum) {
minRemainingTime = 9999; // 初始化为一个较大的值
minProcessIndex = -1;
for (i = 0; i < processNum; i++) {
PCB* p = &processes[i];
if (p->status == READY && p->remainingTime < minRemainingTime) {
minRemainingTime = p->remainingTime;
minProcessIndex = i;
}
}
if (minProcessIndex != -1) {
PCB* p = &processes[minProcessIndex];
p->status = RUNNING;
p->startTime = curTime;
p->remainingTime--;
curTime++;
if (p->remainingTime == 0) {
p->status = FINISHED;
p->finishTime = curTime;
p->turnaroundTime = p->finishTime - p->arriveTime;
p->weightedTurnaroundTime = (float)p->turnaroundTime / p->serviceTime;
finishedNum++;
}
} else {
curTime++;
}
}
}
// 打印进程信息
void printProcesses() {
int i;
printf("PID\tName\tArrive\tService\tPriority\tStatus\tStart\tFinish\tTurnaround\tWeighted Turnaround\n");
for (i = 0; i < processNum; i++) {
PCB* p = &processes[i];
printf("%d\t%s\t%d\t%d\t%d\t\t", i + 1, p->name, p->arriveTime, p->serviceTime, p->priority);
switch (p->status) {
case READY:
printf("R\t");
break;
case RUNNING:
printf("E\t");
break;
case WAITING:
printf("W\t");
break;
case FINISHED:
printf("F\t");
break;
}
printf("%d\t%d\t%d\t\t%.2f\n", p->startTime, p->finishTime, p->turnaroundTime, p->weightedTurnaroundTime);
}
printf("\n");
}
// 计算平均周转时间和平均带权周转时间
void printStatistics() {
int i;
int totalTurnaroundTime = 0;
float totalWeightedTurnaroundTime = 0;
for (i = 0; i < processNum; i++) {
PCB* p = &processes[i];
totalTurnaroundTime += p->turnaroundTime;
totalWeightedTurnaroundTime += p->weightedTurnaroundTime;
}
float avgTurnaroundTime = (float)totalTurnaroundTime / processNum;
float avgWeightedTurnaroundTime = totalWeightedTurnaroundTime / processNum;
printf("平均周转时间: %.2f\n", avgTurnaroundTime);
printf("平均带权周转时间: %.2f\n", avgWeightedTurnaroundTime);
}
int main() {
int i;
// 读入进程信息
printf("请输入进程数(5~10):");
scanf("%d", &processNum);
if (processNum < 5 || processNum > 10) {
printf("进程数超出范围\n");
return 0;
}
for (i = 0; i < processNum; i++) {
PCB* p = &processes[i];
printf("请输入进程%d的信息:\n", i + 1);
printf("进程名:");
scanf("%s", p->name);
printf("到达时间:");
scanf("%d", &p->arriveTime);
printf("服务时间:");
scanf("%d", &p->serviceTime);
printf("优先级:");
scanf("%d", &p->priority);
p->remainingTime = p->serviceTime;
p->status = READY;
printf("\n");
}
// 选择调度算法
int choice;
printf("请选择调度算法(1.FCFS 2.SPF):");
scanf("%d", &choice);
switch (choice) {
case 1:
fcfs();
break;
case 2:
spf();
break;
default:
printf("无效选择\n");
return 0;
}
// 打印进程信息和统计指标
printProcesses();
printStatistics();
return 0;
}
```
以上代码实现了FCFS和SPF调度算法,并能根据算法显示和打印各个进程的状态和参数变化情况,最后打印输出各进程的执行次序、完成时间、周转时间和带权周转时间等参数指标,同时计算平均周转时间和平均带权周转时间。
阅读全文