操作系统相关小结_第1页
操作系统相关小结_第2页
操作系统相关小结_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1. 前后台系统:应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为。中断服务程序处理异步事件,这部分可以看成前台行为。后台叫任务级,前台叫中断级。2. 代码的临界段也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则不允许有任何中断打入。为确保临界段代码的执行,在进入临界段之前要关中断,而临界段执行完之后立即开中断。3. 资源:任何为任务所占有的实体都叫资源。共享资源:可以被一个以上的任务使用的资源叫做共享资源。为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占资源,这叫互斥。4. 任务:一个任务,也称作为一个线程,是一个简单的程序,该程

2、序可以认为CPU完全只属于该程序自己。每个任务都是一个无限循环。每个任务都处在以下5种状态之下:休眠态、就绪态、运行态、挂起态和被中断态。休眠态相当于该任务驻留在内存中,但并不被多任务内核所调度。就绪态意味着该任务已经准备好,可以运行了,但是由于该任务的优先级比正在运行的任务优先级低,还暂时不能运行。运行态的任务是指该任务掌握了CPU的控制权,正在运行中。挂起态指该任务在等待某一事件的发生。最后,发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断状态。5. 任务切换(上下文切换):CPU寄存器内容切换,当内核要运行另外的任务时,它保存正在运行任务的当前状态,即C

3、PU寄存器中的全部内容。这些内容保存在任务自己的栈区之中。入栈工作完成之后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的执行。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。6. 内核:多任务系统中,内核负责管理各个任务,或则说为每个任务分配 CPU事件,并负责任务间的通讯。内核的基本服务是任务切换。7. 调度:就是指该轮到哪个任务运行了。多数实时内核是基于优先级调度算法,即CPU总是让处于就绪态的优先级最高的任务先运行。究竟何时让高优先级的任务掌握CPU的使用权,有两种不同的情况,这要看用什么类型的内核,是不可剥夺型的还是不可剥夺型。8.

4、 不可剥夺型内核:每个任务主动放弃CPU的使用权,放弃的方法可以使用多种函数定时或则定事件的放弃。异步事件还是由中断服务程序来处理。中断处理结束之后还是回到被中断的那个任务直至该任务主动放弃CPU使用权。在任务级,不可剥夺型内核允许使用不可重入函数不必担心被重复调用,因为每一时刻只有一个任务在运行。9. 可剥夺型内核:当运行的任务使用一个更高优先级的任务进入就绪态时当前任务的CPU使用权被剥夺或者挂起,更高优先级的饿任务获得CPU使用权。如果任务的CPU使用权被剥夺或则挂起,更高优先级的任务获得CPU的使用权。如果是中断服务子程序造成的,中断完成后被中断的任务被挂起,执行更高优先级的任务。在可

5、剥夺型内核中,要谨慎使用不可重用函数,因为低优先级和高优先级的任务可能都调用该函数。10. 任务调度策略:1)基于优先级的抢占式任务调度(由高到底);2)轮转调度(一人一口);3)抢占上锁(禁止调度器)。11. 不可重入函数主要是用于多任务环境,一个可重入的函数简单来说是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度去执行另外一段代码,而返回控制时不会出现错误;而不可重入函数由于使用了一些系统资源,比如全局变量区,中断向量表,所以它被中断可能出现问题。也可以这样理解,重入即表示重复进入,首先意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量外不依赖于任何

6、环境,这样的函数可重入,可以允许有该函数的多个副本在运行,由于他们使用的是分离的栈,所以不会相互干扰。如果需要访问全局变量,一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要。保证函数的可重入性方法:1)尽量使用局部变量2)对于要使用的全局变量要加以保护(关中断、信号量)。在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸设计成为不可重入函数,那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,导致不可预料后果。所谓可重入函数是指一个可以被多个任务调用的过程,任务调用时不必担心数据是否会出错。问题1,如何编写可重入的函数? 答:在函数体内不访问那些全

7、局变量,不使用静态局部变量,坚持只使用局部变量,写出的函数就将是可重入的。如果必须访问全局变量,记住利用互斥信号量来保护全局变量。问题2,如何将一个不可重入的函数改写成可重入的函数? 答:把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写它。其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是可重入的。 1) 不要使用全局变量。因为别的代码很可能覆盖这些变量值。 2) 在和硬件发生交互的时候,切记执行类似disinterrupt()之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”。 3) 不能调用其它任何不可重入的函数。 4) 谨慎

8、使用堆栈。最好先在使用前先OS_ENTER_KERNAL。堆栈操作涉及内存分配,稍不留神就会造成益出导致覆盖其他任务的数据,所以,请谨慎使用堆栈!最好别用!很多黑客程序就利用了这一点以便系统执行非法代码从而轻松获得系统控制权。还有一些规则,总之,时刻记住一句话:保证中断是安全的!可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入 函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要

9、么在使用全局变量时保护自己的数据。 12. 优先级反转:任务1优先级高于任务2,任务2高于任务3。任务1和任务2处于挂起状态,等待某一事件的发生,任务3正在运行。此时任务3要使用其共享资源。使用共享资源之前,首先必须得到该资源的信号量。任务3得到该信号量,并开始使用该共享资源。由于任务1优先级高,它等待的时间到来之后剥夺了任务3的CPU使用权,任务1开始运行。运行过程中任务1也要使用那个任务3正在使用的资源,由于该资源的信号量还被任务3占用着,任务1只能进入挂起状态,等待任务3释放信号量。任务3 得以继续运行。由于任务2的优先级高于任务3,当任务2等待的事件发生后,任务2剥夺了任务3的CPU使

10、用权并开始运行。处理它该处理的事件,直到处理完之后将CPU的控制权还给任务3.任务3接着运行,直到释放那个共享资源的信号量。直到此时才执行任务1。13. 任务优先级分配:单调执行率调度发(RMS),用于分配任务优先级。这种方法基于哪个任务执行的次数最频繁,执行最频繁的任务优先级最高。14. 互斥条件:实现任务间通信最简便的方法是使用共享数据结构,与共享资源打交道,使之满足互斥条件最一般的方法有:关中断;测试并置位;禁止做任务切换;利用信号量。互斥主要是因为对共享数据的并发访问没有做出合适的访问策略造成的。例如两个进程同时访问一个共享数据。保证一段时间只有一个线程在执行一段代码。15. 在多任务

11、内核中普遍使用,信号量用于:1)控制共享资源的使用权;2)标志某事件的发生;2)是两个任务的行为同步。16. 事件标志:当某任务要与多个事件同步时,要使用事件标志。若任务需要与任何事件之一发生同步,可称为独立型同步。任务也可以与若干事件发生同步,称之为关联型同步。17. 任务间的通信:有时很需要任务间的或中断服务与任务间的通讯。这种信息传递称为任务间的通讯。任务间信息的传递有两个途径:通过全程变量或发消息给另一个任务。用全程变量时,必须保证每个任务或中断服务程序独享该变量。中断服务中保证独享的唯一办法是关中断。如果两个任务共享某变量,各任务实现独享该变量的办法可以是关中断再开中断,或使用信号量

12、(如前面提到的那样)。请注意,任务只能通过全程变量与中断服务程序通讯,而任务并不知道什么时候全程变量被中断服务程序修改了,除非中断程序以信号量方式向任务发信号或者是该任务以查询方式不断周期性地查询变量的值。要避免这种情况,用户可以考虑使用邮箱或消息队列。18. 消息邮箱:任务间的通信可以通过全局变量或者信号量来完成。全局变量虽然可以承载通信的内容,但是接收方无法意识到信息的到达,除非发送方向接收方发送一个信号量,或者接收方不断该全局变量;信号量可以立即使接收方知道某个事件的发生,但无法传递具体内容。用信号量进行通信就像我们只拨通别人的手机而不与之通话;用消息队列或者邮箱进行通信则可达到既拨通别

13、人的手机又与之通话的效果。换句话说,消息队列和邮箱可以及时传送事件的内容。邮箱通信的机理:发送方通过内核服务把一封邮件投递到邮箱,内核完成投递任务后通知等待列表中的接收方收取邮件。在整个投递过程中,内核充当了邮递员的角色。这里的“邮件”通常是一个指针,接收方可以通过该指针获取邮件内容。当希望一次性向某个任务发送多则消息时,邮箱就有点见肘了。因为一个邮箱只能装一封信。把多个邮箱集中到一起管理和使用就变成了消息队列,所以消息队列的操作和邮箱很相似。可以简单地认为,消息队列是邮箱数组。进程在执行过程中拥有独立的内存单元,而多个线程共享内存。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。 19. 线程与进程的区别:一个系统运行着很多进程,可以比喻为一条马路上有很多马车,不同的进程可以理解为不同的马车,而同一辆马车可以有很多匹马来拉,这些马就是线程。简而言之,一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。进程是程序在计算机上的一次执行活动。简而言之,线程就是把一个进程分为很

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论