您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第2章-嵌入式操作系统中的基本概念汇总
第2章嵌入式操作系统中的基本概念本章内容2.1前后台系统2.2调度2.3临界区2.4进程与线程2.5任务与多任务2.6任务切换2.7死锁2.8不可剥夺型内核2.9可剥夺型内核2.10可重入性2.11优先级反转2.12事件2.13互斥2.14同步2.15通信2.16对存储器的要求习题2.1前 后 台 系 统前后台系统的组成:前台和后台程序后台:是一个无限循环的应用程序,循环中调用相应的任务函数完成相应的操作,各个任务依次运行,没有调度,运行的次序不能改变。前台:是中断服务程序,处理异步事件。前后台系统适用情形:一般不复杂且实时性要求不高的小系统很适合采用前后台系统,例如微波炉、电话机、玩具等。在另外一些基于省电的应用中,由于平时微处理器处在停机状态,所有的事都靠中断服务来完成,因此也常常采用前后台系统模式。2.2调度调度:是内核的主要职责之一,它为任务分配资源和时间,决定任务运行的次序,从而使系统满足特定的性能要求。调度算法:有先来先服务(FCFS)、优先级法(Priority)、轮转法(Round-Robin)等。调度方式:有可剥夺型(占先式)和不可剥夺型(非占先式)。多数实时内核是基于优先级调度的多种方法的复合。先来先服务(FCFS)调度算法将任务按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理。优先考虑在系统中等待时间最长的作业,而不管要求运行时间的长短。轮转法(RR)过程描述:程序就绪队列往往按进程到达的时间来排序。进程调度程序总是选择就绪队列中的第一个进程,也就是说按照先来先服务原则调度,但一旦进程占用处理机则仅使用一个时间片。在使用先一个时间片后,进程还没有完成其运行,它必须释放出处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队等待再次运行。2.3临界区临界资源:任何时候都只允许一个任务访问的资源。临界区或临界段:用于访问临界资源的代码段。临界代码段不允许多个并发任务交叉执行,否则会产生严重后果,比如进入中断后的现场保护代码等。为确保临界区代码的安全执行,在进入临界区之前要关中断,而临界区代码执行完以后要立即开中断2.4进 程 与 线 程2.4.1进程的概念进程的提出:为了充分利用系统资源,提高CPU效率,采用多道程序设计技术,即指允许多个程序同时驻留计算机内存并运行。程序的并发运行:代替了原来程序的顺序运行。各个程序之间由于需要使用共享系统资源,往往存在相互制约的关系程序的活动也不再处于一个封闭的系统内,而是出现了许多新的特征,即独立性、并发性、动态性和相互制约性进程的定义:(1) E.W.Dijkstra定义:行为的一个规则叫做程序,程序在处理器上执行时所发生的活动叫做进程。(2) Madnick和Donovan定义:进程是可以与其它进程并发执行的计算部分。(3) J.H.Saltzer定义:一个进程是由伪处理机执行的一个程序。进程通常由三部分组成:程序、数据集合和进程控制块。进程具有两种属性:可拥有资源的独立单位;可以独立调度和分配的基本单位。2.4.2线程的概念需求:随着计算机技术的飞速发展,人们逐步发现进程拥有较多的资源,在创建、撤销和切换的过程中,系统为之付出的开销还是很大。办法:将进程的两个属性分离开来,由操作系统分别处理,使具有调度和分配属性的基本单元不再拥有独立的资源,使之轻装运行,而拥有独立资源的基本单位,又不频繁地进行切换。产生:20世纪80年代中期提出了比进程更小的独立运行单位——线程的概念。线程的特性:是进程中的一个实体,是CPU调度和分配的基本单位基本上不拥有资源,只拥有维持运行的最少资源(如寄存器、堆栈、程序计数器等)进程可以独立运行,同一进程可以拥有多个线程,每个线程都可以共享同一进程中的所有资源,线程可以在进程中并发执行,但不能脱离进程独立运行。•2.5任务与多任务任务:在不同的应用领域具有不同的意义,它既可以是一个独立装载的程序,也可以是全部程序中的一段。在实时操作系统中,有时会用线程或者进程来替代任务。嵌入式实时操作系统的任务:大多数嵌入式系统不具备担负面向进程操作系统的内存开销,小的微处理器也不具备支持面向进程操作系统的硬件结构——绝大多数嵌入式实时操作系统的任务都采用了线程模式。多任务:是指用户可以在同一时间内运行多个应用程序,每个应用程序就是一个任务。对于单CPU系统来说,由于CPU不能在同一时刻运行多个程序,因此多任务只是在宏观上看起来像是并发运行,而在微观上各个任务还是串联执行的。任务控制块:多任务操作系统的核心是系统调度器,它使用任务控制块(TaskControlBlock,TCB)来管理任务调度功能。TCB用来保存任务的当前状态、优先级、要等待的事件或资源、任务程序代码的起始地址、初始堆栈指针等信息。一旦任务建立,TCB就被赋值当任务的CPU使用权被剥夺时,TCB用来保存该任务的状态;当任务重新得到CPU使用权时,该任务的信息将从它的TCB中取出,放入各个寄存器中。图2.2多任务实时应用程序设计的关键:就是确定如何把问题分割成多个任务,以及如何确定每个任务的优先级和任务之间的通信。任务的状态:每个任务都是一个无限的循环,每个任务都处在休眠态、就绪态、运行态、挂起态(等待某一事件发生)和被中断态等五种状态之一。休眠态:是指任务驻留在内存中,还没有交给内核管理,不被多任务内核所调度。就绪态:是指任务已经做好了运行的准备,可以运行,但由于有更高优先级的任务正控制着CPU的使用权,因此该任务暂时还不能运行。运行态:是指任务控制了CPU的使用权,正在运行中。挂起态:也叫做等待事件态,指任务在等待某一事件的发生,例如等待某外设的I/O操作,等待某共享资源的释放,等待定时脉冲的到来,或等待超时信号的到来以结束目前的等待状态,等等。被中断态:是指发生中断时,CPU转入相应的中断服务,原来正在运行的任务暂时放弃CPU的使用权,就进入了被中断状态。2.6任务切换任务切换(ContextSwitch或者TaskSwitch)即CPU寄存器内容切换。实际上是模拟一次中断过程,从而实现CPU使用权的转移。任务栈:每个任务自己独立的堆栈,用于保存任务的当前状态和所有寄存器内容。任务切换过程:当内核决定运行另一个任务时,首先入栈,将当前任务用到的所有寄存器内容以及当前状态保存到自己的任务栈中去,然后像中断返回一样,将下一个将要运行的任务的所有寄存器内容和状态从该任务的任务栈中弹出,重新装入CPU的寄存器,任务即恢复到挂起前的状态,并开始执行。任务切换时间:任务切换所需要的时间,它取决于CPU有多少寄存器要进出堆栈。任务切换过程增加了CPU的额外负荷,CPU的内部寄存器越多,额外负荷就越重。实时内核的性能不应该以每秒钟能做多少次任务切换来评价。2.7死锁死锁:又称抱死,是指两个或者更多的任务相互等待对方占有的资源而无限期地僵持下去的局面。例如:任务A正独享资源R1,任务B正在独享资源R2,而此时任务A又要独享资源R2,任务B也要独享资源R1,于是哪个任务都无法继续执行了,死锁就发生了。产生死锁的根本原因:系统资源不足任务运行推进的顺序不合理资源分配不恰当等。死锁产生有四个必要的条件:①互斥条件,系统中某些资源只能独占使用;②非抢占条件,系统中某些资源仅能被它的占有者所释放,而不能被别的任务强行抢占;③占有并等待条件,系统中的某些任务已占有了分给它的资源,但仍然等待其它资源;④循环等待条件,系统中由若干任务形成的环形请求链,每个任务均占有若干种资源中的某一种,同时还要求(链上)下一个任务所占有的资源。死锁预防:打破产生死锁的四个必要条件中的一个或几个。预防死锁的策略:资源预先分配策略、资源有序分配策略。(1)资源预先分配策略:打破占有且申请条件,任务在运行前一次性地向系统申请它所需要的全部资源,如果所请求的全部资源得不到满足,则不分配任何资源,此任务暂不运行。(2)资源有序分配策略:打破循环等待条件,把资源事先分类编号,按序分配,使任务在申请、占用资源时不会形成环路。2.8不可剥夺型内核不可剥夺型内核:Non-PreemptiveKernel,运行的任务占有CPU的绝对使用权,若不自我放弃,准备就绪的高优先级任务不能抢占CPU的使用权。它的中断处理:正在运行的任务允许中断打入,中断服务可以使任务由挂起状态变为就绪状态,但中断服务完成以后CPU的使用权还得还给原先被中断了的任务,直到该任务主动释放CPU,准备就绪的高优先级任务才能获得使CPU的使用权。图2.3不可剥夺型内核运行示意图运行过程:(1)低优先级任务正在运行时,有一个异步事件发生,中断打入。(2)如果此时中断是开放的,则CPU进入中断服务子程序。(3)假设中断服务子程序使一个更高优先级的任务进入就绪态。(4)中断服务完成后,应用程序返回到原来被中断的任务。(5)继续执行被中断的任务,该任务完成后,调用内核服务函数释放CPU控制权。(6)准备就绪的高优先级任务获得CPU的使用权。(7)高优先级任务开始处理中断服务所标识的异步事件。不可剥夺型内核的优点:①中断响应时间快,它不像可剥夺型内核要调用内核函数通知内核进入中断服务子程序;②由于采用了优先级调度法,因此任务级响应比前后台系统快得多,任务级响应时间取决于最长的任务执行时间;③由于正在运行的任务占有CPU,而不必担心被别的任务抢占,因此在任务级,不可剥夺型内核允许使用不可重入函数。不可剥夺型内核的最大缺陷:任务响应时间慢,准备就绪的高优先级任务也许要等很久,直到当前运行着的任务释放CPU才能运行。不可剥夺型内核的任务级响应时间要优于前后台系统,但仍是不可知的。商业软件几乎没有不可剥夺型内核。2.9可剥夺型内核可剥夺型内核:一旦有更高优先级的任务准备就绪,当前正在运行的低优先级任务的CPU使用权就立即被剥夺,该任务转为就绪态或挂起态,CPU的使用权移交给那个更高优先级的任务。被中断的任务处理:如果中断服务使得一个高优先级任务准备就绪,那么中断服务完成后,被中断的任务将被挂起,高优先级的任务继续运行。图2.4可剥夺型内核运行示意图运行过程:(1)低优先级任务正在运行时,有一个异步事件发生,中断打入。(2)若此时中断是开放的,则CPU转入中断服务子程序。(3)假设中断服务子程序使一个更高优先级的任务进入就绪态。(4)中断服务完成后,应用程序不再返回到原来被中断的任务,而是执行准备就绪的高优先级任务。中断返回到哪个任务,是由一个内核函数决定的。(5)高优先级任务开始处理中断服务子程序所标识的异步事件。(6)高优先级任务执行完毕以后挂起,内核进行任务切换。(7)若此时没有比原来被中断的那个任务优先级更高的任务准备就绪,则被中断的任务将重新获得CPU的使用权;若有更高优先级的任务准备就绪,那么CPU将运行这个更高优先级的任务。可剥夺型内核的优势:CPU的使用权是可预测的和可确定的,可使任务级响应得以优化。使用可剥夺型内核时要注意:应用程序最好不要直接使用不可重入型函数;若确需使用不可重入型函数,则可用互斥条件来保护,这可以用互斥型信号量来实现。μC/OS-Ⅱ以及绝大多数商业实时内核都是可剥夺型内核。2.10可重入性可重入(Reentrant)型函数:是指可以被多个任务并发使用,而数据不会遭到破坏的函数。可重入型函数特征:只使用局部变量,变量保存在CPU寄存器或堆栈中,可以在任意时刻被中断,再重新恢复运行时,数据不会被破坏;若使用全局变量,则需满足互斥条件。可重入型函数实例程序清单2.1可重入型函数实例voidfunc1(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}程序清单2.2不可重入型函数清单staticinttemp;voidfunc2(int*x,int*y){temp=*x;*x=*y;*y=te
本文标题:第2章-嵌入式操作系统中的基本概念汇总
链接地址:https://www.777doc.com/doc-4574023 .html