版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、演变,对很多人来说,多任务并行的机制是神秘的,包括很多长期在操作系统下开发应用程序的人来说也是如此。 回顾一下从普通的单任务顺序执行到多任务并行执行的演变过程,有利于打破“多任务并行”的神秘感。 其实多任务并行机制一点也不复杂,从技术上说,它就是程序流折断加现场(在操作系统里叫上下文)保护。这两部分技术不仅谈不上高深,甚至无法称其为“技术”,因为几乎每个开发者每天都在跟它们打交道:比较中断响应、调子程序。 那么它到底神秘在哪里呢?在于程序流反向控制机制,所谓程序流反向控制指的是,由子函数决定父函数的执行流程。对于通常的程序来说,总是由父函数决定何时调用哪一个子函数的;而在并行多任务系统里,是由
2、一个被称为任务调度器的子函数决定着何时调用哪一个父函数! 需要澄清一点是,这种子函数对父函数的调用并不是任意的,它只能将流程指向父函数的折断点,也就是最近一次调用任务调度器时的位置。原因很简单,因为子函数根本不知道应该从父函数的哪个地方开始执行,除非它保存了父函数在折断时的上下文。 这种“由任务调度器保存任务流程折断点信息(上下文),并在将来某个时间恢复该上下文,然后继续该任务流程”的方式,就是多任务并行的核心机制。 如何在子函数中修改父函数的执行流程?修改堆栈!,键盘扫描,显示扫描,主程序,最简单的顺序执行方式,挨个调用任务,执行完一个任务后再执行下一个任务。 如果一个任务长时间占用CPU,
3、那么其它任务对外部事件的响应全部停止。,主程序,显示扫描片段1,显示扫描片段2,显示扫描片段3,显示扫描片段4,延时处1,键盘扫描,延时处2,延时处3,延时处4,改进 将浪费的时间利用起来,仔细观察可发现,其实任务并非一直运行,大部分时间是在延时.如果将任务从延时处折断,分拆成小片段后插入到另一个任务中,取代原有的延时程序,就可以提高系统资源的利用率.,键盘扫描片段1,主程序,显示扫描片段1,键盘扫描片段2,显示扫描片段2,键盘扫描片段n,显示扫描片段n,再改进 统一调度任务片段,改由主程序来调度各任务片段.此时任务只剩下逻辑上的概念,而不存在完整的任务函数.任务函数已被分拆成若干小片. 不足
4、之处是,任务片段之间的关系是固定的.例如执行完键盘扫描任务的片段1后,必定是运行显示扫描任务的片段1.,键盘扫描片段1,主程序,继续改进 实现流程控制-状态机,在主程序与任务之间增加一个接口:任务状态控制器.主程序 只与任务的状态控制器打交道,由状态控制器负责调用任务的片段以及控制阶段的变换。 这种循环、条件转移等大尺度流程控制在状态控制器中完成、用特定编号命名每个程序流程阶段的执行方式,就是我们常说的“状态机”.,任务状态控制 Switch(task_step),键盘扫描片段2,键盘扫描片段3,显示扫描片段1,任务状态控制 Switch(task_step),显示扫描片段2,显示扫描片段2,
5、其它任务片段1,任务状态控制 Switch(task_step),其它任务片段2,其它任务片段2,状态机的优点是额外占用资源少,执行效率较高。 缺点是任务被拆得支离破碎,流程不直观。而且让任务在各个状态间跳来跳去,其实处理起来并不轻松。,状态机示例,Unsigned char ks_step = 读第1行键值; Void keyscan() switch(ks_step) case 读第1行:/省略“键值”二字 . ks_step = 读第2行; return case读第2行: ks_step =读第3行 return case读第3行: . ks_step =读第1行 return ,Un
6、signed char disp_step =输出第1个数码管; Void keyscan() switch(disp_step ) case 输出第1个 :/省略“数码管”三字 . disp_step =输出第2个; return case 输出第2个: disp_step =输出第3个 return case输出第3个: . disp_step =输出第1个 return ,Void main() while(1) keyscan(); display(); ,每次进入任务函数时只执行一个片段,然后返回,任务进度依靠状态指示器来保存。,状态指示器,每进入函数一次只执行一步即返回,让出CPU
7、给其它任务,任务调度器,键盘扫描程序,显示扫描程序,其它任务,浮出水面 任务切换点与任务调度器,任务调度器,是多任务操作系统的核心 重新将任务小片整合起来,与顺序执行不同的是,在执行完每个任务片段后,调用任务调度器释放CPU,任务调度器负责分派下一个接管CPU的任务片段。 与状态机不同的是,状态机及主程序,也就是任务调者,是主动调用者,任务片段是受调用者。而任务调度器中,任务调度者是被调用者。 这种调用关系决定了任务又可以像以前顺序流程那样写成直观的任务函数.,切换点,切换点,切换点,切换点,切换点,切换点,图中可看到,主程序已经消失,取而代之的是任务调度器。 任务执行完任务片段后到达切换点,
8、此时调用任务调度函数将该任务流折断,调度器将该任务流的堆栈保存后将CPU交给下一个任务。 当该任务下次重新获行运行机会时,只需取出之前保存的堆栈,即可从切换点处继续运行。,响应,任务调度器示例,Void keyscan() while(1) outrow(row); getkey(); task_switch(); row+; ,Void display() unsigned char cs = 0; while(1) out_cs(cs); out_data (dispbufcs); task_switch(); cs+; ,Void task_switch() 保存当前任务的堆栈 寻找下一
9、个任务 用下个任务的堆栈替换当前的堆栈 return ,任务总是从切换处继续运行。流程可以自由拆分成任意片,同样是每次只执行一步即让出CPU,但任务函数比状态机优雅多了,任务调度的核心:堆栈迁移,有任务就有程序流(PC),有程序流就需要堆栈,要折断任务流,就必须保存堆栈。每个任务都设有一个私有堆栈,用于保存任务流被折断(任务切换)时的堆栈内容。 堆栈是上下文切换时最重要的切换对象,这种对堆栈的切换叫作“堆栈迁移”。事实上,在我接下来要讲的OS里,它是唯一需要切换的部分,以后再提到。 堆栈迁移有两种方式,一种方法是(左图)使用私栈作为堆栈,发生任务切换时,只需将栈指针即可到新任务的栈顶即可。另一
10、种是(右图)使用公栈作为作堆栈,每切换一个任务,就将公栈的内容搬向私栈,并将新任务从私栈搬至公栈,然后修改栈指针指向新的栈底。,任务函数,任务堆栈,任务函数,任务堆栈,堆栈指针SP,SP在任务堆栈间切换,任务函数,任务堆栈,任务函数,任务堆栈,堆栈指针SP,公栈,SP总是指向公栈,任务切换时需在公栈与私栈间来回倒腾数据,优点:任务切换快 缺点:占内存 适用于较轻的系统中,优点:省内存 缺点:任务切换慢 适用于较重的系统中,栈指针切换VS堆栈搬移,使用栈指针切换方式的优点是堆栈迁移速度极快,移动两个字节即可完成整个迁移过程。而堆栈搬移方式则较慢,每次需搬若干字节(如果在任务的第一层函数中切换任务
11、,则需2字节,每加深一层函数增加2字节),且换入/换出的任务各需搬一次。此外,还要计算栈深/栈顶位置。整个过程约需增加4080个机器周期(1周期为1条NOP指令的执行时间)。 但使用栈指针切换方式时,由于整个运行周期都在私栈中,这就意味着需要足够深的栈来支撑调子函数/调中断/寄存器压栈等动作,即使是简单的任务,也需要812字节栈深。而使用堆栈搬移方式时,私栈只要保存从栈底到任务切换时的栈深,而跟中断和最大调子函数深度无关,一般仅24字节,分配8字节(意味着任务切换可发生在第4层函数调用中)已足够应付大多数应用。 实测数据表明,栈指针切换的方式适用于函数调用少于两层、中断期间不需寄存器压栈(或使用using保护寄存器现场)的场合中,操作系统可设计为超轻量,仅具有多任务能力,最多再加上睡眠控制。而堆栈搬移法适用于函数嵌套较深/中断程序较复杂的环境中,操作系统中可加入进程睡眠控制、CPU睡眠控制、消息唤醒
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年工业元宇宙卫星通信技术融合应用
- 电工及其电子基础 6
- 提升中长期护理服务质量
- 泌尿科患者的日常生活护理
- 眩晕护理中的多学科合作
- 义务消防队活动记录
- 椎管内麻醉术后并发症的处理流程
- 2026年医疗急救服务合同
- 2026年与干洗合同(1篇)
- 2026年民间私借合同(1篇)
- 2026年4月自考00600高级英语试题
- 2026江西省铁路航空投资集团有限公司第一批社会招聘23人笔试备考题库及答案详解
- 2026年广东省惠州市中考历史一模试卷(含答案)
- 武汉市2026届高三年级四月供题(武汉四调)语文试卷
- 2026湖南郴电国际发展股份有限公司校园招聘50人备考题库及答案详解1套
- 新疆乌鲁木齐市天山区2026年中考一模语文试题(含答案)
- TCPIA 0028.1-2024《光伏组件用玻璃 第1部分 前板减反射膜玻璃》
- 环卫专用车研发工程师考试试卷及答案
- 八年级地理下册《雪域高原·人地共生-青藏地区自然特征与河谷农业》教学设计
- 重庆南开中学2025-2026学年七年级上学期期末语文试题(含答案)(含解析)
- 2026智慧社区智能垃圾分类回收箱:技术赋能与资源利用率提升实践案例
评论
0/150
提交评论