berkeley db self block机制的研究
Posted brayden
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了berkeley db self block机制的研究相关的知识,希望对你有一定的参考价值。
bdb mutex有两种用途:
- 作为latch, 保护资源(内存数据结构, 文件操作);
- wait-notifiy. 设置SELF_BLOCK标志位. 用在逻辑锁, group commit时等待.
mux_win32.c 和mut_tas.c的实现类似,
- spin, 通过OS机制去 原子tas某lock标志位; 成功则退出.
- spin不成功, 则 等待-重试. win32通过 WaitForSingleObject, tas通过 OS 线程sleep原语(win32 unlock, 调用PlusEvent)
在mut_pthread.c 中, 不去spin
- pthread_mutex_lock;
- 如SELF_BLOCK, 通过pthread_cond_wait 做wait. (unlock时调用pthread_cond_signal)
db mutex应该提供memory barrier语义, tas中调用MEMBAR_ENTER(). x86不用考虑乱序, pthread lock会提供membar语义. pthread会设置PTHREAD_PROCESS_SHARED, 提供多进程支持.
为什么只在pthread中才考虑SELF_BLOCK呢?
SELF_BLOCK语义: 初始化mtx后, 马上lock一次. 再一次 lock则被锁住.
- win32/tas: 通过tas 标志位. 因为mtx标志位已经设置, 再次lock会spin-wait-retry不断重复;
- pthread: 仅使用pthread_mutex_lock无法满足self block. 如果同一个线程两次 lock同一mtx, 根据参数, 可能会deadlock, return error, 成功, undefined; 一个线程去unlock另一个线程 lock的mtx, 也会 error或undefined.
http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutex_lock.html
而且 文档提到: Mutexes are expected to be locked only for a few instructions.
所以必须使用conditional variable:
http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_cond_timedwait.html
基本上, condition的工作原理 和java的wait-notify完全(完全么?)一致:
- condition wait前 当前线程必须已经拿到 mutex 锁, 否则undefined;
- condition wait 释放当前mutex锁, 当前线程被block.
- wait被notify, broadcast唤醒(java notify, notify all?)
- 线程被唤醒, 在从wait返回前, 需要拿到 mtx锁, 过程和 pthread_mutex_lock一样. 没拿到被block.
- wait必须放在while(predict) 里.
mtx: locked unlocked T1: lock并被block. 得到mtx锁 T2: unlock mtx 唤醒T1
最终 mtx还是锁住的状态.
以上是关于berkeley db self block机制的研究的主要内容,如果未能解决你的问题,请参考以下文章
在 Berkeley DB Core 和 Berkeley DB JE 之间进行选择
我可以使用 oracle berkeley db java edition 的 c 实现(python bsddb)创建的 bdb(berkeley db)文件吗?