berkeley db self block机制的研究

Posted brayden

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了berkeley db self block机制的研究相关的知识,希望对你有一定的参考价值。

bdb mutex有两种用途:

  1.   作为latch, 保护资源(内存数据结构, 文件操作);
  2.   wait-notifiy. 设置SELF_BLOCK标志位. 用在逻辑锁, group commit时等待.

mux_win32.c 和mut_tas.c的实现类似,

  1. spin, 通过OS机制去 原子tas某lock标志位; 成功则退出.
  2. spin不成功, 则 等待-重试. win32通过 WaitForSingleObject, tas通过 OS 线程sleep原语(win32 unlock, 调用PlusEvent)


在mut_pthread.c 中, 不去spin

  1. pthread_mutex_lock;
  2. 如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则被锁住. 

  1. win32/tas: 通过tas 标志位. 因为mtx标志位已经设置, 再次lock会spin-wait-retry不断重复;
  2. 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为啥又叫做db4

在 Berkeley DB Core 和 Berkeley DB JE 之间进行选择

berkeley-db-je 的最新版本是啥?

我可以使用 oracle berkeley db java edition 的 c 实现(python bsddb)创建的 bdb(berkeley db)文件吗?

berkeley db java edition怎样存储数据库?

Berkeley-DB:多个数据库上的原子事务