gpt4 book ai didi

operating-system - 使用抢占式内核时的信号量

转载 作者:行者123 更新时间:2023-12-04 07:24:58 25 4
gpt4 key购买 nike

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

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

最佳答案

it is a flag when is set to 1 by an ISR of an interrupt.

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

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

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

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

计数信号量二进制信号量类似,不同之处在于它可以多次给出,并且任务可以在计数为零之前无阻塞地获取信号量。

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

互斥体的一个特殊功能是,如果具有锁的线程的优先级低于请求锁的任务的优先级,则较低优先级任务的优先级将提升到较高优先级的优先级,以防止优先级反转(其中优先级反转)。中等优先级任务可能会通过锁抢占低优先级任务,从而增加较高优先级任务必须等待的时间,这会导致调度不确定。

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

关于operating-system - 使用抢占式内核时的信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29294855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com