Innodb 锁系列1 同步机制
同步机制
Innodb实现了不依赖于平台的mutex,rwlock。
1. 全局变量
对于mutex, rwlock,都有一个全局链表。
1. mutex全局链表:mutex_list
2. rwlock全局链表:rw_lock_list
在create创建mutex 或者rwlock的时候,加入链表。
在delete销毁mutex或者rwlock的时候,从链表中删除。
3. 全局等待数组:
sync_primary_wait_array = sync_array_create(OS_THREAD_MAX_N, SYNC_ARRAY_OS_MUTEX);
srv_max_n_threads决定了数组的大小,即同时wait的线程数。
2. mutex
struct mutex_struct {
os_event_t event;
volatile lock_word_t lock_word;
os_fast_mutex_t os_fast_mutex;
UT_LIST_NODE_T(mutex_t) list;
event: wait,notify使用的条件变量,在pthread中等同于condition。
lock_word: 如果系统支持TAS指令,那么就直接使用tas指令
os_fast_mutex:如果系统部支持TAS,那么在linux环境下就是封装的pthread_mutex;
list: innodb中的所有mutex都维持一个链表。
假设我们讨论的平台是x86-64位的linux系统。
mutex的相关函数:
mutex_create_func: 创建mutex,condition
mutex_own:判断是否是当前线程持有mutex
mutex_enter:获取mutex,使用的是trylock方式,如果不能获取,则进入spin,仍然不能获取,则进入等待队列
mutex_exit:释放mutex。
3. rw_lock:
struct rw_lock_struct {
volatile lint lock_word;
/*!< Holds the state of the lock. */
volatile ulint waiters; /*!< 1: there are waiters */
os_event_t event; /*!< Used by sync0arr.c for thread queueing */
os_event_t wait_ex_event;
mutex_t mutex;
UT_LIST_NODE_T(rw_lock_t) list;
相关函数:
rw_lock_create_func: 初始化lock_word #define X_LOCK_DECR 0x00100000 即同时支持1,048,575 concurrent readers
rw_lock_lock_word_decr: 每次获取share_lock,就递减lock _word.
rw_lock_s_lock_spin
rw_lock_x_lock_wait
注:
整体上来看,在linux平台上,mutex,condition的实现仍然使用pthread包中的mutex,cond。 rwlock的实现不依赖于pthread_rwlock.
然后,innodb代码上多次使用数组等结构,增加了mutex的持有和释放的开销。
总的来说,解决了多平台的问题,但引入了部分开销。
Innodb 锁系列1 同步机制的更多相关文章
- Innodb 锁系列2 事务锁
上一篇介绍了Innodb的同步机制锁:Innodb锁系列1 这一篇介绍一下Innodb的事务锁,只所以称为事务锁,是因为Innodb为实现事务的ACID特性,而添加的表锁或者行级锁. 这一部分分两篇来 ...
- Java并发编程:Java中的锁和线程同步机制
锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新 ...
- MySQL锁系列1
http://www.cnblogs.com/xpchild/p/3782311.html MySQL的锁:MySQL内部有很多种类的锁,按照用途不同,可以分为两类:1. 保护内存结构的锁,实现同 ...
- MySQL系列:innodb源代码分析之线程并发同步机制
innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比較高效的并发同步机制. innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进 ...
- InnoDB锁机制分析
InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过 ...
- MySQL数据恢复和复制对InnoDB锁机制的影响
MySQL通过BINLOG记录执行成功的INSERT,UPDATE,DELETE等DML语句.并由此实现数据库的恢复(point-in-time)和复制(其原理与恢复类似,通过复制和执行二进制日志使一 ...
- [转载] 数据库分析手记 —— InnoDB锁机制分析
作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工 ...
- Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁
相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ...
- MySQL · 引擎特性 · InnoDB 同步机制
前言 现代操作系统以及硬件基本都支持并发程序,而在并发程序设计中,各个进程或者线程需要对公共变量的访问加以制约,此外,不同的进程或者线程需要协同工作以完成特征的任务,这就需要一套完善的同步机制,在Li ...
随机推荐
- MongoDB的安全性
上篇文章介绍Mongo启动了,一般数据库启动,下面的操作就是登录数据库了,之前测试数据库是否正常安装的时候也登录过数据库,现在回想一下,好像连用户名和密码都没有输入,找几篇帖子来探究下Mongodb的 ...
- Oracle的Export用法
Oracle 的 Export 命令用于导出数据库信息,既可以导出表结构,也可以导出数据,表空间,或者按用户导出等等.按照通常的说法,该命令主要是用于数据库的迁移或者备份的.下面就介绍一下该命令的部分 ...
- 三、mysql运算符
取模有2种方法: 或 mod(,) 比较一个字段的值是不是null有两种方法:is null 或 <=> null 不能直接使用 where id = null;是不对的
- ExtJs 4.2 treePanel 点击树节点 传送参数到后台(多个参数)
//***********************************************左边树开始********************************************** ...
- 基于SuperSocket实现的WebSocket(前端)
本文内容是搭配后端使用的,没看过WebSocket后端实现的童鞋们戳这里 咳咳,其实前端实现相对就容易很多了,因为我们有JavaScript WebSocket Api,它看上来大致是这样的: var ...
- 搭建Git Server
windows上如何搭建Git Server Git在版本控制方面,相比与SVN有更多的灵活性,对于开源的项目,我们可以托管到Github上面,非常方便,但是闭源的项目就会收取昂贵的费用.那么私有 ...
- python学习笔记14(多态、封装、继承)
创建自已的对象(尤其是类型或者被称为类的对象)是python非常核心的概念. 多态: 可对不同类的对象使用同样的操作. 封装:对外部世界隐藏对象的工作细节. 继承:以普通的类为基础建立专门的类对象. ...
- (转)为什么adrl r2,mem_cfg_val这里不用ldr r2,=mem_cfg_val
网址:http://blog.csdn.net/glorin/article/details/6327083 memsetup:mov r1, #MEM_CTL_BASEadrl r2,mem_cfg ...
- 利用开源项目使discus论坛与java应用同步登录和注册
最近做了一个资源库系统的项目,老师说可以搭建开源论坛替代自己开发社交模块(评论啊,反馈啊)来减轻负担,甚至提到了要给每个资源开一帖的功能..使我十分怀疑到底是减轻负担还是增加负担...不过怀疑归怀疑, ...
- xfire for web-Service
1.0 XFire XFire是codeHaus组织提供的一个开源框架,它构建了POJO和SOA之间的桥梁,主要特性就是支持将POJO通过非常简单的方式发布成Web服务,这种处理方式不仅充分发挥了PO ...