Linux内核中的互斥操作(1)——信号量

*看了一段时间Linux内核源代码了,经常会在代码中看到down()、up()、spin_lock()、spin_unlock()、read_lock()、write_lock()、read_unlock()、write_unlock()等函数。本篇就先来看down()、up()是干什么的。。。它们的底层都是如何实现的。。。→_→*

  1. 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的信号量
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值