使用先发制人内核时的信号量

时间:2015-03-27 06:46:57

标签: operating-system kernel embedded

我知道二进制信号量是什么:当一个中断的ISR设置为1时,它是一个标志。

但是当我们使用先发制人的内核时,什么是信号量,比如说FreeRTOS?它和二进制信号量一样吗?

2 个答案:

答案 0 :(得分:2)

  

当中断的ISR设置为1时,它是一个标志。

这既不是对信号量的完整也不准确的描述。你所描述的只是一个标志。信号量是同步对象;典型的RTOS提供了三种形式:

  • Binary Semaphore
  • 算上Sempahore
  • 互斥信号量(Mutex)

对于二进制信号量,有两个操作。获取信号量的任务将阻止(即暂停执行并允许其他较低或相同的优先级线程运行线程运行),直到某个其他线程或中断处理程序给出信号量。二进制信号量用于在线程之间以及从ISR到线程之间发送信号。它们通常用于实现延迟中断处理程序,因此ISR可以很短,并且处理程序受益于ISR中不允许的RTOS机制(阻止或暂停执行的任何东西)。

多个线程可能会阻塞单个信号量,但只有其中一个任务会响应信号量。某些RTOS具有 flush 操作(例如VxWorks),它将所有线程同时置于 ready 状态的信号量上 - 在这种情况下,它们将根据优先级调度运行方案

计数信号量类似于二进制信号量,除了可以多次给出,并且任务可以在没有阻塞的情况下获取信号量,直到计数为零。

Mutex 用于资源锁定。为此可以使用二进制信号量,但互斥量提供的功能可以使这更安全。互斥锁上的操作是 lock unlock 。当线程锁定互斥锁,而另一个任务尝试锁定相同的互斥锁时,第二个(以及任何后续)任务将阻塞,直到第一个任务解锁它。这可以用于防止多个线程同时访问资源(内存或I / O)。线程可能会多次锁定互斥锁;保持计数,以便在释放锁之前必须解锁相同的次数。这允许线程嵌套锁。

互斥锁的一个特殊功能是,如果具有锁定的线程的优先级低于请求锁定的任务,则优先级较低的任务被提升到较高优先级,以防止优先级倒置中优先级任务可以抢占低优先级任务,锁定会增加优先级较高的任务必须等待的时间长度,这使得调度不确定。

以上描述是典型的;特定的RTOS实现可能有所不同。例如,FreeRTOS区分互斥递归互斥,后者支持可嵌套性功能;而第一个在不需要嵌套的情况下效率稍高。

答案 1 :(得分:1)

信号量不仅仅是标志或计数。它们支持发送和等待操作。用户空间线程可以在没有不必要和不需要的轮询的情况下等待信号量,并在另一个线程或适当设计的驱动程序/ ISR发送单元时立即“立即”运行。

通过'适当设计的驱动程序/ ISR',我的意思是可以执行send()操作,然后在需要设置等待线程准备/运行时通过OS调度程序退出。

这种机制对于抢占式内核至关重要,因为它允许它们在不浪费时间,CPU周期和轮询内存带宽的情况下实现非常好的I / O性能。非抢占式系统在I / O上无可救药地缓慢,延迟和浪费,这就是为什么它们基本上不再使用以及为什么我们忍受所有同步/锁定/排队等问题。