---- 整理自狄泰软件唐佐林老师课程
文章目录
- 1. 问题
- 1.1 生活中的示例
- 1.1.1 吃饭问题
- 1.1.2 十字路口
- 1.1.3 洗手间
- 1.1.4 生产消费者问题
- 1.2 结论
- 2. 接下来的问题
- 2.1 临界资源(Critical Resource)
- 2.2 临界区(Critical Section)
- 2.3 任务间的同步
- 2.4 任务间的互斥
- 2.5 互斥锁(Mutex)的定义
- 2.6 操作Mutex的关键函数
- 2.7 Mutex使用示例设计
- 2.8 课后扩展问题
1. 问题
- 任务之间总是完全独立毫无依赖的吗?
1.1 生活中的示例
1.1.1 吃饭问题
1.1.2 十字路口
1.1.3 洗手间
1.1.4 生产消费者问题
- 有n个生产者同时制造产品,并把产品存入仓库中
- 有m个消费者同时需要从仓库中取出产品
- 规则:
- 一次只允许一个生产者向仓库放入产品
- 一次只允许一个消费者从仓库取出产品
- 生产者和消费者不能同时进入仓库
1.2 结论
在特殊情况下,并行执行的任务之间 存在依赖
2. 接下来的问题
- 如何在操作系统中提供 任务间安全依赖的方式?
2.1 临界资源(Critical Resource)
- 每次 只允许一个任务 进行访问(读 / 写)的资源 —— 临界资源
2.2 临界区(Critical Section)
- 每次 只允许一个任务 执行的代码片段 —— 临界区
2.3 任务间的同步
同步: 在特殊情况下,控制 多个任务间的相对执行顺序
2.4 任务间的互斥
互斥:多个任务 在同一时刻都需要访问 临界资源
2.5 互斥锁(Mutex)的定义
互斥锁 是一种 特殊的状态变量(空闲状态 & 占用状态)
- 当互斥锁处于空闲状态时:
- 任务可成功获取锁并继续执行,也即访问临界资源
- 锁被任务获取后,自动转化为占用状态
- 当互斥锁处于占用状态时:
- 试图获取锁的任务会被阻塞,直到锁再次转换为空闲状态
2.6 操作Mutex的关键函数
uint CreateMutex();
创建锁,返回锁的唯一标识void DestroyMutex(uint mutex);
销毁指定标识的锁void EnterCritical(uint mutex);
当锁空闲时:获取锁并继续执行
当锁占用时:阻塞并等待锁释放void ExitCritical(uint mutex);
释放锁( 同一把锁 的获取和释放必须在同一个任务中 成对出现 )
2.7 Mutex使用示例设计
- 注意:对于指定的互斥锁,必须先获取再释放,并且获取与释放不能跨任务进行
2.8 课后扩展问题
- Mutex相关函数接口处于用户态还是内核态?
- Mutex处于占用状态时,试图获取Mutex的任务如何阻塞?
- Mutex恢复空闲状态时,如何通知阻塞的任务继续执行?
- 通过Mutex能否保证任务同步执行(即:串行执行)?