linux 中的信号互斥机制

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);

你可能感兴趣的:(linux 中的信号互斥机制)