towake up possible hanging threads if

they are missed inmutex_signal_object. */

if (mutex->waiter != 0) {

mutex->waiter = 0;

os_event_set(mutex->event);

}

与InnoDB自旋互斥锁的lock_word不合,rw_lock_t中的lock_word是int 型,留意不是unsigned的,其取值范围是(-2X_LOCK_DECR, X_LOCK_DECR],个中X_LOCK_DECR为0x00100000,差不多100多W的一个数。在InnoDB自旋互斥锁互斥锁中,lock_word的取值范围只有0,1,因为这两个状况就能把互斥锁的所有状况都表示出来了,也就是说,只须要查看一下这个lock_word就能肯定当前的线程是否能获得锁。rw_lock_t中的lock_word也扮演了雷同的角色,只须要查看一下当前的lock_word落在哪个取值范围中,就肯定当前哨程可否获得锁。至于rw_lock_t中的lock_word是若何做到这一点的,这其实是InnoDB读写锁甚至InnoDB同步机制中最神奇的处所,下文我们会具体分析。

InnoDB针对不合的操作体系以及编译器情况,本身封装了一套原子操作,在头文件os0sync.h中。下面的操作基于Linux x86 64位情况, gcc 4.1以上的版本进行分析。

os_compare_and_swap_xxx(ptr, old_val, new_val)类型的操作底层都应用了gcc包装的__sync_bool_compare_and_swap(ptr, old_val, new_val)函数,语义为,交换成功则返回true,ptr是交换后的值,old_val是之前的值,new_val是交换后的预期值。这个原子操作是个内存樊篱(full memory barrier)。

os_atomic_increment_xxx类型的操作底层应用了函数__sync_add_and_fetch,os_atomic_decrement_xxx类型的操作应用了函数__sync_sub_and_fetch,分别表示原子递增和原子递减。这个两个原子操作也都是内存樊篱(full memory barrier)。

别的一个比较重要的原子操作是os_atomic_test_and_set_byte(ptr, new_val),这个操作应用了__sync_lock_test_and_set(ptr, new_val)这个函数,语义为,把ptr设置为new_val,同时返回旧的值。这个操作供给了原子改变某个变量值的操作,InnoDB锁实现的同步机制中,大年夜量的用了这个操作,是以比较重要。须要留意的是,参看gcc文档,这个操作不是full memory barrier,只是一个acquire barrier,简单的说就是,代码中__sync_lock_test_and_set之后操作不克不及被乱序或者重排到__sync_lock_test_and_set之前,然则__sync_lock_test_and_set之前的操作可能被重排到其之后。

关于内存樊篱的专门指令,MySQL 5.7供给的比较完美。os_rmb表示acquire barrier,os_wmb表示release barrier。如不雅在编程时,须要在某个地位精确的攫取一个变量的值瓯,记得在攫取之前加上os_rmb,同理,如不雅须要在某个地位包管一个变量已经被写了,记得在写之后调用os_wmb。

前提通知机制

前提通知机制在多线程协作中异常有效,一个线程往往须要等待其他线程完成指定工作后,再进行工作,这个时刻就须要有线程等待和线程通知机制。Pthread_cond_XXX类似的变量和函数来完成等待和通知的工作。InnoDB中,对Pthread库进行了简单的封装,并在此基本上,进一步抽象,供给了一套便利易用的接口函数给调用者应用。

体系前提变量

在文件os0sync.cc中,os_cond_XXX类似的函数就是InnoDB对Pthread库的封装。常用的几个函数如:

os_cond_t是核心的操尴尬刁难象,其实就是pthread_cond_t的一层typedef罢了,os_cond_init初始化函数,os_cond_destroy烧毁函数,os_cond_wait前提等待,不会超时,os_cond_wait_timed前提等待,如不雅超时则返回,os_cond_broadcast唤醒所有等待线程,os_cond_signal只唤醒个一一个等待线程,然则在浏览源码的时刻发明,似乎没有什么处所调用了os_cond_signal。。。

此外,还有一个os_cond_module_init函数,用来window下的初始化操作。

event是一个InnoDB前提变量,当当前的锁已经被一个线程以写锁方法独有时,后续的读锁和写锁都等待在这个event上,当这个线忱矸⑴写锁时,等待在这个event上的所有读锁和写锁同时竞争。waiters这变量,与event一路用,当有等待者在等待时,这个变量被设置为1,不然为0,锁被释放的时刻,须要经由过程这个变量来断定有没有等待者大年夜而履行os_event_set。

在InnoDB下,os_cond_XXX模块的函数主如果给InnoDB本身设计的前提变量应用。

InnoDB前提变量

如不雅在InnoDB层直接应用体系前提变量的话,重要有四个弊病,起首,弊病1,体系前提变量的应用须要与一个体系互斥锁(详见下一节)相合营应用,应用完还要记得及时释放,应用者会比较麻烦。接着,弊病2,在前提等待的时刻,须要在一个轮回中等待,应用者照样比较麻烦。最后,弊病3,也是比较重要的,不便利体系监控。

推荐阅读

数字化转型已成为趋势,然而既然是转型则必定会带来阵痛,新技巧在带来新的颠覆的同时,也给IT运维治理带来新的挑衅,包含稳定性、扩大性、灵活性、成本、投资回报率等等。对于IT治理者而言,若何经由过程大年夜数据>>>详细阅读

地址:http://www.17bianji.com/lsqh/39799.html

mysql引擎机制_MySQL引擎特性:InnoDB同步机制相关推荐

  1. mysql 开启引擎命令_MySql中启用InnoDB数据引擎的方法

    1.存储引擎是什么? Mysql中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...

  2. MySQL 引擎 阿里_MySQL引擎讲解-阿里云开发者社区

    MySQL支持三个引擎:ISAM.MyISAM和HEAP,根据需求不同来选择不同的引擎 数据库的引擎到决于 MySQL 在安装的时候是如何被编译的,要添加一个新的引擎,就必须重新编译 --with-p ...

  3. mysql 主从 问题_Mysql解决主从不同步问题

    1. 该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况 stop slave; set global sql_slave_skip_counter =1;#表示跳 ...

  4. android fence机制,Android中的GraphicBuffer同步机制-Fence

    Fence是一种同步机制,在Android里主要用于图形系统中GraphicBuffer的同步.那它和已有同步机制相比有什么特点呢?它主要被用来处理跨硬件的情况.尤其是CPU.GPU和HWC之间的同步 ...

  5. java线程同步机制有哪些_多线程同步机制包括哪些,java线程同步机制

    多线程同步机制包括哪些什么是多线程同步机制,多线程同步机制包括:1.临界段用于实现"独占占有":2.信号量用于跟踪有限的资源:3.互斥是核心对象,可以实现不同线程之间的" ...

  6. java线程同步机制有哪些_多线程同步机制包括哪些

    多线程同步机制包括:1.Critical Section用来实现"排他性占有":2.Semaphore被用来追踪有限的资源:3.Mutex是核心对象,可以在不同的线程之间实现&qu ...

  7. 3种mysql的储存机制_MySQL三种InnoDB、MyISAM和MEMORY存储引擎对比

    三种引擎的区别: 事务:InnoDB支持事务,MyISAM和MEMORY两个不支持. 存储限制:InnoDB有64TB的存储限制,MyISAM和MEMORY要跟具体情况而定. 空间使用:InnoDB对 ...

  8. mysql myisam 优点_mysql引擎Innodb和Myisam对比介绍和优缺点

    一.myisam引擎 1.mysql默认引擎,不支持事务* 2.表级锁定,更新时,锁定机制是整张表被锁定,其它连接无法更新表的数据,效率比较低下.锁的机制成本很少,但大大降低了并发性能* 3.读写互相 ...

  9. mysql public权限_MySQL · 引擎特性 · Binlog encryption 浅析

    背景介绍 为了保障数据安全,MySQL 在 5.7 版本就支持了 InnoDB 表空间加密,之前写了一篇月报介绍过,参考InnoDB 表空间加密.文章开头也提到过,MariaDB 除了对表空间加密,也 ...

最新文章

  1. Fast ORB-SLAM
  2. OVH数据中心失火事件关于运维管理的思考
  3. ITK:翻译矢量图像
  4. API接口设计 注意问题
  5. android京东首页轮播代码,web移动端-轮播
  6. 基于linux的地震数据处理软件的设计与实现,地震数据处理软件系统与应用实验指导书...
  7. webServlet(/) 和 webServlet(/*) 的区别
  8. uwsgi+django在ubuntu下命令部署亲测ok
  9. ssis导入xml_使用XML文件配置SSIS包
  10. C++ new 的三种面貌
  11. 计算机管理教学 (cmi) 包括( )等功能,计算机管理教学(CMI)的未来
  12. Linux的重要子目录
  13. 基于visual Studio2013解决C语言竞赛题之1033数字交换
  14. Java基本类型占用字节数(或 bit数)
  15. Robocode 超级机器人 “波”统计瞄准算法
  16. ios 开发证书导出p12文件_iOS 证书(.p12)和描述文件(.mobileprovision)的导出和使用方法...
  17. 陀螺仪、加速度计与MPU6050的关系
  18. Microsoft Orleans 之 入门指南
  19. python解椭圆方程的例题_椭圆标准方程典型例题及练习题
  20. 常用的七种数据分析方法有哪些?

热门文章

  1. 可视化 —— 二维平面上的散列点在坐标轴方向上的移动
  2. 极简代码(五)—— 斐波那契数列
  3. 关于e的等式及相关证明
  4. 被平均(统计平均)的陷阱
  5. iOS和android运存机制,再次确认苹果的1G运存相当于安卓的4G运行内存
  6. php 数值相加_php – 合并2个数组并求值(数值键)
  7. linux面试题_2019年常见的Linux面试题及答案解析,哪些你还不会?
  8. python函数定义及调用-浅谈Python中函数的定义及其调用方法
  9. python基础编程语法-Python编程入门——基础语法详解(经典)
  10. 免费python自学攻略-给初学者推荐的10个Python免费学习网站!赶紧收藏吧!