信号量在各种操作系中都作为基本同步或通信机制,经过一段时间的应用和总结,现归纳如下,有错误之处来日再改。
信号量用于进程/线程同步/通信,大到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的时候表示无可用资源,当任务完成后需归还信号量(使信号量计数值加一)。