|
知识路径: > 嵌入式系统软件基础知识 > 嵌入式操作系统基础知识 > 处理器管理 > 同步与互斥(竞争条件、临界区、互斥、信号量、思锁等) > 任务间的同步与互斥 >
|
考试要求:掌握
相关知识点:9个
|
|
|
|
|
为了实现任务之间的互斥,最简单的办法就是把中断关掉。具体来说,当一个任务进入它的临界区之后,首先把中断关闭掉,然后就可以去访问共享资源。当它从临界区退出时,再把中断打开。
|
|
|
关闭中断可以有效地实现任务之间的互斥。对于操作系统而言,它可以认为是由中断来驱动的,只有当发生中断的时候,包括时钟中断、I/O中断、系统调用等,操作系统才能得到控制权,才能进行任务切换。如果当前任务把中断关闭了,除非它主动让出CPU,否则将不会发生任务的切换,别的任务将无法运行。在这种情形下,当前任务就可以很方便地去访问共享资源,不用担心别的任务来跟它竞争。
|
|
|
关闭中断法虽然简单有效,但也有它的缺点。首先,这种方法具有一定的风险。当任务把中断关闭后,如果由于种种原因不能及时地打开中断,那么整个系统就可能陷入崩溃的状态。其次,这种方法的效率不高。因为我们的初衷,只是想阻止那些试图访问共享资源的任务,以实现对该资源的互斥访问。但是关闭中断后,所有的任务都被阻止了,不论是竞争对手,还是毫不相关的任务,都被拒之门外,无法运行。因此,关闭中断法不能作为一种普遍适用的互斥实现方法,它主要用在操作系统的内核当中,使内核在处理一些关键性的敏感数据时,不会受到其他任务的干扰。
|
|
|
|
实现任务间互斥,也可以采用繁忙等待(busy waiting)的策略。其基本思路是:当一个任务想要进入它的临界区时,首先检查一下是否允许它进入,若允许,就直接进入;若不允许,就在循环地等待。
|
|
|
在具体实现上,有多种基于繁忙等待的实现方案。如加锁标志位法、强制轮流法、Peterson算法、TSL指令等等。这些方法可以抽象为下图所示的伪代码形式。当一个任务需要进入临界区时,不断地用while语句来测试一个标志位,看能否进入。如果不能的话,就循环等待,直到允许进入。在退出临界区的时候,还要把标志位清除掉。这类方法的共同点就是在测试能否进入临界区的时候,使用的是while循环语句,不断地执行测试指令,这样就浪费了大量的CPU时间。另外,这种方法还有一个问题,它只能处理单一共享资源的情形。如果在系统中,某种类型的共享资源有N份实例,则在任何时刻,最多应该允许N个任务同时进入临界区,去访问这种资源。但繁忙等待法无法处理此类问题。
|
|
|
|
|