面试题答案
一键面试整体设计思路
- 数据结构设计:定义一个结构体来表示进程,包含优先级、到达时间、执行时间等属性。
- 调度算法实现:使用一个循环来不断检查是否有新进程到达。每次循环时,先筛选出已到达的进程,然后根据优先级和到达时间对这些进程进行排序。优先调度高优先级的进程,若优先级相同,则按到达时间先后调度。
- 动态加入处理:通过将新进程加入到进程列表,并在每次调度循环中重新评估进程列表来处理新进程动态加入的情况。
关键部分代码
#include <stdio.h>
#include <stdlib.h>
// 定义进程结构体
typedef struct {
int priority; // 优先级,1表示高,2表示中,3表示低
int arrival_time;
int execution_time;
} Process;
// 比较函数,用于qsort排序,先按优先级升序,优先级相同按到达时间升序
int compare(const void *a, const void *b) {
Process *processA = (Process *)a;
Process *processB = (Process *)b;
if (processA->priority != processB->priority) {
return processA->priority - processB->priority;
} else {
return processA->arrival_time - processB->arrival_time;
}
}
// 调度函数
void schedule(Process *processes, int num_processes, int current_time) {
int i, count = 0;
Process arrived_processes[num_processes];
// 筛选出已到达的进程
for (i = 0; i < num_processes; i++) {
if (processes[i].arrival_time <= current_time) {
arrived_processes[count++] = processes[i];
}
}
// 对已到达的进程进行排序
qsort(arrived_processes, count, sizeof(Process), compare);
// 调度进程
if (count > 0) {
printf("当前时间 %d 调度进程,优先级: %d,到达时间: %d,执行时间: %d\n",
current_time, arrived_processes[0].priority, arrived_processes[0].arrival_time, arrived_processes[0].execution_time);
}
}
你可以使用以下方式调用这个函数:
int main() {
Process processes[] = {
{1, 0, 3}, // 高优先级,0时刻到达,执行时间3
{2, 1, 2}, // 中优先级,1时刻到达,执行时间2
{1, 2, 4} // 高优先级,2时刻到达,执行时间4
};
int num_processes = sizeof(processes) / sizeof(processes[0]);
int current_time = 0;
// 模拟调度
while (1) {
schedule(processes, num_processes, current_time);
current_time++;
// 这里可以添加逻辑来动态添加新进程
// 例如根据一定条件创建新的Process结构体并添加到processes数组中
if (current_time > 10) break; // 简单模拟结束条件
}
return 0;
}