本章主要讲述了锁、缓冲区、与键盘的交互控制。
基本概念
本章涉及的基本概念如下:
- 公共资源:所有任务共享的一套资源
- 临界区:访问公共资源的指令代码组成的区域
- 互斥:公共资源在任意时刻只能被一个任务访问,即只能有一个任务在自己的临界区中执行。
- 竞争条件:多个任务以非互斥的方式同时进入凝结去
- 信号量:就是一个整形变量,可以被增加或减少
- 信号量的增加和减少都必须是原子性的
- 锁:就是一个二进制信号量,值为0表示上锁了不能访问,为1表示可以访问。
- 阻塞:由线程自己发起,被加入阻塞(all)队列中
- 唤醒:由另一个线程唤A醒某个线程B(线程无法唤醒自己),将线程B加入到就绪队列中
- 键盘驱动:把由键盘传给CPU的通码或者断码翻译成ASCII码的程序
- 环形输入缓冲区:环形队列,一头写另一头读
- 生产者消费者模型:两(多)个线程,对同一个缓存区进行读写,加锁访问即可。
实现
thread_block(): 阻塞线程:就是让线程状态为阻塞态,并且schedule,(原子操作)
thread_unblock() 释放线程:就是改状态为TASK_READY,并加入到就绪队列中,(原子操作)
作者在最后用显示器环形缓存队列实现了消费者,生产者模型,在判断队列是否为空时必须关中断 ,在这模型中关键的点就是:每个线程执行临界区时,必须得是原子操作
这一篇代码实现都没有什么太大的亮点
执行结果
- 直接写满了缓冲区
- 消费者、生产者模型