标签:declare 任务 ons ace sof 唤醒 信号 解析 保护
1 基础概念
信号量在创建时须要设置一个初始值,表示同一时候能够有几个任务能够訪问该信号量保护的共享资源。初始值为1就变成相互排斥锁(Mutex),即同一时候仅仅能有一个任务能够訪问信号量保护的共享资源。
一个任务要想訪问共享资源,首先必须得到信号量,获取信号量的操作将把信号量的值减1。若当前信号量的值为负数,表明无法获得信号量。该任务必须挂起在该信号量的等待队列等待该信号量可用;若当前信号量的值为非负数。表示能够获得信号量,因而能够立马訪问被该信号量保护的共享资源。
当任务訪问完被信号量保护的共享资源后。必须释放信号量,释放信号量通过把信号量的值加1实现,假设信号量的值为非正数。表明有任务等待当前信号量,因此它也唤醒全部等待该信号量的任务。
信号量被看做一个对象。包括一个整型变量、一个进程等待队列和down()up()操作函数,挂起的进程直接增加等待队列,等待信号量的释放。这样,进程间的上下文切换带来了不小的开销。针对要求时间效率的加锁,特别是在多处理器的平台上,自旋锁更合适。
自旋锁没有等待队列。进程会在还有一个进程上不断自循环,等待该进程的自旋锁的释放,所以单处理器上不能够用自旋锁。
2 信号量的API
ECLARE_MUTEX(name)
|
DECLARE_MUTEX_LOCKED(name)
|
因此对于这样的锁,通常是先释放后获得。
void sema_init (struct semaphore *sem, int val);
|
void init_MUTEX (struct semaphore *sem);
|
void init_MUTEX_LOCKED (struct semaphore *sem);
|
void down(struct semaphore * sem);
|
int down_interruptible(struct semaphore * sem);
|
int down_trylock(struct semaphore * sem);
|
void up(struct semaphore * sem);
|
标签:declare 任务 ons ace sof 唤醒 信号 解析 保护
原文地址:http://www.cnblogs.com/wzzkaifa/p/6815643.html