目录
- 概念
- 二值信号量
- 运作机制
- 计数型信号量的运作机制
- 信号量控制块
概念
信号量(Semaphore)是一种实现线程间通信的机制,实现线程之间同步或临界资源的互斥访问,常用于协助一组相互竞争的线程来访问临界资源。在多线程系统中,各线程之间需要同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。
二值信号量
信号量资源被获取了,信号量值就是 0,信号量资源被释放,信号量值就是 1,把这种只有 0和 1 两种情况的信号量
称之为二值信号量。
在线程系统中,我们经常会使用这个二值信号量,比如,某个线程需要等待一个标记
,那么线程可以在轮询中查询这个标记
有没有被置位,这样子做,就会很消耗CPU资源
,其实根本不需要在轮询中查询这个标记,只需要使用二值信号量即可,当二值信号量没有
的时候,线程进入阻塞态
等待二值信号量到来即可,当得到了这个信号量(标记)
之后,在进行线程的处理
即可,这样子么就不会消耗太多资源了,而且实时响应也是最快的。
再比如某个线程使用信号量在等中断的标记的发生,在这之前线程已经进入了阻塞态,在等待着中断的发生,当在中断发生之后,释放一个信号量,也就是我们常说的标记,当它退出中断之后,操作系统进行线程的调度,如果这个线程能够运行,系统就会把等待这个线程运行起来,这样子就大大提高了我们的效率。
二值信号量在线程与线程中同步的应用场景:假设我们有一个温湿度的传感器,假设是1s采集一次数据,那么我们让他在液晶屏中显示数据出来,这个周期也是要1s一次的,如果液晶屏刷新的周期是100ms更新一次,那么此时的温湿度的数据还没更新,液晶屏根本无需刷新,只需要在1s后温湿度数据更新的时候刷新即可,否则CPU就是白白做了多次的无效数据更新,CPU的资源就被刷新数据这个线程占用了大半,造成CPU资源浪费,如果液晶屏刷新的周期是10s更新一次,那么温湿度的数据都变化了10次,液晶屏才来更新数据,那拿这个产品有啥用,根本就是不准确的,所以,还是需要同步协调工作,在温湿度采集完毕之后,进行液晶屏数据的刷新,这样子,才是最准确的,并且不会浪费CPU的资源。同理,二值信号量在线程与中断同步的应用场景:我们在串口接收中,我们不知道啥时候有数据发送过来,有一个线程是做接收这些数据处理,总不能在线程中每时每刻都在线程查询有没有数据到来,那样会浪费CPU资源,所以在这种情况下使用二值信号量是很好的办法,当没有数据到来的时候,线程就进入阻塞态,不参与线程的调度,等到数据到来了,释放一个二值信号量,线程就立即从阻塞态中解除,进入就绪态,然后运行的时候处理数据,这样子系统的资源就会很好的被利用起来。
运作机制
计数型信号量的运作机制
计数型信号量与二值信号量其实都是差不多的,一样用于资源保护,不过计数信号量则·允许多个线程获取信号量访问共享资源·,但会限制线程的·最大数目·。访问的线程数达到信号量可支持的最大数目时,会阻塞其他试图获取该信号量的线程,直到有线程释放了信号量。
信号量控制块
本节笔记参考于:野火-《RT-Thread内核实现与应用开发实战》
韦东山 《RT-Thread完全开发手册之内核机制》