未加星标

InnoDB定义的Mutex--01

字体大小 | |
[数据库(mysql) 所属分类 数据库(mysql) | 发布者 店小二05 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏

InnoDB 定义的 Mutex

InnoDB 在 ib0mutex.h 文件中定义了六种自定义的 Mutex 如下:

q OSBasicMutex : OS 的 Event 定义的 Mutex ,依赖于具体的 OS ;施加锁只尝试一次。如下面的初始化代码段等。

q OSTrackMutex :继承自 OSBasicMutex ,依赖于 OS ;施加锁尝试函数参数指定的次数( max_spins 参数指定尝试的次数)。

q TTASFutexMutex :利用 OS 的 CAS 原子指令实现锁的施加尝试,利用 TAS 实现解锁尝试。适用于 linux 的 Futex 机制 [1] 。

q TTASMutex :利用 OS 的 TAS 原子指令实现锁的施加和解锁尝试,在尝试不成的情况下,每次尝试之间需要调用 ut_delay() 进行睡眠延迟,最终尝试指定的次数( max_spins 参数指定尝试的次数)。适用于没有 Linux 的 Futex 机制情况下。

q TTASEventMutex :利用 OS 的 TAS 原子指令实现锁的施加和解锁尝试,在尝试不成的情况下,每次尝试之间需要调用 ut_delay() 进行睡眠延迟,尝试指定的次数( max_spins 参数指定尝试的次数),且最终还要等到锁为止。

q PolicyMutex :获得锁,且获得施加锁者,主要用于 Performance schema 监控。

OSBasicMutex 的初始化 init() 函数的代码段需要区分操作系统,相应的 enter() 、 destroy() 、 exit() 等函数也需要区分操作系统,根据不同的操作系统调用不同操作系统的相应函数:

#ifdef _WIN32

InitializeCriticalSection ((LPCRITICAL_SECTION) &m_mutex); // Mutex 的定义依赖于 windows 的 InitializeCriticalSection () 函数

#else

{

int ret;

ret = pthread_mutex_init (&m_mutex, MY_MUTEX_INIT_FAST); // Mutex 的定义依赖于 Posix Thread 的 pthread_mutex_init () 函数

ut_a(ret == 0);

}

#endif /* _WIN32 */

OSBasicMutex 的测试锁是否施加 try_lock() 函数的代码段如下:

/** @return true if locking succeeded */

bool try_lock () UNIV_NOTHROW

{

ut_ad(innodb_calling_exit || !m_freed);

#ifdef _WIN32

return( TryEnterCriticalSection (&m_mutex) != 0); // Mutex 的 trylock 依赖于 Windows 函数

#else

return( pthread_mutex_trylock (&m_mutex) == 0); // Mutex 的 trylock 依赖于 Posix Thread

#endif /* _WIN32 */

}

TAS 和 CAS 原子操作的定义如下:

#ifdef _WIN32

# define TAS (l, n) os_atomic_test_and_set_u32 ((l), (n)) // Windows 下利用 Test And Set 原子操作实现 TAS 操作

#else

# define TAS (l, n) os_atomic_test_and_set_ulint ((l), (n)) // 非 Windows 下利用 Test And Set 原子操作实现 TAS 操作(如 Linux 下调用 __sync_lock_test_and_set() 系统函数实现自旋锁, PostgreSQL 也同样地调用了类似的函数)

#endif /* _WIN32 */

#define CAS (l, o, n) os_val_compare_and_swap_ulint ((l), (o), (n)) // 不同 OS 下利用 Compare And Exchange 原子操作实现 CAS 操作

InnoDB 主要定义了如下类型的系统锁:

typedef ib_mutex_t RsegMutex; // 保护回滚段的系统锁

typedef ib_mutex_t TrxMutex; // 保护事务块的系统锁,这是单个事务的事务块的内容保护

typedef ib_mutex_t UndoMutex; // 保护 UNDO 日志的系统锁

typedef ib_mutex_t PQMutex; // 保护 PURGE QUERY 的系统锁

typedef

本文数据库(mysql)相关术语:navicat for mysql mysql workbench mysql数据库 mysql 存储过程 mysql安装图解 mysql教程 mysql 管理工具

主题: InnoDBWindowsLinuxPostgreSQLSQLTIUTQMRYCTI
分页:12
转载请注明
本文标题:InnoDB定义的Mutex--01
本站链接:http://www.codesec.net/view/522195.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 数据库(mysql) | 评论(0) | 阅读(92)