linux读写锁的理解
来源:互联网 发布:淘宝综合排名突然下降 编辑:程序博客网 时间:2024/05/27 20:27
百度百科http://baike.baidu.com/view/2214179.htm上这样说:
读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。
那么读写锁到底如何实现的,研究了一把Linux内核源码:
#define RW_LOCK_BIAS 0x01000000#define RW_LOCK_BIAS_STR "0x01000000"#if defined(CONFIG_SMP)asm(".align 4.globl __write_lock_failed__write_lock_failed: " LOCK "addl $" RW_LOCK_BIAS_STR ",(%eax)1: cmpl $" RW_LOCK_BIAS_STR ",(%eax) jne 1b " LOCK "subl $" RW_LOCK_BIAS_STR ",(%eax) jnz __write_lock_failed ret.align 4.globl __read_lock_failed__read_lock_failed: lock ; incl (%eax)1: cmpl $1,(%eax) js 1b lock ; decl (%eax) js __read_lock_failed ret");#endif#define __build_read_lock_ptr(rw, helper) \ asm volatile(LOCK "subl $1,(%0)\n\t" \ "js 2f\n" \ "1:\n" \ ".section .text.lock,\"ax\"\n" \ "2:\tcall " helper "\n\t" \ "jmp 1b\n" \ ".previous" \ ::"a" (rw) : "memory")#define __build_write_lock_ptr(rw, helper) \ asm volatile(LOCK "subl $" RW_LOCK_BIAS_STR ",(%0)\n\t" \ "jnz 2f\n" \ "1:\n" \ ".section .text.lock,\"ax\"\n" \ "2:\tcall " helper "\n\t" \ "jmp 1b\n" \ ".previous" \ ::"a" (rw) : "memory")#define read_unlock(rw) asm volatile("lock ; incl %0" :"=m" ((rw)->lock) : : "memory")#define write_unlock(rw) asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ",%0":"=m" ((rw)->lock) : : "memory")static rwlock_t file_systems_lock = RW_LOCK_UNLOCKED;#define RW_LOCK_UNLOCKED (rwlock_t) { RW_LOCK_BIAS RWLOCK_MAGIC_INIT }
从上面可以看出:
读写锁本质上是一个内存计数器,初始化成一个很大的值(第57-58行)0x01000000,表示最多可以有这么多个读者同时获取锁。
1. 获取读锁时,计数器减1,判断符号位是否为1,也就是判断是否为负数,是则表示已经有写者,读锁获取失败。符号位为0则获取读锁成功。
2. 获取写锁时,计数器减0x01000000,判断是否为0,是则表示没有其他的读者或者写者,获取锁成功。不为0,则有其他的读者或者写者,获取写锁失败。
3. 获取读锁失败时,先将计数器加1,判断值是否小于1(减1符号位为1),是则循环判读,直到值大于1。获取读锁失败的情况是已有写者,计数器的值小于等于0。
4. 获取写锁失败时,先讲计数器加0x01000000,判断值是否为0x01000000,不为0x01000000则循环判断,直到为0x01000000。为初值0x01000000表示没有了其他的读者或者写者,可以尝试获取锁了。
- linux读写锁的理解
- linux读写锁的理解
- mysql 读写锁的理解
- ReentrantReadWriteLock读写锁的理解与使用
- Linux线程的读写锁
- 关于linux的读写锁
- Linux下的读写锁
- 数据库读写分离的理解
- 对读写锁的深入理解-读写锁技术的妙用---实现缓存
- 读写锁的基本理解及简单用法
- linux系统中读写锁的问题
- Linux 下的线程读写锁
- Linux 下的线程读写锁
- Linux 下的线程读写锁
- Linux 下的线程读写锁
- Linux 下的线程读写锁
- linux下的读写锁pthread_mutex使用方法
- 理解java读写锁 ReadWriteLock
- 使用kgdb调试linux内核及内核模块
- 安心量的积累,期待质的飞跃
- Windows下SVN服务端与客户端安装
- Access、Hybrid和Trunk三种模式的理解
- Nokia的如意算盘——有感于诺记发布首款温疯手机
- linux读写锁的理解
- Pre-IPL ROM Stage disassembled code
- 修改电脑IP地址
- VMware Workstation 8正式版下载+密钥序列号+汉化补丁
- kmp算法讲解和分析
- Java学习 - Thread Synchronized (一)
- kmp算法实现
- Linux 系统内核的调试
- android ListView详解