当前位置:首页 > C > 正文

深入理解CPU调度算法(用C语言实现常见调度策略)

在操作系统中,CPU调度算法是核心组成部分之一。它决定了哪个进程在何时获得CPU资源,直接影响系统性能和用户体验。本教程将带你从零开始,使用C语言实现几种经典的CPU调度算法,即使你是编程小白也能轻松上手!

深入理解CPU调度算法(用C语言实现常见调度策略) C语言 CPU调度算法 操作系统 进程调度 第1张

什么是CPU调度?

当多个程序(或进程)同时运行时,CPU需要在它们之间切换执行。这个过程就叫进程调度。操作系统通过调度算法决定下一个要执行的进程。

常见的调度算法包括:

  • 先来先服务(FCFS)
  • 最短作业优先(SJF)
  • 时间片轮转(Round Robin)
  • 优先级调度(Priority Scheduling)

准备工作:定义进程结构体

在C语言中,我们可以用结构体表示一个进程。下面是一个通用的进程结构:

struct Process {    int pid;         // 进程ID    int burst_time;  // 执行所需时间(CPU突发时间)    int arrival_time;// 到达时间    int priority;    // 优先级(数值越小优先级越高)    int remaining_time; // 剩余执行时间(用于时间片轮转)};

示例1:先来先服务(FCFS)算法

FCFS是最简单的调度算法:谁先来,谁先执行。我们按到达时间对进程排序即可。

#include <stdio.h>#include <stdlib.h>// 按到达时间排序(冒泡排序,简单易懂)void fcfs_sort(struct Process proc[], int n) {    for (int i = 0; i < n - 1; i++) {        for (int j = 0; j < n - i - 1; j++) {            if (proc[j].arrival_time > proc[j+1].arrival_time) {                struct Process temp = proc[j];                proc[j] = proc[j+1];                proc[j+1] = temp;            }        }    }}// 计算平均等待时间和周转时间void calculate_times(struct Process proc[], int n) {    int waiting_time = 0;    int total_waiting = 0;    int total_turnaround = 0;    for (int i = 0; i < n; i++) {        if (i == 0) {            waiting_time = 0;        } else {            waiting_time = proc[i-1].burst_time + proc[i-1].arrival_time - proc[i].arrival_time;            if (waiting_time < 0) waiting_time = 0;        }        int turnaround_time = waiting_time + proc[i].burst_time;        total_waiting += waiting_time;        total_turnaround += turnaround_time;        printf("进程 %d: 等待时间 = %d, 周转时间 = %d\n",                proc[i].pid, waiting_time, turnaround_time);    }    printf("平均等待时间: %.2f\n", (float)total_waiting / n);    printf("平均周转时间: %.2f\n", (float)total_turnaround / n);}

示例2:时间片轮转(Round Robin)算法

时间片轮转适合多用户系统。每个进程轮流执行一个固定时间(时间片),若未完成则放回队尾。

#include <stdio.h>#define MAX_PROCESSES 10void round_robin(struct Process proc[], int n, int time_quantum) {    int remaining_time[MAX_PROCESSES];    for (int i = 0; i < n; i++) {        remaining_time[i] = proc[i].burst_time;    }    int current_time = 0;    int completed = 0;    while (completed < n) {        int executed = 0;        for (int i = 0; i < n; i++) {            if (remaining_time[i] > 0 && proc[i].arrival_time <= current_time) {                executed = 1;                if (remaining_time[i] > time_quantum) {                    current_time += time_quantum;                    remaining_time[i] -= time_quantum;                } else {                    current_time += remaining_time[i];                    remaining_time[i] = 0;                    completed++;                    printf("进程 %d 在时间 %d 完成\n", proc[i].pid, current_time);                }            }        }        if (!executed) current_time++; // 若无进程可执行,推进时间    }}

为什么学习这些很重要?

掌握C语言实现的CPU调度算法,不仅能帮助你理解操作系统底层原理,还能提升你的编程能力和算法思维。无论你是学生、自学者还是准备面试的开发者,这些知识都非常实用。

结语

通过本文,你已经学会了如何用C语言实现基本的进程调度算法。建议你动手敲一遍代码,修改参数观察结果,加深理解。后续还可以尝试实现更复杂的调度策略,如多级反馈队列(MLFQ)等。

记住:理论结合实践,才是掌握技术的最佳路径!