【问题标题】:Semaphore when using a pre-emptive kernel使用抢占式内核时的信号量
【发布时间】:2015-03-27 06:46:57
【问题描述】:

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

但是,当我们使用抢占式内核(例如 FreeRTOS)时,信号量是什么?和二值信号量一样吗?

【问题讨论】:

  • 这不仅仅是一个标志或计数。一个信号量也有一些容器,通常是一个队列,用于等待它的线程。
  • 二进制信号量只是 RTOS 信号量的一种应用。 FreeRTOS 网站有a good write up
  • 我对其进行了一些研究,我的印象是,它就像某种计数器,通过计算 ISR 中的标志来计算到目前为止使用了多少资源

标签: operating-system kernel embedded


【解决方案1】:

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

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

  • 二进制信号量
  • 计数信号
  • 互斥信号量 (Mutex)

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

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

Counting Semaphore类似于Binary Semaphore,不同之处在于它可以多次给出,并且任务可以不阻塞地获取信号量,直到计数为零。

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

互斥锁的一个特殊功能是,如果一个拥有锁的线程的优先级低于请求锁的任务,那么低优先级的任务会被提升到更高的优先级,以防止优先级倒置。中优先级任务可能会抢占低优先级任务,并增加锁增加高优先级任务必须等待的时间,从而导致调度不确定。

以上描述为典型;具体的 RTOS 实现可能会有所不同。例如,FreeRTOS 区分 mutexrecursive mutex,后者支持可嵌套性功能;而第一个在不需要嵌套的情况下效率略高。

【讨论】:

  • 感谢您的详细回答,顺便说一句,我正在研究裸机中的二进制信号量,我通常用它来保持 ISR 简短
  • @johnny :如果您只有一个主上下文和一个 ISR 上下文,则没有“阻塞”的概念,主线程只是旋转等待一个标志或轮询它并继续 - 无论哪种方式,这不是信号量。
  • @Clifford 好吧,信号量通常用于 ISR 和用户状态线程之间的通信。在我使用过的所有操作系统上,在信号量上发送(但肯定不是等待)是安全的。如果 ISR 通过调度程序退出(而不是通常的直接中断返回),这样的 ISR 可以使正在等待信号量的线程“立即”准备好/运行。
  • @MartinJames:我没有说任何不同的东西(事实上,我在回答中已经确切地说过了)。我的评论指的是 Johnny 对信号量的简单理解以及他在没有 RTOS 的系统中使用简单的标志变量。
  • @johnny : 我知道你的问题是专门关于二进制信号量的,对其他形式的信号量的解释是为了提供答案的上下文。
【解决方案2】:

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

“适当设计的驱动程序/ISR”是指可以执行 send() 操作,然后在需要设置等待线程就绪/运行时通过 OS 调度程序退出的驱动程序。

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

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 2015-03-05
    • 2014-08-25
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多