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

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

先来先服务和优先数调度算法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; // 进程ID
int 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. 算法原理
优先数调度算法是一种非抢占式的进程调度算法。

每个进程都有一个
优先级,优先级越高的进程越先被处理。

当两个进程的优先级相同时,采用FCFS算法。

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

3. C语言实现
下面是一个简单的优先数调度程序:
```c
#include <stdio.h>
struct process {
int pid; // 进程ID
int arrival_time; // 到达时间
int burst_time; // 执行时间
int priority; // 优先级
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);
printf("优先级:");
scanf("%d", &p[i].priority);
}
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;
} else if (p[j].arrival_time == p[j + 1].arrival_time && p[j].priority > p[j + 1].priority) {
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优先级\t等待时间\n");
for (i = 0; i < n; i++) {
printf("%d\t%d\t%d\t%d\t%d\n",
p[i].pid,
p[i].arrival_time,
p[i].burst_time,
p[i].priority,
p[i].waiting_time);
avg_waiting_time += (float)p[i].waiting_time / n;
}
printf("平均等待时间:%f\n", avg_waiting_time);
return 0;
}
```
四、总结
本文介绍了两种常见的进程调度算法:先来先服务和优先数调度算法,并给出了相应的C语言实现。

在实际应用中,根据不同的场景选择不
同的进程调度算法可以提高系统性能和用户体验。

相关文档
最新文档