MST
星途 面试题库

面试题:C语言复杂控制结构在系统级编程中的应用

假设你正在编写一个简单的进程调度模拟器,使用C语言实现。进程具有优先级(高、中、低)、到达时间和执行时间等属性。请使用合适的控制结构(如循环、条件判断、分支等)实现一个调度算法,优先调度高优先级进程,相同优先级进程按照到达时间先后调度。要求能处理多个进程动态加入的情况,描述代码的整体设计思路并编写关键部分代码。
49.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

整体设计思路

  1. 数据结构设计:定义一个结构体来表示进程,包含优先级、到达时间、执行时间等属性。
  2. 调度算法实现:使用一个循环来不断检查是否有新进程到达。每次循环时,先筛选出已到达的进程,然后根据优先级和到达时间对这些进程进行排序。优先调度高优先级的进程,若优先级相同,则按到达时间先后调度。
  3. 动态加入处理:通过将新进程加入到进程列表,并在每次调度循环中重新评估进程列表来处理新进程动态加入的情况。

关键部分代码

#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;
}