---- 整理自狄泰软件唐佐林老师课程
文章目录
- 1. 问题
- 2. 系统调用重设计
- 2.1 互斥锁系统调用功能设计
- 2.2 整体调用流程
- 2.3 编程实验:互斥锁模块的创建
- 2.4 思考
- 3. 在内核态实现互斥锁功能的考虑
- 3.1 互斥锁内核数据结构及接口实现
- 3.1.1 创建互斥锁
- 3.1.2 销毁互斥锁
- 3.1.3 进入临界区
- 3.1.4 退出临界区
- 3.2 编程实验:互斥锁的内核实现
- 3.3 思考
- 3.4 问题
- 3.5 再论任务状态
- 3.6 互斥锁与任务调度
- 3.6.1 互斥锁与任务调度一
- 3.6.2 互斥锁与任务调度二
- 3.6.3 互斥锁与任务调度三
- 3.7 编程实验:互斥锁与任务调度
- 3.8 思考
1. 问题
- Mutex相关的函数接口处于用户态还是内核态?
- 处于 内核态
- 为什么?
- Mutex操作可能导致任务状态的转换(执行态==>阻塞态),其功能只能由内核实现。
- 所以,必须在用户态使用内核中的功能。==> 通过 系统调用
2. 系统调用重设计
2.1 互斥锁系统调用功能设计
void SysCallHandler(uint type, // 中断功能号
uint cmd, // 子功能号
uint param1,
uint param2);
2.2 整体调用流程
- D.T.OS架构图
2.3 编程实验:互斥锁模块的创建
【参看链接】:62-63-64 - 进程互斥锁的初步实现 / 62
2.4 思考
- 在内核中实现互斥锁的功能是必要的吗?
3. 在内核态实现互斥锁功能的考虑
- 进入内核态之后所有任务均 暂停执行
- 直观的决定当前任务是否能进入临界区(True or False)
- Mutex空闲状态 ==> True:返回用户态,当前任务继续执行
- Mutex占用状态 ==> False:当前任务进入阻塞状态,调度下一个任务执行
- 内核拥有最高特权级,能够决定任务的生死
3.1 互斥锁内核数据结构及接口实现
设计思想:通过内核链表管理Mutex变量,只有链表中的Mutex变量才能完成任务间的互斥
3.1.1 创建互斥锁
3.1.2 销毁互斥锁
3.1.3 进入临界区
3.1.4 退出临界区
3.2 编程实验:互斥锁的内核实现
【参看链接】:62-63-64 - 进程互斥锁Mutex的初步实现 / 63
3.3 思考
- 在当前实现下,阻塞的多个任务重新进入执行态,会发生什么?
3.4 问题
- 内核中如何实现任务的阻塞?
3.5 再论任务状态
由互斥锁触发的内核操作:
- 当任务获取锁失败时:
- 将当前任务移入等待队列(进入阻塞态)
- 调度下一个任务执行
- 当互斥锁被标记为空闲时:
- 将等待队列中的任务移入就绪队列(脱离阻塞态)
3.6 互斥锁与任务调度
MtxSchedule:
- 调度当前任务进入等待队列
- 将等待队列中的任务调度进就绪队列
3.6.1 互斥锁与任务调度一
3.6.2 互斥锁与任务调度二
3.6.3 互斥锁与任务调度三
3.7 编程实验:互斥锁与任务调度
【参看链接】:62-63-64 - 进程互斥锁Mutex的初步实现 / 64
3.8 思考
- 目前互斥锁的设计实现上,有需要改进优化的地方吗?