开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散
媒介
现代操作体系以及硬件根本都支撑场发法度榜样,而在并发法度榜样设计中,各个过程或者线程须要对公共变量的拜访加以制约,此外,不合的过程或者线程须要协同工作以完成特点的义务,这就须要一套完美的同步机制,在Linux内核中有响应的技巧实现,包含原子操作,旌旗灯号量,互斥锁,自旋锁,读写锁等。InnoDB推敲到效力和监控两方面的原因,实现了一套独有的同步机制,供给给其他模块调用。本文的分析默认基于MySQL 5.6,CentOS 6,gcc 4.8,其他版本的信息会另行指出。
基本常识
同步机制对于其他数据库模块来说相对自力,然则须要比较多的操作体系以及硬件常识,这里简单介绍一下几个有效的概念,便于读者懂得后续概念。
起首来说说两个线程下会产生的问题。创建后,正常的应用次序是如许的,线程A起首os_event_reset(步调1),然后os_event_wait(步调2),接着线程B做完该做的工作后,履行os_event_set(步调3)发送旌旗灯号,通知线程A停止等待,然则在多线程的情况中,会出现以下两种步调次序错乱的情况:乱序A: 步调1--步调3--步调2,乱序B: 步调3--步调1--步调2。对于乱序B,属于前提通知在前提等待之前产生,今朝InnoDB前提变量的机制下,会产生无穷等待,所以上层调用的时刻必定要留意,例如在InnoDB在实现互斥锁和读写锁的时刻为了防止产生前提通知在前提等待之前产生,在等待之前对lock_word再次进行了断定,详见InnoDB自旋互斥锁这一节。为懂得决乱序A,InnoDB在核心数据构造os_event中惹人布尔型变量is_set,is_set这个变量就表示是否已经产生过前提通知,在每次调用前提通知之前,会把这个变量设置为true(在os_event_reset时改为false,便于多次通知),在前提等待之前会检查一下这变量,如不雅这个变量为true,就不再等待了。所以,乱序A也能包管不会产生无穷等待。
内存樊篱 :为懂得决弱内存模型造成的问题,须要一种能控制指令重排或者乱序履行法度榜样的手段,这种技巧就叫做内存樊篱,法度榜样员只须要在代码中插入特定的函数,就能控制弱内存模型带来的负面影响,当然,因为影响了乱序和重排这类的优化,对代码的履行效力有必定的影响。具体实现上,内存樊篱技巧分三种,一种是full memory barrier,即barrier之前的操作不克不及乱序或重排到barrier之后,同时barrier之后的操作不克不及乱序或重排到barrier之前,当然这种full barrier对机能影响最大年夜,为了进步效力才有了别的两种:acquire barrier和release barrier,前者只包管barrier后面的操作不克不及移到之前,后者只包管barrier前面的操作不移到之后。
互斥锁 :互斥锁有两层语义,除了大年夜家都知道的排他性(即只许可一个线程同时拜访)外,还有一层内存樊篱(full memory barrier)的语义,即包管临界区的操作不会被乱序莅临界区外。Pthread库琅绫擎常用的mutex,conditional variable等操作都自带内存樊篱这层语义。此外,应用pthread库,每次调用都须要应用法度榜样大年夜用户态陷入到内核态中查看当前情况,在锁冲突不是很严重的情况下,效力比拟较较低。

接下来,具体介绍一下,mutex_enter和mutex_exit的逻辑,InnoDB自旋互斥锁的精华都在这两个函数中。
递归锁 :如不雅在同一个线程中,对同一个互斥锁持续加锁两次,即第一次加锁后,没有释放,持续进行对这个锁进行加锁,那么如不雅这个互斥锁不是递归锁,将导致逝世锁。可以把递归锁懂得为一种特别的互斥锁。
逝世锁 :构成逝世锁有四大年夜前提,个中有一个就是加锁次序不一致,如不雅能包管不合类型的锁按照某个特定的次序加锁,就能大年夜大年夜降低逝世锁产生的概率,之所以不克不及完全清除,是因为同一种类型的锁依然可能产逝世活锁。别的,对同一个锁持续加锁两次,如不雅长短递归锁,也将导致逝世锁。
原子操作
现代的cpu供给了对单一变量简单操作的原子指令,即这个变量的┞封些简单操作只须要一条cpu指令即可完成,如许就不消对这个操作加互斥锁了,在锁冲突不激烈的情况下,削减了用户态和内核态的切换,化消极锁为乐不雅锁,大年夜而进步了效力。此外,如今外面很火的所谓无锁编程(类似CAS操作),底层就是用了这些原子操作。gcc为了便利法度榜样员应用这些cpu原子操作,供给了一系列__sync开首的函数,这些函数如不雅包含内存樊篱语义,则同时禁止编译器指令重排和cpu乱序履行。
- __sync_lock_test_and_set(mutex->lock_word, 0);
- /* A problem: we assume that mutex_reset_lock word
- is a memory barrier, that is when
推荐阅读
数字化转型已成为趋势,然而既然是转型则必定会带来阵痛,新技巧在带来新的颠覆的同时,也给IT运维治理带来新的挑衅,包含稳定性、扩大性、灵活性、成本、投资回报率等等。对于IT治理者而言,若何经由过程大年夜数据>>>详细阅读
本文标题:MySQL引擎特性:InnoDB同步机制
地址:http://www.17bianji.com/lsqh/39799.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示