实时与嵌入式操作系统复习提纲.docx
《实时与嵌入式操作系统复习提纲.docx》由会员分享,可在线阅读,更多相关《实时与嵌入式操作系统复习提纲.docx(12页珍藏版)》请在冰豆网上搜索。
实时与嵌入式操作系统复习提纲
《实时与嵌入式操作系统》复习提纲
期末考试
●时间:
2017-6-1208:
30-10:
30
●地点:
3A204
●考试形式为开卷,允许查阅教材、参考书、作业及实验讲义。
●算法描述使用以C为基础的伪语言,可用自然语言附加说明。
编程序要求用C语言。
答题直接写在试卷上。
一、“操作系统概念”部分:
此部分内容是操作系统的基本原理。
参考书:
《操作系统概念》(Silberschatz等著)
复习范围:
1)四个主题的相关概念--进程管理与处理机调度;内存管理;文件系统;I/O管理
2)理解掌握算法或机制--包括进程调度算法、进程同步问题的算法、虚存管理中地址转换过程、页面置换算法、银行家算法(安全性算法)、磁盘调度算法
3)应用及编程--以教材中的算法和典型问题为基础,解决类似的问题或综合问题。
Linux系统下编程:
要求掌握在实验中用到的相关系统调用、库函数。
1os概述
●分时与实时操作系统:
分时系统:
把CPU的时间分成很短的时间片,将一台计算机提供给多个用户同时使用。
响应时间几乎不受时间片的限制。
进程总运行时间不受时间片的控制,也不受用户数的限制,只有周转时间受用户数限制。
实时系统:
是指系统能及时响应外部事件的请求,在规定时间内完成对该事件的处理,并控制所有实时任务协调一致的运行。
计算机对于外来信息能够以足够快的速度进行处理,并在被控对象允许的时间范围内做出快速反应。
交互作用能力较差。
●系统调用:
提供进程与操作系统之间的接口;向操作系统传递参数通常用三种方法:
1通过寄存器来传递参数;参数数量可能会比寄存器多;2将参数存放在内存的块或表中,并将块的地址作为参数传递给寄存器指针;3将参数放在堆栈中,并通过操作系统弹出堆栈,不限制所传递参数的数量或长度。
●os的结构:
单体、层次、微内核、模块化
2进程管理与处理机调度(重点难点:
进程同步与通信、死锁问题)
●进程的三种基本状态:
1就绪状态:
进程已分配到除CPU以外的所有必要资源后,只有再获得CPU便可立即执行。
2执行状态:
进程已获得CPU,其程序正在执行。
3阻塞状态:
进程的执行受到阻塞。
●进程控制块(PCB)的作用:
是使一个在多道程序环境下不能独立运行的程序含数据,成为一个能独立运行的基本单位,一个与其他进程并发执行的进程。
在进程的整个生命期中,系统总是通过PCB对进程控制的,PCB是进程存在的唯一标志。
●进程同步:
主要任务是对多个相关进程在执行次序上进行协调,以致并发执行的诸进程之间能有效的共享资源和相互合作,从而使程序的执行具有可再现行。
了解经典进程同步问题和这些问题模型的应用:
生产者-消费者问题、读写问题、哲学家进餐问题。
●设计同步机制应遵循的规则:
1空闲让进:
无进程处于临界区时,表明临界资源处于空闲状态,允许一个请求进入临界区的进程立即进入自己的临界区。
2忙则等待:
已有进程进入临界区因而其他试图进入临界区的进程必须等待。
3有限等待:
对要求访问临界资源的进程应保证在有限的时间内能进入自己的临界区。
4让权等待:
当进程不能进入自己的临界区时应立即释放处理机避免进程陷入忙等状态。
●记录型信号量:
信号量初值不能为负数。
在使用过程中可以为负,此时表示阻塞的个数。
值为零是表示没有阻塞。
●进程通信的3种主要类型:
共享存储器系统、消息传递系统和管道通信。
消息传递通信的实现方法:
直接通信方式和间接通信方式;直接通信方式提供两条通信命令:
Send(Receiver,message);发送一个消息给接收进程。
Receiver(Sender,message);接收Sender送来的消息;间接通信方式:
指进程之间的通信需要通过作为共享数据结构的实体。
在利用信箱通信时,在发送进程和接受进程之间存在以下四种关系:
1一对一关系2多对一关系3一对多关系4多对多关系;
●调度:
在传统的操作中,作为拥有资源的基本单位和独立调度、分派的基本单位都是进程。
而在引入线程的操作系统中,则把线程作为调度和分派的基本单位,而进程作为资源分配的基本单位,把传统进程的两个属性分开,使线程基本上不拥有资源,这样便提高系统的并发程度。
●进程调度方式:
非抢占方式和抢占方式(允许调度程序根据某种原则暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一个进程)。
调度算法:
FCFS,SJF,优先级、轮转(round-robin)、多级反馈队列。
●死锁:
指多个进程在运行过程中因争夺资源而造成一种僵局,当进程处于这种僵持状态时,若无外力作用,它们将无法向前推进。
产生死锁的原因:
竞争资源和进程间推进顺序非法。
产生死锁的必要条件:
互斥条件、请求和保持条件、不剥夺条件、环路等待条件。
要破坏死锁,只能破坏后三个死锁的必要条件,互斥条件是不能破坏的。
互斥条件:
指进程对所分配到的资源进行排他性使用,即在一段时间内某资源只由一个进程占用。
请求和保持条件:
指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占用,此时请求进程阻塞,但又对自己获得的其他资源保持不放。
不剥夺条件:
指进程已获得的资源,在未使用完之前不能被剥夺,只能在使用完由自己释放。
环路等待条件:
指在发生死锁时,必然存在一个进程—资源的环形链,即进程集合。
●系统安全状态:
是指系统能按某种进程顺序(P1,P2````Pn)来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求。
掌握:
安全性算法。
死锁检测。
资源分配图。
3存储管理(重点:
页面置换算法)
●程序的链接:
静态链接、装入时动态链接和运行时动态链接
●连续分配方式:
单一连续分配、固定分区分配、动态分区分配和动态重定位分配。
●分区分配算法:
首次适应算法、循环首次适应算法、最佳适应算法、最坏适应算法和快速适应算法。
最佳适应算法产生的碎片最小。
●碎片:
在系统中有若干个小的分区,即使它们的容量大于要装入的程序,但由于分区不相邻,也无法把程序装入内存,这种不能被利用的小分区叫碎片。
●紧凑:
通过移动内存中作业的位置,把原来多个分散的小区拼凑成一个大分区的方法。
●基本分页存储管理方式:
(地址变换机构,将逻辑地址转换成物理地址)逻辑地址与物理地址。
在具有地址变换机构的计算机中,允许程序中编排的地址和信息实际存放在内存中的地址有所不同。
前者叫逻辑(相对)地址,后者叫物理(绝对)地址。
●分页和分段的主要区别:
1、页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。
分段的目的是为了更好的满足用户的需要。
2、页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址,而段的长度却不固定,决定于用户所编的程序,通常由编译程序在对源程序进行编译时,根据信息的性质划分3、分页的作业地址空间是一维的,而分段的作业是二维的。
●段页式存储管理方式需三次访问内存:
第一次访问内存中的段表,从中取得页表始址;第二次访问内存中的页表,取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问才是真正从第二次访问所得的地址中取出指令或数据。
●缺页中断机构:
在请求分页系统中,每当所访问的页面不在内存时,便产生缺页中断。
●页面置换算法:
选择换出页面的算法。
:
先进先出算法(FIFO)、最近最少使用页面置换(LRU)、最不经常使用的页面置换(LFU)、最优置换算法(OPT)等。
4文件管理(重点难点:
目录与文件系统的实现方法)
●文件的逻辑结构(文件组织):
从用户观点出发所观察到的文件组织形式,是用户可以直接处理的数据及其结构,它独立于文件的物理特性。
文件的逻辑结构类型:
1有结构文件:
由一个以上的记录构成的文件。
2无结构文件(流式文件):
由字符流构成的文件。
●文件的物理结构(文件的存储结构):
是文件在外存上的存储组织形式,不仅与存储介质的存储性能有关,还与采用的外存分配方式有关。
根据用户和系统的管理上的需要,可以由以下几种方式组织这些记录:
顺序文件、索引文件、索引顺序文件。
●目录管理的要求:
实现“按名存取”、提高对目录的检索速度、文件共享、允许文件重名。
●文件控制块(FCB):
能对一个文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构。
通常含有三类信息:
基本信息类、存取控制信息和使用信息。
●索引结点(i-node)的引入:
让目录瘦身,提高查询速度。
i-node结构。
●空闲表法:
属于连续分配方式,与内存的动态分配方式雷同,为每个文件分配一块连续的存储空间,即系统也为外存上的所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项,包括表项序号、该空闲区的第一张空闲表、该区的空闲盘快数等信息。
空闲链表法、位示图法。
5设备管理
●I/O设备类型,按信息交换单位分为:
块设备和字符设备;块设备:
用于存储信息,属于结构设备,典型的块设备是磁盘,基本特征是传输速率较高,每秒为几兆位,另一特征是可寻址,即随意地读/写任一块。
字符设备:
用于数据的输入和输出,属于无结构类型,如交互式终端、打印机等。
基本特征是传输速率较低,通常是几个字节至几千字节。
且是不可寻址,即输入输出不能指定数据的输入源地址和输出的目标地址,此外字符设备在输入输出时,常采用中断驱动方式。
●按设备的共享属性分:
独占设备、共享设备、虚拟设备。
独占设备:
是指再一段时间内只允许一个用户(进程)访问的设备,即临界资源。
独占设备的分配可能引起死锁,如打印机。
共享设备:
是指在一段时间内允许多个进程同时访问的设备。
共享设备必须是可寻址和科随机访问的设备,如磁盘。
虚拟设备:
通过虚拟技术将一台独占设备变换为若干台逻辑设备,供若干个用户(进程)同时使用。
●I/O系统的层次:
用户层软件、设备独立性软件、设备驱动程序和中断处理程序。
当一个进程请求I/O操作时,该进程将被挂起,直到I/O设备完成I/O操作后,设备控制器便向CPU发送中断请求,CPU响应后便转向中断处理程序,中断程序执行响应处理,处理完后解除相应进程的阻塞状态。
●设备独立性:
应用程序独立于集体使用的物理设备。
●逻辑设备表(LUT)的设置问题:
第一种方式是在整个系统中只置一张LUT。
第二种是为每个用户设置一张LUT。
设备分配需要的四张表:
设备控制表(DCT)、控制器控制表、通道控制表、系统设备表。
●SPOOLing技术:
将一台物理I/O设备虚拟为多台逻辑I/O设备,同样允许多个用户共享一台物理I/O设备。
SPOOLing(假脱机操作):
在联机情况下,外围操作与CPU对数据的处理同时进行的操作。
●磁盘调度:
先来先服务(FCDS)、最短寻道时间优先(SSTF)、循环扫描算法(CSCAN).
二、嵌入式实时操作系统μC/OS—Ⅱ
内容以系统源码为基础,理解嵌入式实时操作系统μC/OS—Ⅱ的实现及其简单应用。
参考书:
《嵌入式实时操作系统μC/OS—Ⅱ》,第2版,JeanLabrosse著,邵贝贝译,北京航空航天大学出版社
复习范围:
1)理解掌握--嵌入式实时操作系统主要概念和μC/OS—Ⅱ中主要数据结构与算法
2)利用μC/OS—Ⅱ内核中的主要函数实现简单的应用任务。
掌握程序的结构和函数调用。
1实时系统概念
中断和时间管理(概念、实现过程、内核函数):
中断、中断延迟、响应及恢复。
关中断开中断的实现。
系统时间与时钟节拍。
任务延时函数。
μC/OS—Ⅱ的优先级
动态优先级-优先级在运行过程中可以变化vs静态优先级--在执行过程中优先级不变
优先级反转--避免优先级反转的方法是使占有共享资源的任务的优先级升到(相对或绝对)最高(优先级继承或天花板算法)。
2内核结构
●临界段;μC/OS—Ⅱ实现开中断、关中断的方法。
OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。
它们可以用不同的方法去实现,用定义(#define)常数OS_CRITICAL_METHOD(1,2,3)来选择用哪种方法来实现。
当OS_CRITICAL_METHOD=1时,表示用处理器指令关中断,完成OS_ENTER_CRITIACL,用开中断完成OS_EXIT_CRITICAL.利用这种方法有点小问题,即是调用UCOS功能函数之前,无论中断是否是关掉的,返回后,中断就打开了。
当OS_CRITICAL_METHOD=2时,这种方法是在堆栈中保存中断的开关状态,然后再关中断。
在实现OS_EXIT_CRITICAL时,只需简单的从堆栈中弹出原来中断的开关状态。
利用这种方法,不论用户在调用函数之前中断是开着的还是关着的,函数的进入和返回状态都得到了保护。
当OS_CRITICAL_METHOD=3时,一些编译器提供了扩展功能,用户可以得到当前处理器的状态字,并保存在C函数的局部变量中,这个变量可以用于恢复PSW。
●任务的状态
睡眠态:
通过调用下述两个函数(OSTaskCreat()或OSTaskCreatExt())之一来实现的。
就绪态:
任务一旦建立这个任务就进入了就绪态,准备运行。
可以通过调用OSTaskDel()返回到睡眠态。
运行态:
调用OSStart()可以启动多任务。
等待状态:
正在运行的任务可以通过调用以下两个函数(OSTimeDly()或OSTimeDlyHMSM())之一,将自身延迟一段时间。
正在运行的任务可能需要等待某一事件的发生,可以调用函数(OSFlagPend(),OSSempend(),OSMutexPend(),OSMboxPend(),OSQPend())之一来实现。
中断服务态:
正在运行的任务可以被中断。
●优先级、就绪表每个就绪的任务都放在就绪表中,就绪表中有两个变量,OSRdyGRP和OSRdyTbl
OSRdyGrp中每一位表示8组任务中每一组是否有进入就绪态的任务。
当有任务进入就绪态时,就绪表OSRdyTbl[]中相应元素的相应位也置为1.
OSRdyGrp|=OSMapTbl[prio>>3];
OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];
OSMapTbl[]是屏蔽字,将0-7的下标转换成各自位置1的8位值(模式串)
●任务调度OS_SCHED()总是进行进入就绪态任务中优先级最高的任务,确定哪个任务优先级最高,这一工作就是有调度器完成的。
●任务切换OS_TASK_SW()需恢复该任务在CPU使用权被剥夺时保存下来的全部寄存器的值,之后,运行被切换的任务。
●时钟节拍OSTimTick()注意点:
必须在多任务系统启动后,也就是调用OSStart()之后,再开启时钟节拍器。
3任务管理
●建立任务OSTaskCreat()/OSTaskCreatExt()
如果想让UCOS管理用户的任务,必须先建立任务。
可以通过将任务的地址和其他参数传递到以下两个函数之一来建立任务。
当调用OSTaskCreat()时,需要四个参数:
OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTUprio)
Task:
是指向任务代码的指针,pdata:
是任务开始执行是,传递给任务的参数的指针,ptos:
是分配给任务的堆栈的栈顶指针,prio是分配给任务的优先级。
OSTaskCreateExt()函数来建立任务会更加灵活,但是会增加一些额外的开销。
●任务堆栈OS_STK()
每个任务都有自己的堆栈,堆栈必须申明为OS_STK类型,并且由连续的内存空间组成。
可以静态分配堆栈空间,也可以动态分配堆栈空间。
3:
堆栈检验OSTaskStkChk()
有时确定任务实际需要的堆栈空间的大小是很有必要的,因为这样就可以避免为任务分配过多的堆栈空间,从而减少应用程序代码所需的RAM空间。
●删除任务OSTaskDel()有时需要删除任务,删除任务,是说任务返回并处于休眠态,并不是说任务的代码被删除了,只是任务的代码不再被UCOS调用。
●改变任务的优先级OSTaskChangePrio()
在建立任务是,会分配给任务一个优先级。
在程序运行期间,可以通过调用该函数改变任务的优先级。
也就是说,UCOS允许动态的改变任务的优先级。
●挂起任务OSTaskSuspend()任务挂起是一个附加功能,也就是说,如果任务在被挂起的同时也在等待延迟时间到,那么,需要对任务做取消挂起的操作,并且等待延迟时间到,任务才能转让就绪状态。
任务可以挂起自己或者其他任务。
●恢复任务OSTaskResume()
别挂起的任务只有通过该函数才能被恢复。
4时间管理
1:
任务延迟函数OSTimeDly()
Ucos提供一个可以被任务调用而将任务延时一段特定时间的功能函数,即OSTimeDly().任务调用OSTimeDly()后,一旦规定的时间期满或者有其他的任务通过调用OSTimeDlyResume()取消了延时,他就会进入就绪状态。
只有当该任务在所有就绪态任务中具有最高的优先级,它才会立即运行。
2:
按时,分,秒延时函数OSRimeDLyHMSM()
与OSTimeDly()一样,调用OSRimeDlyHMSM()函数也会是UCOS进行一次任务调度,并且执行下一个优先级最高的就绪任务。
当OSTimeDlyHMSM()后,一旦规定的时间期满,或者有OSTimeDlyResume(),它就会马上处于就绪态。
同样,只有当该任务在所有就绪态任务中具有最高的优先级,他才开始运行。
3:
恢复延时的任务OSTimeDlyResume()延时的任务可以不等待延时的期满,而是通过其他任务取消延时而使自己处于就绪态,可以通过该函数来实现,实际上,OSTimeDlyResume()也可以唤醒正在等待的事件。
4:
系统时间OSTimeGet()和OSTimeSet()
5事件控制块(ECB)
任何任务或中断服务子程序可以通过事件控制块ECB向另外的任务发信号,这里信号看成是事件。
事件控制块ECB的数据结构
Typedefstruct
{
INT8UOSEventType;;定义了事件的具体类型
INT8UOSEventGrp;;
INT16UOSEventCnt;;当事件控制块用于信号量时,该变量用于信号量的计数器。
Void*OSEventPtr;;只有所定义的事件是消息邮箱或者消息队列时才使用。
INT8UOSEventTbl[OS_EVENT_TBL_SIZE];
}OS_EVENT;
1:
初始化一个事件控制块,OS_EventWaitLListInit()
当建立一个信号量,邮箱或者消息队列时,通过调用该函数,对事件控制块中的等待任务列表进行初始化。
2:
使一个任务进入就绪态,OS_EventTaskRdy()
该函数从等待任务队列中使最高优先级任务脱离等待状态,并把该任务置于就绪态。
3:
使一个任务进入等待某事件发生状态OS_EventTaskWait()
当某个任务需等待一个事件的发生时,信号量,互斥型信号量,邮箱及消息队列会通过相应的PEND函数调用该函数,使当前任务从就绪任务表中脱离就绪态,并放到相应事件的事件控制块的等待任务表中。
4:
由于等待超时而降任务置为就绪态OS_EventTo()
如果在预先指定的等待时限内任务等待的事件没有发生,那么该函数就会因为等待超时而将任务的状态量置为就绪态。
在这种情况下,信号量,互斥型信号量及消息队列会通过PEND调用该函数,以完成这项工作。
6信号量管理
信号量有两部分组成:
一部分是16位无符号整型信号量的计数值,另一部分是有等待该信号量的任务组成的等待任务表。
1:
建立一个信号量,OSSemCreate()
使用一个信号量之前,首先须建立该信号量,可以调用该函数来建立信号量,并对信号量赋予初始计数值。
该初始值为0~65535.如果该信号量是用来表示一个或者多个事件发生,那么该信号量的初始值通常赋为0;如果该信号量用于对共享资源的访问,那么该信号量的初始值应赋为1;如果该信号量用来表示允许任务访问n个相同的资源,那么该信号量的初始值应赋为n,并把该信号量作为一个可记数的信号量使用。
2:
删除一个信号量,OSSemDel()
如果要删除一个信号量,在OS_CFG.H中,OS_SEM_DEL_EN须置为1,该函数才能被使用。
3:
等待一个信号量OSSemPend()4:
发出一个信号量OSSempend()
5:
无等待的请求一个信号量OSSemAccept()
当一个任务请求一个信号量时,如果该信号量暂时无效,也可以让该任务简单的返回,而不是进入睡眠等待状态。
这种操作由该函数完成。
6:
查询一个信号量的当前状态,OSSemQuerey()可以通过该函数,来查询一个信号量的当前状态。
7互斥信号量管理
任务可以使用互斥型信号量实现对共享资源的独占式处理,互斥型信号量mutex。
1:
建立一个互斥型信号量,OSMutexCreate()
在使用mutex之前,必须建立它,建立mutex是通过该函数来实现的,当mutex的初始值为1时,表示资源是可以利用的。
2:
删除一个互斥型信号量,OSMutexDel()
只有当OS_CFG.H文件中OS_MUTEX_DEL_EN的值为1时,该函数才有效。
3:
等待一个互斥信号量,OSMutexPend()4:
释放一个互斥型信号量,OSMutexPost()5:
无等待的获取互斥型信号量(任务不挂起),OSMutexAccept()
如果要得到mutex,而当前mutex无效,那么不让任务进入休眠态也是可以的,这时可以通过调用该函数来实现。
6:
获取互斥型信号量的当前状态,OSMutexQuery()用来获取互斥型信号量的事件控制块的当前状况。
8事件标志组管理
事件标志组由两部分组成:
一是用来保存当前事件中各事件状态的一些标志位;二是等待这些标志位置位或清除的任务列表。
事件标志组数据结构
Typedefstruct{
INT8UOSFlagType;;用来检验指针的类型是否是事件标志组的指针。
Void*OSFlagwaitList;;包含一个等待事件标志组的任务列表。
OS_FLAGSOSFlagFlags;;包含一系列表明当前事件标志状态的位。
}OS_FLAG_GRP;
1:
建立一个事件标志组,OSFlagCreate()
2:
删除一个事件标志组,OSFlagdel()
3:
等待事件标志组的事件标志位,OSFlagPend()
4:
置位或清0事件标志组中的事件标志,OSFlagPost()
5:
无等待的获得时间标志组中的事件标志,OSFlagAccept()
9消息邮箱管理
消息邮箱是一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型变量。
1:
建立一个邮箱,OSMboxCreate()
使用邮箱之前,必须建立邮箱,该操作可以通过调用该函数来实现,并且须定时指针的初始值。
一般情况下,这个初始值为NULL;但也可以初始化一个邮箱,使其在最开始就包含一条消息。
2:
删除一个邮箱,OSMboxDel()
3:
等待邮箱中的消息,OSMboxPend()
4:
向邮箱发送一则消息,OSMboxPost()
5:
向邮箱发送一则消息,OSMboxPostOpt()(该