*看了一段时间Linux内核源代码了,经常会在代码中看到down()、up()、spin_lock()、spin_unlock()、read_lock()、write_lock()、read_unlock()、write_unlock()等函数。本篇就先来看down()、up()是干什么的。。。它们的底层都是如何实现的。。。→_→*
down()(P操作)
内核中通过信号量(semaphore)来实现进程间对共享资源的互斥访问,提供了down()函数(P操作)和up()函数(V操作)。
- 内核中信号量的数据结构
//linux-2.4.0\include\asm-i386\Semaphore.h struct semaphore { atomic_t count;//计数器,表示可用资源的数量 int sleepers;//等待进程的数量(其实只代表有没有进程等待) wait_queue_head_t wait;//进程的等待队列 #if WAITQUEUE_DEBUG long __magic; #endif };
- 初始化信号量
#if WAITQUEUE_DEBUG # define __SEM_DEBUG_INIT(name) \ , (int)&(name).__magic #else # define __SEM_DEBUG_INIT(name) #endif //初始化count与等待队列 #define __SEMAPHORE_INITIALIZER(name,count) \ { ATOMIC_INIT(count), 0, __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) \ __SEM_DEBUG_INIT(name) } //初始化信号量 #define __MUTEX_INITIALIZER(name) \ __SEMAPHORE_INITIALIZER(name,1) #define __DECLARE_SEMAPHORE_GENERIC(name,count) \ struct semaphore name = __SEMAPHORE_INITIALIZER(name,count) //声明初始值为1的信号量