第3课:阀锁,配置,日志等
锁
- 和普通数据库的“锁”有严格的区别
- 关系型数据库中的记录锁一般在数据库代码中实现
- 系统锁很多在操作系统内核,结合硬件实现
- 锁的类型
- 自旋锁SpinLock
- 信号量Semaphore
- 互斥量Mutex
CPU缓存
- 缓存散列机制
- Cache miss
- Capacity miss
- Associaativity miss
- Write miss
- Communication miss
- MESI
- Modified
- Exclusive
- 该数据保证不会再其他CPU的缓存中出现
- 没有被当前CPU更改
- Shared
- Invalid
- MESI消息
- Read:包含该缓存需要读取数据的物理地址
- Read Response:包含read请求地址对应的数据。数据来源可能是主内存或者另一个CPU
- Invalidate:无效化指令,通知其他CPU无效化一个物理地址
- Invalidate Acknowledge:无效化确认。当一个CPU无效化地址后,会发送 无效化确认消息
- Read Invalidate:读无效化指令,读取并无效化指定的内存地址,为Read与Invalidate的整合,发送的CPU需要等待Read Response与Invalidate Acknowledge消息
- Writeback:写入消息,将缓存中的数据写入主内存,同时允许modified状态的数据从缓存中弹出
内存栅Memory Barrier
smp_mb();
不同cpu实现
自旋锁
SpinLock
线程中为了得到某个锁而不停地处于循环中,反复检测一个锁是否空闲
- 在短缩的场景中可以避免不必要的线程切换
长锁的场景中会浪费不必要的CPU资源
信号量
Semaphore
提供了一个抽象数据类型的计数器
- Wait: 计数器减一,如果计数器为负,则wait操作所在线程移入等待队列
- Signal: 计数器加一,如果增加前的数值为负,则将被阻塞线程移入执行队列
一般使用进程队列
互斥量
- Mutex (Mutual Exclusion)
- 不允许两个进程或线程同时访问临界区
- 临界区意味着进程或线程访问共享资源的期间
- Linux:pthread_mutex*
- 实现机制在不同平台各异
- 以Linux举例,pthread_mutex_lock调用Futex(Fast Userspace mutex).Futex 使用底层CPU指令调用实现基本的原子操作。如果无需等待则不进行上下文切换而直接返回,否则将线程置于等待队列。
- 互斥锁
- pthread_mutex_lock
- pthread_mutex_unlock
- pthread_mutex_trylock
- 共享锁
- pthread_rwlock_rdlock
- pthread_rwlock_tryrdlock
- pthread_rwlock_wrlock
- pthread_rwlock_trywrlock
- pthread_rwlock_unlock
- 注:pthread_rwlock不支持递归读写操作,也就是说一个线程写锁喉,放锁前请求锁则会出现未知行为
条件变量(Condition Variable)
- 利用线程间共享的全局变量进行同步的一种机制
- POSIX
- pthread_cond_wait
- pthread_cond_timedwait
- pthread_cond_signal
- pthread_cond_broadcast
第三课 第三部分
数据库引擎开发 笔记 2017
原文:https://www.cnblogs.com/my-flash/p/12380327.html