一、信号量的简介
信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。其中,“同步”指的
是任务间的同步,即信号量可以使得一个任务等待另一个任务完成某件事情后,才继续执行;
而“有序访问”指的是对被多任务或中断访问的共享资源(如全局变量)的管理,当一个任务
在访问(读取或写入)一个共享资源时,信号量可以防止其他任务或中断在这期间访问(读取
或写入)这个共享资源。
举一个例子,假设某个停车场有 100 个停车位(共享资源),这个 100 个停车位对所有人
(访问共享资源的任务或中断)开放。如果有一个人要在这个停车场停车,那么就需要先判断
这个停车场是否还有空车位(判断信号量是否有资源),如果此时停车场正好有空车位(信号量有资源),那么就可以直接将车开入空车位进行停车(获取信号量成功),如果此时停车场已经没有空车位了(信号量没有资源),那么这个人可以选择不停车(获取信号量失败),也可以选择等待(任务阻塞)其他人将车开出停车场(释放信号量资源),让后再将车停入空车位。
在上面的这个例子中,空车位的数量相当于信号量的资源数,获取信号量相当于占用了空
车位,而释放信号量就相当于让出了占用的空车位。信号量用于管理共享资源的场景相当于对
共享资源上了个锁,只有任务成功获取到了锁的钥匙,才能够访问这个共享资源,访问完共享
资源后还得归还钥匙,当然钥匙可以不只一把,即信号量可以有多个资源。
例子
队列与信号量的对比