Linux内核设计与实现读书笔记(8)-内核同步方法【转】
原子整数操作 |
描述 |
ATOMIC_INIT(int i) |
在声明一个atomic_t变量时,将它初始化为i |
int atomic_read(atomic_t *v) |
原子地读取整数变量v |
void atomic_set(atomic_t *v, int i) |
原子地设置v值为i |
void atomic_add(int i, atomic_t *v) |
原子地给v加i |
void atomic_sub(int i, atomic_t *v) |
原子地从v减i |
void atomic_inc(atomic_t *v) |
原子地给v加1 |
void atomic_dec(atomic_t *v) |
原子地给v减1 |
int atomic_sub_and_test(int i, atomic_t *v) |
原子地从v减i,若结果等于0返回真,否则返回假 |
int atomic_add_negative(int i, atomic_t *v) |
原子地从v加i,若结果是负数返回真,否则返回假 |
int atomic_dec_and_test(atomic_t *v) |
原子地从v减1,若结果等于0返回真,否则返回假 |
int atomic_inc_and_test(atomic_t *v) |
原子地从v加1,若结果等于0返回真,否则返回假 |
原子位操作 |
描述 |
void set_bit(int nr, void *addr) |
原子地设置addr所指对象的第nr位 |
void clear_bit(int nr, void *addr) |
原子地清空addr所指对象的第nr位 |
void change_bit(int nr, void *addr) |
原子地翻转addr所指对象的第nr位 |
int test_and_set_bit(int nr, void *addr) |
原子地设置addr所指对象的第nr位,并返回原先的值 |
int test_and_clear_bit(int nr, void *addr) |
原子地清空addr所指对象的第nr位,并返回原先的值 |
int test_and_change_bit(int nr, void *addr) |
原子地翻转addr所指对象的第nr位,并返回原先的值 |
int test_bit(int nr, void *addr) |
原子地返回addr所指对象的第nr位 |
方法 |
描述 |
spin_lock( ) |
获取指定的自旋锁 |
spin_lock_irq( ) |
禁止本地中断并获取指定的锁 |
spin_lock_irqsave( ) |
保存本地中断的当前状态,禁止本地中断,并获取指定的锁 |
spin_unlock( ) |
释放指定的锁 |
spin_unlock_irq( ) |
释放指定的锁,并激活本地中断 |
spin_unlock_irqrestore( ) |
释放指定的锁,并让本地中断恢复到以前的状态 |
spin_lock_init( ) |
初始化指定的spinlock_t |
spin_trylock( ) |
试图获取指定的锁,如果未获取则返回非0 |
spin_is_locked( ) |
如果指定的锁当前正在被获取则返回非0,否则返回0 |
spin_lock_bh( ) |
禁止所有下半部的执行,并获取指定的锁 |
spin_unlock_bh( ) |
释放指定的锁,允许下半部的执行 |
方法 |
描述 |
read_lock( ) |
获取指定的读锁 |
read_lock_irq( ) |
禁止本地中断并获取指定的读锁 |
read_lock_irqsave( ) |
保存本地中断的当前状态,禁止本地中断并获取指定的读锁 |
read_unlock( ) |
释放指定的读锁 |
read_unlock_irq( ) |
释放指定的读锁,并激活本地中断 |
read_unlock_irqrestore( ) |
释放指定的读锁,并让本地中断恢复到以前的状态 |
write_lock( ) |
获取指定的写锁 |
write_lock_irq( ) |
禁止本地中断并获取指定的写锁 |
write_lock_irqsave( ) |
保存本地中断的当前状态,禁止本地中断并获取指定的写锁 |
write_unlock( ) |
释放指定的写锁 |
write_unlock_irq( ) |
释放指定的写锁,并激活本地中断 |
write_unlock_irqrestore( ) |
释放指定的写锁,并让本地中断恢复到以前的状态 |
write_trylock( ) |
试图获得指定的写锁;如果写锁不可用,返回非0值 |
rw_lock_init( ) |
初始化指定的rwlock_t |
rw_is_locked( ) |
如果指定的锁当前已被持有,该函数返回非0值,否则返回0 |
方法 |
描述 |
sema_init(struct semaphore *, int) |
以指定的计数值初始化动态创建的信号量 |
init_MUTEX(struct semaphore *) |
以计数值1初始化动态创建的信号量 |
init_MUTEX_LOCKED(struct semaphore *) |
以计数值0初始化动态创建的信号量(初始化为加锁状态) |
down_interruptible(struct semaphore *) |
试图获得指定的信号量,如果信号已被争用,则进入可中断睡眠状态 |
down(struct semaphore *) |
试图获得指定的信号量,如果信号已被争用,则进入不可中断睡眠状态 |
down_trylock(struct semaphore *) |
试图获得指定的信号量,如果信号已被争用,则立刻返回非0值 |
up(struct semaphore *) |
释放指定的信号量,如果睡眠队列不空,则唤醒其中的一个任务 |
方法 |
描述 |
init_completion(struct completion *) |
初始化指定的动态创建的完成变量 |
wait_for_completion(struct completion *) |
等待指定的完成变量接受信号 |
completion(struct completion *) |
发信号唤醒任何等待任务 |
方法 |
描述 |
Preempt_disable( ) |
禁止内核抢占 |
Preempt_enable( ) |
激活内核抢占并检查和执行被挂起的需要调度的任务 |
Preempt_enable_no_resched( ) |
激活内核抢占但不再进行调度 |
Preempt_count( ) |
返回抢占计数 |
方法 |
描述 |
rmb( ) |
阻止跨跃屏障的载入动作发生重排序 |
read_barrier_depends( ) |
阻止跨跃屏障的具有数据依赖关系的载入动作重排序 |
wmb( ) |
阻止跨跃屏障的存储动作发生重排序 |
mb( ) |
阻止跨跃屏障的载入和存储动作重新排序 |
smp_rmb( ) |
在SMP上提供rmb( )功能,在UP上提供barrier( )功能 |
smp_read_barrier_depends( ) |
在SMP上提供read_barrier_depends( )功能,在UP上提供barrier( )功能 |
smp_wmb( ) |
在SMP上提供wmb( )功能,在UP上提供barrier( )功能 |
smp_mb( ) |
在SMP上提供mb( )功能,在UP上提供barrier( )功能 |
barrier( ) |
组织编译器跨屏障对载入或存储操作进行优化 |