输入输出系统 — 锁、信号量与键盘驱动
tags: 操作系统, IO@烩面
《操作系统真相还原》学习笔记:互斥锁与信号量的原理、键盘输入的处理流程、环形输入缓冲区与生产者消费者模型。
为什么要有锁?
一种互斥的机制,使临界区具有原子性,避免产生竞争条件,从而避免多任务访问公共资源时出问题。
核心概念
| 概念 | 说明 |
|---|---|
| 公共资源 | 被所有任务共享的资源(内存、文件、硬件等) |
| 临界区 | 程序中访问公共资源的指令代码 |
| 互斥 | 某一时刻公共资源只能被 1 个任务独享 |
| 竞争条件 | 多任务以非互斥方式同时进入临界区 |
信号量
信号量就是个计数器,计数值是自然数,用来记录所积累信号的数量。
- up(增加操作):信号量加 1 + 唤醒等待线程
- down(减少操作):判断信号量是否大于 0 → 如果大于 0 则减 1,否则阻塞等待
键盘输入处理流程
每次 8048 向 8042 发扫描码的时候,8042 都会向中断代理(咱们是 8259A)发一次中断。我们的键盘中断处理程序每次都会随着键盘发出的扫描码而去执行,也就是也会收到完整的击键过程,包括键的持续按压状态。
过程:
- 当键位被按下(不弹起)
- 8048 监控哪个键位被按下,8048 把键位对应的通码(用于描述一个键按下的码,断码就是描述一个键松开的码)发送给 8042,如果不松开,那么就持续发送
- 8042 接收到通码后,便知道具体哪个键位被按下了,对其进行处理,接着保存通码到自己的寄存器
- 8042 接着向中断代理 8259A 发送中断,如果不松开,那么就持续发送中断
- 发生中断后,处理器执行对应的中断处理程序

环形输入缓冲区
生产者消费者问题
一个或多个生产者、一个或多个消费者共享一个固定大小的缓冲区:
- 生产者每次放一个数据到缓冲区
- 消费者每次从缓冲区中消费一个数据
- 同一时刻缓冲区只能被一个生产者或消费者使用
- 缓冲区满时生产者不能继续添加,缓冲区空时消费者不能消费
