督促下自己,再发一篇关于BSD核心的MUTEX

2009-05-13 01:37:19来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折


如果全部弄清了MUTEX,turnstile,WITNESS三者间的关系也就差不多懂了,还有个事情我明白了一点
FREEBSD的锁机制很完善,设置了各种各样的MUTEX,功能强大,效率明显要高.但未知因素多,也许我还没弄清楚.
NETBSD的琐相对简单.代码量也少,涉及到的结构也少,不容易出问题.但效率比FREEBSD的要低.
LINUX的到没看过源代码,看过他的核心技术书(一本叫什么LINUX核心技术分析)关于核心同步部分.有意思的是他的自旋锁只是相对于SMP来说的.这点和FREEBSD的不同.
_lock.h文件.位于:/sys/sys/
#ifndef _SYS__LOCK_H_
#define _SYS__LOCK_H_
struct lock_object {
struct lock_class *lo_class; /*锁的类型*/
const char *lo_name;  /* 单个锁的名称. */
const char *lo_type;  /* 通用锁类型. */
u_int lo_flags;
TAILQ_ENTRY(lock_object) lo_list; /* 系统中所有锁对象的列表.实际上...(要完成的) */
struct witness *lo_witness;/*和本锁相关连的witness*/
};
#endif /* !_SYS__LOCK_H_ */
------------------------------------------------------------------------------------------------------------------------------------
_mutex.h头文件.位于:/sys/sys
#ifndef _SYS__MUTEX_H_
#define _SYS__MUTEX_H_
/*
* 可睡眠/自旋 的互斥体
*/
struct mtx {
struct lock_object mtx_object; /* 说明该互斥体基本的锁的属性. */
volatile uintptr_t mtx_lock; /* 当线程拥有该互斥体时会把线程地址指针放到此处做标记. */
volatile u_int  mtx_recurse; /* 同一线程的递归的次数,说明互斥体可嵌套. */
#ifdef MUTEX_PROFILING  /*到是不打算写了.统计和跟踪用的.*/
/*
  * This does not result in variant structure sizes because
  * MUTEX_PROFILING is in opt_global.h
  */
u_int64_t  mtx_acqtime;
const char  *mtx_filename;
int   mtx_lineno;
/*
  * Fields relating to measuring contention on mutexes.
  * holding must be accessed atomically since it's
  * modified by threads that don't yet hold the mutex.
  * locking is only modified and referenced while
  * the mutex is held.
  */
u_int   mtx_contest_holding;
u_int   mtx_contest_locking;
#endif
};
#endif /* !_SYS__MUTEX_H_ */
-----------------------------------------------------------------------------------------------------------------------------------
lock.h 位于:sys/sys
#ifndef _SYS_LOCK_H_
#define _SYS_LOCK_H_
#include
#include
struct thread;
/*
* 锁的种类. 每个锁都有字符串来描述其类型
* 自旋锁一般来说必须保护起优先权.持有一自旋锁而进行上下文的切换是错误的.
* 同样,对于一独占锁进行嵌套的前提必须该锁所在锁类(lock_class)允许嵌套和
* 和锁自己也允许嵌套.
*/
struct lock_class {
const char *lc_name;   /*该类锁的说明注释,在WITNESS初始化时一般是直接赋值*/
u_int lc_flags;/*看下面*/
};
#define LC_SLEEPLOCK 0x00000001 /* 睡眠锁. */

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:polling技术进展不大

下一篇:再加个FREEBSD的MUTEX