标题:
任务的基本知识
[打印本页]
作者:
heise
时间:
2014-8-19 22:57
标题:
任务的基本知识
os:操作系统
1. 软件设计
软件可分为许多可执行程序单元
裸机开发时,将可执行程序单元分类组合,得到一个个模块,其中有一个监控模块,其他模块在它的监控下运行。
使用操作系统时,将可执行程序单元分类组合,得到一个个任务,这些任务在操作系统的调度下运行。任务指的是用户任务。区别于操作系统自己的任务。
2. os核心是用一个CPU去仿制“多CPU”环境,使每个任务觉得自己拥有独立cpu。
os给每个任务分配一个任务堆栈,用来保存“虚拟CPU”的内部各个寄存器值。
当一个任务需要运行时,os就将该任务的任务堆栈的内容复制到真正的cpu中,虚拟cpu就变成了真正的cpu,这个任务就可以运行起来。当需要暂停运行时,操作系统就将真正cpu的寄存器内容复制到它的任务堆栈中保持起来(保护现场,保护一些寄存器的值),一遍下次运行时可以恢复现场,继续运行下去。
os在保存好当前任务的现场后,就可以恢复另一个任务的现场,使另一个任务运行起来。这个过程叫:任务切换。
os 为有效进行任务调度,必须掌握各个任务的详细动态信息,所以给每个任务建立了档案,来记录这些信息,这个就是任务控制块。
3. 任务的特性
独立性
裸机的程序模块,一个模块可以调用另一个模块。信息之间传输时,主模块以实参将信息传给子模块形参,子模块以返回值形式将结果传输给主模块。相互看得见。
os环境下,一个任务独占cpu,不可能调用另一个任务,所有任务在逻辑上是平等的。当任务需要进行信息传输时,只能采用异步方式。主人任务<----->os通信机制<------>仆人任务
任务的并发性
任务A与任务B运行时间段有重叠部分,这种运行方式叫并发运行。
宏观上看,不同任务可以并发运行,好像每个任务都有自己的cpu一样。 是通过os进行任务调度实现的并发运行。os调度:
已经就绪的高优先级任务可以剥夺另一个正在运行的低优先级任务的运行权而进入运行状态
。
当低A运行时,高B就绪,B任务运行A停止运行。
任务的动态性
裸机:程序模块总是处于可执行状态,随时可调用,调用即占用cpu,直到结束。
os中,任务状态是动态变化的。任务并不是随时可以运行。而一个已经开始运行的任务并不能保证一直占有cpu的使用权,随时可能被更高优先级的任务夺取cpu的使用权。
任务的五种状态:
休眠态:任务在内存中,不被调用。
就绪态:任务已经准备好,随时可以运行,但该任务优先级比正在运行的优先级低,故暂时不能运行。
运行态:掌握cpu使用权,正在运行。
等待态:挂起态。如果正在运行的任务需要等待一段时间或者需要等待某一个事件的发生才能继续运行,则就会推出运行状态,进入等待态。交出cpu,使就绪任务中,优先级最高的任务进入运行态。(将自己从就绪表中删除,然后进行任务调度)
中断态:发生中断时,cpu执行中断服务,原来正在运行的任务暂停,进入中断态。中断服务程序结束后,被打断的任务继续运行,也可能运行刚被中断激活的更高级任务。
任务状态的转换
休眠态----创建---->就绪态
就绪态 运行态 等待态-----删除--->休眠态
就绪态-----os调度--->运行态
运行态退出情况:
A:主动退出:需要延时,或者等待某个事件发生。进入等待太
B:被动退出:一个更高优先级的处于等待态的任务满足条件进入就绪状态,(延时到,或等待的事情已经发生),则剥夺当前任务的cpu使用权,将它赶下台,进入运行态。而被赶下台的任务从运行态进入就绪态。
等待太:由运行态的任务主动进入。只要等待的目的达到(延时到,等待的事件来临),就自动退出等待状态,进入就绪状态,由os调度。
中断态--->返回-->运行态 (就绪态)
优先级最高的任务只要就绪就可以获得cpu的使用权,一点都不会被耽误
获得cpu控制权需要满足条件:
A:进入就绪态
B:所有优先级高于我的任务都已经处于等待态或休眠态。就绪表中我的优先级最高。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1