信号量semaphore
2016-01-07 14:40
155 查看
1.信号量用于保护临界区的一种方法。临界区:在任何给定的时间,只有一个线程可以执行的代码
2.只有得到信号量的进程才能执行临界区代码,当得不到信号量时,进入休眠等待状态
-----------------------------------------------------------
1.定义信号量struct semaphore sem;
2.初始化信号量void sema_init(struct semaphore *sem, int val);
设置信号量sem的值为val
内核提供了一套帮助函数和宏定义因此, 一个互斥锁可以声明和初始化, 使用下面的一种:
DECLARE_MUTEX(name);//定义一个名为name的信号量并初始化为1
DECLARE_MUTEX_LOCKED(name);//定义一个名为name的信号量并初始化为0,互斥锁开始于上锁的状态
如果互斥锁必须在运行时间初始化( 这是如果动态分配它的情况, 举例来说),
使用下列中的一个:
void init_MUTEX(struct semaphore *sem);
void init_MUTEX_LOCKED(struct semaphore *sem);
3.获得信号量
"down"指的是这样的事实, 这个函数递减旗标的值, 并且, 也许在使调用者睡眠一会儿来等待旗标变可用之后, 给予对被保护资源的存取. 有 3 个版本的 down:
void down(struct semaphore *sem);
down 递减旗标值并且等待需要的时间,用于获得信号量sem,它会导致睡眠,因此不能在中断上下文使用,因为down()而进入睡眠的状态的进程不能被信号打断
int down_interruptible(struct semaphore *sem);
操作是可中断的.返回一个非零值
int down_trylock(struct semaphore *sem);
从不睡眠; 如果旗标在调用时不可用,down_trylock 立刻返回一个非零值.
如果能立即获得,它就获得该信号量并返回零
一旦一个线程已经成功调用 down 各个版本中的一个, 就说它持有着旗标(或者
已经"取得"或者"获得"旗标). 这个线程现在有权力存取这个旗标保护的临界区.
当这个需要互斥的操作完成时, 旗标必须被返回. V 的 Linux 对应物是 up:
4.释放信号量
void up(struct semaphore *sem);
一旦 up 被调用, 调用者就不再拥有旗标.该函数释放信号理sem,唤醒等待者
if (down_interruptible(&dev->sem))
return -ERESTARTSYS;
注意对 down_interruptible 返回值的检查; 如果它返回非零, 操作被打断了.
在这个情况下通常要做的是返回 -ERESTARTSYS.
信号量一般这样被使用
/*定义信号量
DECLARE_MUTEX(mount_sem);
down(&mount_sem);/*获得信号量,保护临界区*/
critical section /*临界区*/
up(&mount_sem);/释放信号量*/
5.信号量用于同步
如果信号量被初始化为0,则它可以用于同步,同步意味着一个执行单元的继续执行需等待另一个执行单元完成,保证执行的先后顺序。
2.只有得到信号量的进程才能执行临界区代码,当得不到信号量时,进入休眠等待状态
-----------------------------------------------------------
1.定义信号量struct semaphore sem;
2.初始化信号量void sema_init(struct semaphore *sem, int val);
设置信号量sem的值为val
内核提供了一套帮助函数和宏定义因此, 一个互斥锁可以声明和初始化, 使用下面的一种:
DECLARE_MUTEX(name);//定义一个名为name的信号量并初始化为1
DECLARE_MUTEX_LOCKED(name);//定义一个名为name的信号量并初始化为0,互斥锁开始于上锁的状态
如果互斥锁必须在运行时间初始化( 这是如果动态分配它的情况, 举例来说),
使用下列中的一个:
void init_MUTEX(struct semaphore *sem);
void init_MUTEX_LOCKED(struct semaphore *sem);
3.获得信号量
"down"指的是这样的事实, 这个函数递减旗标的值, 并且, 也许在使调用者睡眠一会儿来等待旗标变可用之后, 给予对被保护资源的存取. 有 3 个版本的 down:
void down(struct semaphore *sem);
down 递减旗标值并且等待需要的时间,用于获得信号量sem,它会导致睡眠,因此不能在中断上下文使用,因为down()而进入睡眠的状态的进程不能被信号打断
int down_interruptible(struct semaphore *sem);
操作是可中断的.返回一个非零值
int down_trylock(struct semaphore *sem);
从不睡眠; 如果旗标在调用时不可用,down_trylock 立刻返回一个非零值.
如果能立即获得,它就获得该信号量并返回零
一旦一个线程已经成功调用 down 各个版本中的一个, 就说它持有着旗标(或者
已经"取得"或者"获得"旗标). 这个线程现在有权力存取这个旗标保护的临界区.
当这个需要互斥的操作完成时, 旗标必须被返回. V 的 Linux 对应物是 up:
4.释放信号量
void up(struct semaphore *sem);
一旦 up 被调用, 调用者就不再拥有旗标.该函数释放信号理sem,唤醒等待者
if (down_interruptible(&dev->sem))
return -ERESTARTSYS;
注意对 down_interruptible 返回值的检查; 如果它返回非零, 操作被打断了.
在这个情况下通常要做的是返回 -ERESTARTSYS.
信号量一般这样被使用
/*定义信号量
DECLARE_MUTEX(mount_sem);
down(&mount_sem);/*获得信号量,保护临界区*/
critical section /*临界区*/
up(&mount_sem);/释放信号量*/
5.信号量用于同步
如果信号量被初始化为0,则它可以用于同步,同步意味着一个执行单元的继续执行需等待另一个执行单元完成,保证执行的先后顺序。
相关文章推荐
- Objective-C 计算代码运行时间
- StringUtils中 isNotEmpty 和isNotBlank的区别
- android基础学习之上下文菜单
- How does Log.wtf() differ from Log.e()?
- PHP实现基于Swoole简单的HTTP服务器
- Nagios全方位告警接入-电话/微信/短信都支持
- 把现在作为所有曾经的归宿
- Js中获取节点对象
- Android 实例:在Activity 之间跳转的intent
- 基于dubbo的分布式架构
- H5 App设计者需要注意的21条禁忌
- Linux系统中怎么设置java环境变量?
- 烟波流传,繁花三千,倾听似水流年
- Andorid 实现 Launcher桌面快速模糊 13毫秒左右
- 【探究】NoSQL数据库学习(一)
- 背包问题
- android studio应用(一):导入eclipse项目
- SQL笔记(13)_第十三章 查询里结合表
- Protobuf使用不当导致的程序内存上涨问题
- BZOJ1010 [HNOI2008] 玩具装箱toy