先来先服务算法、短作业优先算法、以及基于优先数的调度算法结论分析
时间: 2023-12-22 22:06:38 浏览: 41
先来先服务算法(First Come First Served,FCFS)是一种简单的调度算法,即按照任务到达的先后顺序进行调度。优点是简单易行,实现容易,缺点是无法处理短作业和长作业的混合调度,容易导致长作业占用 CPU 时间过久,降低系统的响应速度。
短作业优先算法(Shortest Job First,SJF)是一种优先调度算法,即按照任务的执行时间长度进行调度,执行时间短的任务优先执行。优点是能够最大限度地提高系统的吞吐量,缺点是容易出现“饥饿现象”,即长作业得不到调度,导致长时间等待。
基于优先数的调度算法(Priority Scheduling)是一种根据任务的优先级进行调度的算法,即优先级高的任务优先执行。优点是能够使得重要任务得到及时响应,缺点是可能出现优先级反转问题,即优先级低的任务一直无法得到执行。
综上所述,不同的调度算法各有优缺点,需要根据具体的应用场景选择合适的算法。例如,对于 CPU 资源较为紧缺的系统,可以选择短作业优先算法或者基于优先数的调度算法;对于响应时间要求较高的系统,可以选择先来先服务算法或者基于优先数的调度算法。
相关问题
用C实现先来先服务调度算法和短作业优先调度算法
先来先服务调度算法(FCFS)的实现:
```c
#include <stdio.h>
// 进程控制块
typedef struct {
int id; // 进程编号
int arrival; // 进程到达时间
int burst; // 进程运行时间
} PCB;
// 进程队列
typedef struct {
PCB p[10]; // 进程数组
int front; // 队首指针
int rear; // 队尾指针
int size; // 队列大小
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = 0;
q->rear = -1;
q->size = 0;
}
// 入队
void enqueue(Queue *q, PCB pcb) {
q->rear++;
q->p[q->rear] = pcb;
q->size++;
}
// 出队
PCB dequeue(Queue *q) {
PCB pcb = q->p[q->front];
q->front++;
q->size--;
return pcb;
}
// 先来先服务调度算法
void fcfs(Queue q) {
int time = 0; // 系统时间
int i;
PCB pcb;
for (i = 0; i < q.size; i++) {
pcb = dequeue(&q);
// 等待时间 = 当前系统时间 - 进程到达时间
int wait_time = time - pcb.arrival;
// 完成时间 = 当前系统时间 + 进程运行时间
int finish_time = time + pcb.burst;
// 周转时间 = 完成时间 - 进程到达时间
int turnaround_time = finish_time - pcb.arrival;
// 打印进程信息
printf("Process %d:\n", pcb.id);
printf("Arrival Time: %d\n", pcb.arrival);
printf("Burst Time: %d\n", pcb.burst);
printf("Wait Time: %d\n", wait_time);
printf("Finish Time: %d\n", finish_time);
printf("Turnaround Time: %d\n", turnaround_time);
// 更新系统时间
time = finish_time;
}
}
int main() {
Queue q;
initQueue(&q);
PCB p1 = {1, 0, 6};
PCB p2 = {2, 3, 2};
PCB p3 = {3, 5, 1};
enqueue(&q, p1);
enqueue(&q, p2);
enqueue(&q, p3);
fcfs(q);
return 0;
}
```
短作业优先调度算法(SJF)的实现:
```c
#include <stdio.h>
// 进程控制块
typedef struct {
int id; // 进程编号
int arrival; // 进程到达时间
int burst; // 进程运行时间
} PCB;
// 进程队列
typedef struct {
PCB p[10]; // 进程数组
int front; // 队首指针
int rear; // 队尾指针
int size; // 队列大小
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = 0;
q->rear = -1;
q->size = 0;
}
// 入队
void enqueue(Queue *q, PCB pcb) {
q->rear++;
q->p[q->rear] = pcb;
q->size++;
}
// 出队
PCB dequeue(Queue *q) {
int i, j;
PCB pcb = q->p[q->front];
// 将队列中剩余进程按运行时间升序排序
for (i = q->front+1; i <= q->rear; i++) {
PCB temp = q->p[i];
for (j = i-1; j >= q->front && temp.burst < q->p[j].burst; j--) {
q->p[j+1] = q->p[j];
}
q->p[j+1] = temp;
}
q->front++;
q->size--;
return pcb;
}
// 短作业优先调度算法
void sjf(Queue q) {
int time = 0; // 系统时间
int i;
PCB pcb;
for (i = 0; i < q.size; i++) {
pcb = dequeue(&q);
// 等待时间 = 当前系统时间 - 进程到达时间
int wait_time = time - pcb.arrival;
// 完成时间 = 当前系统时间 + 进程运行时间
int finish_time = time + pcb.burst;
// 周转时间 = 完成时间 - 进程到达时间
int turnaround_time = finish_time - pcb.arrival;
// 打印进程信息
printf("Process %d:\n", pcb.id);
printf("Arrival Time: %d\n", pcb.arrival);
printf("Burst Time: %d\n", pcb.burst);
printf("Wait Time: %d\n", wait_time);
printf("Finish Time: %d\n", finish_time);
printf("Turnaround Time: %d\n", turnaround_time);
// 更新系统时间
time = finish_time;
}
}
int main() {
Queue q;
initQueue(&q);
PCB p1 = {1, 0, 6};
PCB p2 = {2, 3, 2};
PCB p3 = {3, 5, 1};
enqueue(&q, p1);
enqueue(&q, p2);
enqueue(&q, p3);
sjf(q);
return 0;
}
```
先来先服务和短作业优先调度算法代码
以下是先来先服务(FCFS)和短作业优先(SJF)调度算法的代码示例:
先来先服务(FCFS)调度算法:
```python
# FCFS调度算法
def fcfs(processes):
n = len(processes)
# 按照到达时间进行升序排序
processes = sorted(processes, key=lambda x: x[0])
# 计算等待时间和周转时间
waiting_time, turnaround_time = [0] * n, [0] * n
for i in range(1, n):
waiting_time[i] = waiting_time[i - 1] + processes[i - 1][1]
for i in range(n):
turnaround_time[i] = waiting_time[i] + processes[i][1]
# 计算平均等待时间和平均周转时间
avg_waiting_time = sum(waiting_time) / n
avg_turnaround_time = sum(turnaround_time) / n
# 返回结果
return avg_waiting_time, avg_turnaround_time
```
短作业优先(SJF)调度算法:
```python
# SJF调度算法
def sjf(processes):
n = len(processes)
# 按照到达时间进行升序排序
processes = sorted(processes, key=lambda x: x[0])
# 初始化等待时间和周转时间
waiting_time, turnaround_time = [0] * n, [0] * n
# 记录已经运行的时间
run_time = 0
# 记录已经完成的进程数
completed = 0
# 循环运行进程
while completed < n:
# 找到所有已经到达的进程
arrived_processes = [process for process in processes if process[0] <= run_time and process[3] == 0]
if not arrived_processes:
# 如果当前没有进程到达,则时间加1
run_time += 1
continue
# 找到运行时间最短的进程
shortest_process = min(arrived_processes, key=lambda x: x[1])
# 更新等待时间和周转时间
index = processes.index(shortest_process)
waiting_time[index] = run_time - shortest_process[0]
turnaround_time[index] = waiting_time[index] + shortest_process[1]
# 更新已经运行的时间和完成的进程数
run_time += shortest_process[1]
completed += 1
# 标记已经完成的进程
processes[index][3] = 1
# 计算平均等待时间和平均周转时间
avg_waiting_time = sum(waiting_time) / n
avg_turnaround_time = sum(turnaround_time) / n
# 返回结果
return avg_waiting_time, avg_turnaround_time
```
以上两个算法都是使用Python语言编写的。其中,`processes`是一个列表,表示进程的信息。每个进程由四个元素组成,依次为到达时间、运行时间、优先级(如果是SJF算法,优先级为运行时间)和完成标志(0表示未完成,1表示已完成)。这两个算法的返回值都是平均等待时间和平均周转时间。