Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370475
  • 博文数量: 94
  • 博客积分: 3421
  • 博客等级: 中校
  • 技术积分: 919
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-18 16:27
文章分类

全部博文(94)

文章存档

2015年(8)

2013年(6)

2012年(26)

2011年(8)

2010年(26)

2009年(20)

我的朋友

分类: LINUX

2010-07-20 22:21:31

1) include/linux/rwsem.h
2)  include/asm-i386/semaphore.h 与体系结构有关的定义

Linux内核的信号量在概念和原理上和用户态的System V的IPC机制信号量是相同的,不过他绝不可能在内核之外使用,他是一种睡眠锁。如果有一个任务想要获得已被占用的信号量时,信号量会将其放入一个等待队 列(他不是站在外面痴痴地等待而是将自己的名字写在任务队列中)然后让其睡眠。当持有信号量的进程将信号释放后,处于等待队列中的一个任务将被唤醒(因为 队列中可能不止一个任务),并让其获得信号量。这一点和自旋锁不同,处理器能去执行其他代码。(阻塞,睡眠,等待wakeup)

>>>>进程是如何睡眠的呢?

信号量更有一个特征,就是他允许多个持有者,而自旋锁在所有时候只能允许一个持有者。当然我们经常遇见也是只有一个持有者,这种信号量叫二值信号量或叫互斥信号量。允许有多个持有者的信号量叫计数信号量,在初始化时要说明最多允许有多少个持有者(Count值)

int down_interruptible(struct semaphore * sem);
该函数功能和down类似,不同之处为,down不会被信号(signal)打断,但down_interruptible能被信号打断,因此该函数有返回值来区分是正常返回还是被信号中断,如果返回0,表示获得信号量正常返回,如果被信号打断,返回-EINTR。
int down_trylock(struct semaphore * sem);
该函数试着获得信号量sem,如果能够即时获得,他就获得该信号量并返回0,否则,表示不能获得信号量sem,返回值为非0值。因此,他不会导致调用者睡眠,能在中断上下文使用。
void up(struct semaphore * sem);
该函数释放信号量sem,即把sem的值加1,如果sem的值为非正数,表明有任务等待该信号量,因此唤醒这些等待者。
阅读(1600) | 评论(0) | 转发(0) |
0

上一篇:自旋锁

下一篇:指针数组与数组指针

给主人留下些什么吧!~~