LINUX系统有大量的资源,内核在使用这些资源时会发生竞争,在内核开发的时候为避免竞争的发生,通常用信号量来解决.
在LINUX2.6内核中提供了一些信号量的操作,信号量的操作包含在#include<asm/semaphore.h>头文件中
DECLARE_MUTEX(name);
#申明一个名为name信号量 并该信号量被初始化为1.
DECLARE_MUTEX_LOCKED(name);
#申明一个名为name信号量 并该信号量被初始化为0.
#对于一个动态分配的信号量用下面两个函数对信号量进行初始化
void init_MUTED(struct semaphore *sem);
void init_MUTED_LOCKED(struct semaphore *sem);
对于信号量的操作一般采用原语操作,或者称为P操作和V操作.在LINUX中用down函数来完成P操作.对信号量减1,如果信号量小于1,说明申请资源被占用,调用者则进入睡眠,相反资源可以利用,占用资源.up函数完成相应的V操作.信号量被使用结束后要释放信号量,释放信号量由up函数完成,一但调用up函数,资源的使用者不在持有信号量,退出资源.up函数对信号量加一.对于down函数有三个不同的函数,第一个在调用down函数期间不可中断,第二个则允许在down函数调用期间被中断,down_trylock则不睡眠,如果在调用期间没有信号量个可以获得,则立即返回一个非零值.
void down(struct semaphore *sem );
int down_interruptible(struct semaphore *sem);
int down_trylock(struct semaphore *sem);
void up(struct semaphore *sem)
LIUNX中还提供了信号量的读写函数,用这些函数必须包含 <linux/rwsem.h>头文件.
struct rw_semaphore;
在读写信号量时必须先初始化,init_rwsem为初始化函数.
init_rwsem(struct rw_semaphore *sem);
down_read函数提供对被保护的资源只读操作,
void down_read(struct rw_semaphore *sem)
int down_read_trylock(struct rw_semaphore *sem)
void up_read(struct rw_semaphore *sem);
int down_write(struct rw_semaphore *sem)
int down_write_trylock(struct rw_semaphore *sem);
void downgrade_write(struct rw_semaphore *sem);