69天探索操作系统-第4天:进程调度基础--协调计算资源

222 阅读4分钟

scheduling1.avif

1.介绍

进程调度是现代操作系统的核心,决定了如何在多个竞争进程之间分配和管理计算资源。这种复杂的资源分配确保了系统的效率、响应性和公平性。

2.调度基础知识

进程调度目的

进程调度是决定哪个进程获得CPU时间、何时以及多长时间的一个关键机制。它像一个复杂的交通控制器,管理计算任务在有限硬件资源之间的流动。

核心调度职责

  • 通过确保持续执行来最大化 CPU 利用率
  • 提供公平的计算资源访问
  • 最小化交互式进程的响应时间
  • 在吞吐量和单个进程性能之间取得平衡
  • 防止进程饥饿

image.png

3.First-Come, First-Served (FCFS) 算法

算法机制

First-Come, First-Served (FCFS) 调度算法是调度方法中最简单的一种。进程按照它们到达就绪队列的顺序执行,类似于客户服务台上的先到先得排队。

FCFS 特性

  • 处理过程是顺序进行的
  • 没有优先级机制
  • 实现简单
  • 可能导致长时间等待
  • 车队效应可以显著降低整体系统的性能

性能影响

FCFS 会导致资源利用率下降,特别是在长时间运行进程后排队的较短运行时间的进程。这可能会导致平均等待时间增加和系统响应性降低。

4.调度目标

性能优化目标

  • CPU 利用率:最大限度地提高 CPU 主动处理任务的时间百分比
  • 吞吐量:每单位时间完成的最大进程数
  • 周转时间:减少进程从提交到完成的总时间
  • 等待时间:减少进程在就绪队列中等待的时间
  • 响应时间:最小化进程提交到第一次回复之间的时间间隔

5.调度标准

选择参数

  • 处理优先级
  • 计算强度
  • I/O 要求
  • 内存占用
  • 进程时间
  • 截止时间限制

6.实际应用考虑因素

调度队列类型

  • 作业队列:包含系统中的所有进程
  • 就绪队列:等待CPU执行的操作
  • 设备队列:等待I/O操作的操作

上下文切换开销

每一次调度决策都涉及上下文切换,这会消耗计算资源。高效的调度算法在保持系统响应性的同时最小化了这种开销。

7.代码示例:FCFS调度仿真

#include <stdio.h>

#define MAX_PROCESSES 10

typedef struct {
    int process_id;
    int arrival_time;
    int burst_time;
    int waiting_time;
    int turnaround_time;
} Process;

void fcfs_scheduling(Process processes[], int n) {
    int total_waiting_time = 0;
    int total_turnaround_time = 0;

    processes[0].waiting_time = 0;
    processes[0].turnaround_time = processes[0].burst_time;

    for (int i = 1; i < n; i++) {
        processes[i].waiting_time = 
            processes[i-1].waiting_time + processes[i-1].burst_time;
        
        processes[i].turnaround_time = 
            processes[i].waiting_time + processes[i].burst_time;
    }

    printf("Process\tArrival\tBurst\tWaiting\tTurnaround\n");
    
    for (int i = 0; i < n; i++) {
        total_waiting_time += processes[i].waiting_time;
        total_turnaround_time += processes[i].turnaround_time;

        printf("%d\t%d\t%d\t%d\t%d\n", 
               processes[i].process_id, 
               processes[i].arrival_time,
               processes[i].burst_time,
               processes[i].waiting_time,
               processes[i].turnaround_time);
    }

    printf("Average Waiting Time: %.2f\n", 
           (float)total_waiting_time / n);
    printf("Average Turnaround Time: %.2f\n", 
           (float)total_turnaround_time / n);
}

int main() {
    Process processes[MAX_PROCESSES] = {
        {1, 0, 10},
        {2, 1, 5},
        {3, 3, 8}
    };

    fcfs_scheduling(processes, 3);
    return 0;
}

8.编译和执行

Linux/Unix 系统

# Compile the program
gcc -o fcfs_scheduling fcfs_scheduling.c

# Run the executable
./fcfs_scheduling

9.参考资料进一步阅读

参考文献

  1. Silberschatz, A., Galvin, P. B., & Gagne, G. (2018). Operating System Concepts
  2. Tanenbaum, A. S. (2006). Modern Operating Systems

在线资源

  1. Documentation

  2. Stack Overflow Threads

  3. Stack Exchange Discussions

10.结论

进程调度代表了对计算资源管理的复杂应用。通过理解其基本机制,我们可以获得操作系统如何实现卓越效率和响应速度的了解。

关键要点

  • 调度决定了计算资源分配
  • FCFS是一种基本但基础的调度方法
  • 多重标准会影响调度决策
  • 高效调度可最小化系统开销

第5天预告:高级调度算法

Master the art of computational orchestration!