zoukankan      html  css  js  c++  java
  • 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的持有和释放的开销。

      总的来说,解决了多平台的问题,但引入了部分开销。

  • 相关阅读:
    KMP算法与字符串匹配问题
    贪婪算法(贪心算法)
    普里姆算法(Prim)与最小生成树问题
    克鲁斯卡尔算法(Kruskal算法)与最小生成树问题
    Dijkstra算法与最短路径问题
    SpringCloud(十一)使用actuator和dashborad、turbine对微服务进行监控
    博客美化——页面白天黑夜切换
    Spring5学习笔记——day01
    Mybatis学习笔记——day06
    Mybatis学习笔记——day05
  • 原文地址:https://www.cnblogs.com/xpchild/p/3874000.html
Copyright © 2011-2022 走看看