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的值为非正数,表明有任务等待该信号量,因此唤醒这些等待者。
阅读(1661) | 评论(0) | 转发(0) |