输入输出系统 — 锁、信号量与键盘驱动

tags: 操作系统, IO
@烩面 19/01/2026

《操作系统真相还原》学习笔记:互斥锁与信号量的原理、键盘输入的处理流程、环形输入缓冲区与生产者消费者模型。

为什么要有锁?

一种互斥的机制,使临界区具有原子性,避免产生竞争条件,从而避免多任务访问公共资源时出问题。

核心概念

概念说明
公共资源被所有任务共享的资源(内存、文件、硬件等)
临界区程序中访问公共资源的指令代码
互斥某一时刻公共资源只能被 1 个任务独享
竞争条件多任务以非互斥方式同时进入临界区

信号量

信号量就是个计数器,计数值是自然数,用来记录所积累信号的数量。

  • up(增加操作):信号量加 1 + 唤醒等待线程
  • down(减少操作):判断信号量是否大于 0 → 如果大于 0 则减 1,否则阻塞等待

键盘输入处理流程

每次 8048 向 8042 发扫描码的时候,8042 都会向中断代理(咱们是 8259A)发一次中断。我们的键盘中断处理程序每次都会随着键盘发出的扫描码而去执行,也就是也会收到完整的击键过程,包括键的持续按压状态。

过程:

  1. 当键位被按下(不弹起)
  2. 8048 监控哪个键位被按下,8048 把键位对应的通码(用于描述一个键按下的码,断码就是描述一个键松开的码)发送给 8042,如果不松开,那么就持续发送
  3. 8042 接收到通码后,便知道具体哪个键位被按下了,对其进行处理,接着保存通码到自己的寄存器
  4. 8042 接着向中断代理 8259A 发送中断,如果不松开,那么就持续发送中断
  5. 发生中断后,处理器执行对应的中断处理程序

键盘输入流程

环形输入缓冲区

生产者消费者问题

一个或多个生产者、一个或多个消费者共享一个固定大小的缓冲区:

  • 生产者每次放一个数据到缓冲区
  • 消费者每次从缓冲区中消费一个数据
  • 同一时刻缓冲区只能被一个生产者或消费者使用
  • 缓冲区满时生产者不能继续添加,缓冲区空时消费者不能消费

环形缓冲区