1、设计进程控制块 PCB 表结构。 2. 输入一组进程及其相关参数(包括进程名、序号、所需服务时间、优先级等)。 3. 采用至少三种调度算法,可选调度算法有上述 6 种。 4. 计算出这组进程的平均周转时间、响应时间及带权周转时间。 c语言实现
时间: 2024-02-29 22:53:10 浏览: 18
好的,我明白了您的问题。以下是我的回答:
1. 进程控制块 PCB 表结构:
```c
struct process {
char name[20]; // 进程名
int id; // 进程序号
int service_time; // 所需服务时间
int priority; // 进程优先级
int start_time; // 进程开始时间
int end_time; // 进程结束时间
int wait_time; // 进程等待时间
int turnaround_time; // 进程周转时间
float weighted_turnaround_time; // 进程带权周转时间
};
```
2. 输入一组进程及其相关参数:
```c
struct process processes[] = {
{"P1", 1, 5, 3},
{"P2", 2, 2, 2},
{"P3", 3, 4, 1},
{"P4", 4, 1, 4},
{"P5", 5, 6, 5}
};
int num_processes = sizeof(processes) / sizeof(processes[0]);
```
3. 调度算法实现:
先定义一些辅助函数:
```c
// 按照进程优先级从高到低排序
void sort_by_priority(struct process *processes, int num_processes) {
for (int i = 0; i < num_processes - 1; i++) {
for (int j = i + 1; j < num_processes; j++) {
if (processes[i].priority < processes[j].priority) {
struct process temp = processes[i];
processes[i] = processes[j];
processes[j] = temp;
}
}
}
}
// 按照进程服务时间从短到长排序
void sort_by_service_time(struct process *processes, int num_processes) {
for (int i = 0; i < num_processes - 1; i++) {
for (int j = i + 1; j < num_processes; j++) {
if (processes[i].service_time > processes[j].service_time) {
struct process temp = processes[i];
processes[i] = processes[j];
processes[j] = temp;
}
}
}
}
// 计算进程等待时间、周转时间和带权周转时间
void calculate_times(struct process *processes, int num_processes) {
int current_time = 0;
for (int i = 0; i < num_processes; i++) {
processes[i].start_time = current_time;
processes[i].wait_time = current_time;
current_time += processes[i].service_time;
processes[i].end_time = current_time;
processes[i].turnaround_time = processes[i].end_time - processes[i].start_time;
processes[i].weighted_turnaround_time = (float) processes[i].turnaround_time / processes[i].service_time;
}
}
```
然后分别实现三种调度算法:
先来看先来先服务(FCFS):
```c
void fcfs(struct process *processes, int num_processes) {
printf("FCFS:\n");
sort_by_service_time(processes, num_processes);
calculate_times(processes, num_processes);
for (int i = 0; i < num_processes; i++) {
printf("%s:\n", processes[i].name);
printf("start_time: %d, end_time: %d, wait_time: %d, turnaround_time: %d, weighted_turnaround_time: %f\n",
processes[i].start_time, processes[i].end_time, processes[i].wait_time, processes[i].turnaround_time, processes[i].weighted_turnaround_time);
}
}
```
最短作业优先(SJF):
```c
void sjf(struct process *processes, int num_processes) {
printf("SJF:\n");
sort_by_service_time(processes, num_processes);
calculate_times(processes, num_processes);
for (int i = 0; i < num_processes; i++) {
printf("%s:\n", processes[i].name);
printf("start_time: %d, end_time: %d, wait_time: %d, turnaround_time: %d, weighted_turnaround_time: %f\n",
processes[i].start_time, processes[i].end_time, processes[i].wait_time, processes[i].turnaround_time, processes[i].weighted_turnaround_time);
}
}
```
优先级调度:
```c
void priority(struct process *processes, int num_processes) {
printf("Priority:\n");
sort_by_priority(processes, num_processes);
calculate_times(processes, num_processes);
for (int i = 0; i < num_processes; i++) {
printf("%s:\n", processes[i].name);
printf("start_time: %d, end_time: %d, wait_time: %d, turnaround_time: %d, weighted_turnaround_time: %f\n",
processes[i].start_time, processes[i].end_time, processes[i].wait_time, processes[i].turnaround_time, processes[i].weighted_turnaround_time);
}
}
```
4. 计算出这组进程的平均周转时间、响应时间及带权周转时间:
```c
int total_turnaround_time = 0;
int total_wait_time = 0;
float total_weighted_turnaround_time = 0;
for (int i = 0; i < num_processes; i++) {
total_turnaround_time += processes[i].turnaround_time;
total_wait_time += processes[i].wait_time;
total_weighted_turnaround_time += processes[i].weighted_turnaround_time;
}
float avg_turnaround_time = (float) total_turnaround_time / num_processes;
float avg_wait_time = (float) total_wait_time / num_processes;
float avg_weighted_turnaround_time = total_weighted_turnaround_time / num_processes;
printf("Average turnaround time: %f\n", avg_turnaround_time);
printf("Average wait time: %f\n", avg_wait_time);
printf("Average weighted turnaround time: %f\n", avg_weighted_turnaround_time);
```
完整代码如下: