信号量( Semaphore)是一种实现任务间通信的机制,实现任务之间同步或临界资源的互斥访问。常用于协助一组相互竞争的任务来访问临界资源。
在多任务系统中,各任务之间需要同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。通常一个信号量的计数值用于对应有效的资源数,表示剩下的可被占用的互斥资源数。其值的含义分两种情况:
1)0,表示没有积累下来的Post *** 作,且有可能有在此信号量上阻塞的任务。
2)正值,表示有一个或多个Post下来的释放 *** 作。
以同步为目的的信号量和以互斥为目的的信号量在使用有如下不同:
1)用作互斥时,信号量创建后记数是满的,在需要使用临界资源时,先取信号量,使其变空,这样其他任务需要使用临界资源时就会因为无法取到信号量而阻塞,从而保证了临界资源的安全。
2)用作同步时,信号量在创建后被置为空,任务1取信号量而阻塞,任务2在某种条件发生后,释放信号量,于是任务1得以进入READY或RUNNING态,从而达到了两个任务间的同步。
信号量运作机制- 信号量初始化:为配置的N个信号量申请内存(N值可以由用户自行配置,受内存限制),并把所有的信号量初始化为未使用,并加入到未使用链表中供系统使用。
- 信号量创建:从未使用的信号量链表中获取一个信号量资源,并设定初值。
- 信号量申请:若其计数器值大于0 ,则直接减一返回成功。否则任务阻塞,等待其它任务释放该任务量,等待的时间超时时间可设定。当任务被一个信号量阻塞时,将该任务挂到任务量等待任务队列的队尾。
- 信号量释放:若有任务阻塞与指定信号量,则唤醒该信号量阻塞队列上的第一个任务。该任务进入就绪态状态,并进行调度,如果没有任务阻塞与指定信号量,释放信号量成功。
- 信号量删除:将正在使用的信号量置为未使用信号量,并挂回到未使用链表。
信号量允许多个任务在同一时刻访问同一资源,但会限制同一时刻访问此资源的最大任务数目。访问同一资源的任务数达到该资源的最大数量时,会阻塞其他试图获取该资源的任务,直到有任务释放该信号量。
信号量使用场景
- 互斥锁:信号量创建后记数是满的,在需要使用临界资源时,先申请信号量,使其变空,这样其他任务需要使用临界资源时就会因为无法申请到信号量而阻塞,从而保证了临界资源的安全。
- 任务间同步:信号量在创建后被置为空,任务1申请信号量而阻塞,任务2在某种条件发生后,释放信号量,于是任务1得以进入 READY或RUNNING态,从而达到了两个任务间的同步。
- 资源计数:信号量的作用是个特殊的计数布,可以递增或者递减,但是值永远不能为负值,典型的应用场景是生产者与消费者的场景。
- 中断与任务的同步:可以在中断未触发时将信号量的值置为0,从而堵塞中断服务处理任务,—旦中断被触发,则唤醒堵塞的中断服务处理任务进行中断处理。
OSAL的API信号量接口简介:
实现信号量功能
1、互斥锁又称互斥型信号量,是一种特殊的二值性信号量,用于实现对共享资源的独占式处理。
2、任意时刻互斥锁的状态只有两种:开锁或闭锁。
3、当有任务持有时,互斥锁处于闭锁状态,这个任务获得该互斥锁的所有权。
4、当该任务释放时,该互斥锁被开锁,任务失去该互斥锁的所有权。
5、当一个任务持有互斥锁时,其他任务将不能再对该互斥锁进行开锁或持有。
6、多任务环境下往往存在多个任务竞争同一共享资源的应用场景,互斥锁可被用于对共享资源的保护从而实现独占式访问。另外,互斥锁可以解决信号量存在的优先级翻转问题。
互斥锁的运行机制
用互斥锁处理非共享资源的同步访问时,如果有任务访问该资源,则互斥锁为加锁状态。此时其他任务如果想访问这个公共资源则会被阻塞,直到互斥锁被持有该锁的任务释放后,其他任务才能重新访问该公共资源,此时互斥锁再次上锁,如此确保同一时刻只有一个任务正在访问这个公共资源,保证了公共资源 *** 作的完整性。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)