信号量的几点理解

信号量在各种操作系中都作为基本同步或通信机制,经过一段时间的应用和总结,现归纳如下,有错误之处来日再改。

信号量用于进程/线程同步/通信,大到Linux,Windows,小到FreeRTOS,RT-Thread等等都能见到她靓丽的身影。根据用途和常见使用场合细分为以下几种:

1. 二值信号量

二值信号量一般用于中断,在硬件中断中give信号量(V操作),在软中断(即中断处理操作)中take信号量(P操作)。执行take操作后二值信号量归零。同理可用于进程/线程同步。一方只负责give,另一方只负责take,即take后不需give。

2. 互斥量

互斥量同样也是一种二值信号量,不同的是互斥量一般用于数据访问保护,当一个任务想要访问数据必须先持有(take)该数据的信号量,当访问结束后必须归还(give)持有的信号量,即take后需give。

3. 计数信号量

上述两种信号量一次只能存储一个事件,若在锁存的事件被处理之前还有事件(如中断)发生,则后来的事件会丢失。计数信号量可以存储多个事件,可以避免这种情况。同二值信号量的操作机制,事件产生者(如中断)give,事件处理者(如中断处理程序)take,take后无需give。

4. 资源管理信号量

资源管理信号量实际上也是一种计数值的信号量,不同的是计数信号量初始化为0,而资源管理信号量初始化为一个大于零的值,该值表示可用资源数目,任务想要获取资源必须先获取信号量(使信号量的计数值减一)。当信号量值为0的时候表示无可用资源,当任务完成后需归还信号量(使信号量计数值加一)。

 

你可能感兴趣的:(Linux,单片机嵌入式)