首页>>科技 >>内容

简单介绍信号与信号量怎么写,简单介绍信号与信号量

发布时间:2023-09-30 19:27:38编辑:温柔的背包来源:

很多朋友对简单介绍信号与信号量怎么写,简单介绍信号与信号量不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

简单介绍信号与信号量怎么写,简单介绍信号与信号量

信号量实际上是一种约定机制,广泛应用于多任务内核。信号量用于控制共享资源的使用权(满足互斥条件),标记事件的发生并同步两个任务的行为。

Signal和Semaphore在英语中都叫信号量,不区分,但有两种,二进制和计数。本书中的二进制信号量实际上是一个只取两个值0和1的信号量。其实这个旗语只有一位,把这个旗语翻译成信号更合适。而二进制信号量通常是指几个位的组合。

信号就像一把钥匙。如果任务要运行,你得先拿到这个密钥。如果信号已经被另一个任务占用,该任务必须被暂停,直到信号被当前用户释放。换句话说,申请信号的任务就是说:“把钥匙给我。如果有人在用,我还得等!”“信号是只有两个值的变量,信号量是计数型的。只有两个值的信号是只有0和1两个值的量,所以也叫信号量。

计数信号量的值可以是0到255或0到65535,或者0到4294967295,这取决于信号量规范机制使用8位、16位还是32位。多少实际上取决于使用哪个内核。根据信号量的值,内核跟踪那些等待信号量的任务。

一般来说,信号量上只能执行三个操作:初始化,也可以叫创建;WAIT也可以称为pend发出信号或信号。当信号量被初始化时,应该给信号量分配一个初始值,并且应该清除信号量的Waitinglist。

想要获取信号量的任务执行一个等待操作。如果信号量有效(即信号量大于0),则信号量减1,任务可以继续运行。如果信号量的值为0,则等待信号量的任务列在等待信号量的任务表中。大多数内核允许用户定义等待超时。如果等待时间超过某个设定值,信号量仍然无效,等待信号量的任务进入就绪状态运行,并返回错误代码(表示发生了等待超时错误)。

任务通过发信号来释放信号量。如果没有任务在等待信号量,信号量的值就简单地加1。如果任务正在等待信号量,那么任务将进入就绪状态,并且信号量的值不会增加1。因此,密钥被交给了等待信号量的一个任务。至于给的任务,就看内核怎么调度了。接收信号量的任务可能是以下两种情况之一。等待信号量任务中的最高优先级,或者

l等待信号量的第一个任务是先进先出(FIFO)。

一些内核有选项允许用户在初始化信号量时选择上述两种方法中的一种。但是C/OS-只支持优先级方式。如果进入就绪状态的任务比当前正在运行的任务优先级高(假设当前任务释放的信号量激活了比自身优先级高的任务)。然后内核切换任务(假设使用的是被剥夺权利的内核),高优先级任务开始运行。当前任务已暂停。直到它再次成为就绪状态中优先级最高任务。同步:

您可以使用信号量将一个任务与中断服务同步(或者与另一个任务同步,并且两个任务之间没有数据交换)。如图2.13所示。请注意,信号量是由一个标志或符号表示的。该标志指示事件的发生(不再是确保互斥的关键)。用于实现同步机制的信号量初始化为0,用于这种类型同步的信号量称为单向同步。任务执行I/O操作,然后等待信号响应。

当I/O操作完成后,中断服务程序(或另一个任务)发送信号,任务收到信号后继续执行。

如果内核支持对信号量进行计数,信号量的值表示尚未处理的事件数量。请注意,可能有多个任务在等待同一事件,在这种情况下,内核将根据以下原则之一向相应的任务发出信号。

以上知识分享希望能够帮助到大家!