---- 整理自狄泰软件唐佐林老师课程
查看所有文章链接:(更新中)深入浅出操作系统 - 目录
文章目录
1. 当前进程创建方案
Task模块(内核)直接调用 App模块(应用)中的函数,获取创建任务所需要的数据信息
1.1 当前方案的缺陷
- 可创建的 任务总数有限(最多16个)
- 应用程序入口函数 AppMain()在内核态被调用
- 内核为了创建任务 必须直接调用应用层函数
- 使用RegApp()动态创建任务 存在临界资源竞争问题
1.2 缺陷分析
2. 优化设计思路
- 将 AppMain() 作为任务入口函数调用(第1个用户任务)
- 将 RegApp() 实现为 系统调用(无需用户态全局变量支持)
- 在内核中 增加 gAppToRun队列,保存需要执行的应用信息
- RegApp()系统调用将应用信息保存到gAppToRun队列
- 内核Task模块根据gAppToRun队列中的信息创建任务
2.1 深入理解程序(App)与任务(Task)
- 程序是静态的代码,仅占用存储空间,不一定被执行
- 任务是程序的一次执行,占用处理器资源和内存资源
- 一个任务通常只对应一个程序(可能涉及多个程序)
- 一个程序可以被用于创建多个任务
2.2 优化设计实现
2.3 编程实验:进程创建的优化设计 - 创建AppMain任务
2.4 动态任务创建:完成RegApp()系统调用实现
2.4.1 RegApp()系统调用的实现
2.4.2 AppInfoToRun()内核函数的实现
2.4.3 编程实验:RegApp()系统调用实现
【参看链接】:69-70 - 进程创建的优化设计 / 70 / 00优化设计
3. 再论生产者消费者问题
- 为什么是ProducerA创建互斥锁和做相关初始化?
- ProducerA创建的互斥锁谁负责销毁?
3.1 一种多任务程序设计模式
3.2 编程实验:示例重构
【参看链接】:69-70 - 进程创建的优化设计 / 70 / 01示例重构
- RunDemo1()
- RunDemo2()
4. 小结
- 应用层入口函数需要在用户态被调用
- 应用与内核的交互模式是:应用请求内核提供所需功能
- 任务通过系统调用RegApp() 启动新任务执行
- 程序是静态的代码,任务是动态的执行,两者不同
- 通过等待机制可实现多任务程序设计模式