同步机制

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 同步机制的更多相关文章

  1. Innodb 锁系列2 事务锁

    上一篇介绍了Innodb的同步机制锁:Innodb锁系列1 这一篇介绍一下Innodb的事务锁,只所以称为事务锁,是因为Innodb为实现事务的ACID特性,而添加的表锁或者行级锁. 这一部分分两篇来 ...

  2. Java并发编程:Java中的锁和线程同步机制

    锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新 ...

  3. MySQL锁系列1

    http://www.cnblogs.com/xpchild/p/3782311.html   MySQL的锁:MySQL内部有很多种类的锁,按照用途不同,可以分为两类:1. 保护内存结构的锁,实现同 ...

  4. MySQL系列:innodb源代码分析之线程并发同步机制

    innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比較高效的并发同步机制. innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进 ...

  5. InnoDB锁机制分析

    InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过 ...

  6. MySQL数据恢复和复制对InnoDB锁机制的影响

    MySQL通过BINLOG记录执行成功的INSERT,UPDATE,DELETE等DML语句.并由此实现数据库的恢复(point-in-time)和复制(其原理与恢复类似,通过复制和执行二进制日志使一 ...

  7. [转载] 数据库分析手记 —— InnoDB锁机制分析

    作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工 ...

  8. Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁

    相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ...

  9. MySQL · 引擎特性 · InnoDB 同步机制

    前言 现代操作系统以及硬件基本都支持并发程序,而在并发程序设计中,各个进程或者线程需要对公共变量的访问加以制约,此外,不同的进程或者线程需要协同工作以完成特征的任务,这就需要一套完善的同步机制,在Li ...

随机推荐

  1. linux下rm误删除数据库文件的恢复方法

    在linux redhat 5.4版本,rm误删除数据库文件的恢复过程分享.测试没有问题,可用. 1.首先测试rm 误删除数据库文件 [oracle@primary dbwdn]$ ll total ...

  2. 直接下载完整chrome浏览器的方法

    目前通过下吗的链接可以获得独立的安装包. http://www.google.com/chrome/eula.html?standalone=1&hl=zh-CN

  3. VC++创建、调用dll的方法步骤

    文章来源:http://www.cnblogs.com/houkai/archive/2013/06/05/3119513.html 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有 ...

  4. 1022: [SHOI2008]小约翰的游戏John - BZOJ

    Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...

  5. 团队软件开发_基于windows下截屏软件关于NABC框架的特点

    经过我们小组数次的激烈讨论,就自己的能力和时间而言,我们小组的初步的计划是开发一款基于windows下的截图软件. 关于这个软件的功能,我们初步的想法如下: 1.能在windows下后台运行,有相应的 ...

  6. [转载]HTML5 Audio/Video 标签,属性,方法,事件汇总

    <audio> 标签属性: src:音乐的URL preload:预加载 autoplay:自动播放 loop:循环播放 controls:浏览器自带的控制条 <audio id=& ...

  7. c#调用命令行遇到带空格的路径

    想用 c#调用如下的DOS命令: C:\Program Files\Common Files\System\DBWatcherInstall\dtexec.exe /f C:\Program File ...

  8. CVE爬虫抓取漏洞URL

    String url1="http://www.cnnvd.org.cn/vulnerability/index/vulcode2/tomcat/vulcode/tomcat/cnnvdid ...

  9. Python之异常篇 [待更新]

    简介 当你的程序中出现某些 异常的 状况的时候,异常就发生了.例如,当你想要读某个文件的时候,而那个文件不存在.或者在程序运行的时候,你不小心把它删除了.上述这些情况可以使用异常来处理. 假如你的程序 ...

  10. RGB颜色查询对照表

    RGB颜色查询对照表     RGB颜色对照表   #FFFFFF2015-02-05   #FFFFF0   #FFFFE0   #FFFF00   #FFFAFA   #FFFAF0   #FFF ...