督促下自己,再发一篇关于BSD核心的MUTEX
2009-05-13 01:37:19来源:未知 阅读 ()
如果全部弄清了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
- 关于转载网页/文章的说明 2009-05-13
- 关于检查磁盘的命令fsck 2009-05-13
- 转:一些关于ports安装及其他问题的解决办法 2009-05-13
- 关于FireFox的后台打开新标签 2009-05-13
- 自己制作一个FreeBSD发行版的方法 2009-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash