Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1567335
  • 博文数量: 77
  • 博客积分: 1205
  • 博客等级: 少尉
  • 技术积分: 4476
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-22 21:48
文章分类
文章存档

2018年(1)

2017年(1)

2015年(1)

2014年(18)

2013年(12)

2012年(44)

分类: AIX

2014-01-22 15:52:28

这一篇讨论一下AIX内核中的lock如何用,在看了一些文档并做了某些试验以后,有点心得要记录总结一下:
1. Simple_lock
我发现如果单纯定义一个Simple_lock型的变量的话,不需要经过lock_alloc,只要用simple_lock_init初始化一下后也是可以用的,比如:

点击(此处)折叠或打开

  1. Simple_lock s_lock;

  2. simple_lock_init(&s_lock);
  3. // enter the critical section
  4. simple_lock(&s_lock);
  5. ...
  6. simple_unlock(&s_lock);
但是aix下还提供了一个lock_alloc函数:

点击(此处)折叠或打开

  1. void lock_alloc ( lock_addr, flags, class,
  2. void *lock_addr;
  3. int flags;
  4. short class;
  5. short occurrence;
一度我曾经很困惑,不晓得使用lock_alloc能为我们的代码带来什么好处,在暂时没看到好处的情形下,坏处倒是很明显,既然lock_alloc了,那么必然需要在不用的时候再lock_free掉,这在代码层面使用无疑有点麻烦,你得老是要记住这件事,不如直接在Simple_lock变量的情形下直接使用simple_lock_init来得爽快,因为没有内存的分配,自然也不需要考虑释放的问题。后来我仔细看了sys/lock_def.h里的注释,大约依稀明白使用lock_alloc是为了一个lock instrumentation功能而设计的,换言之,当以lock_alloc来使用lock时候,内核会分配一段内存用于lock instrumentation,这段内存其实不是给lock的caller使用的,是内核里的lock部分代码在用。有了lock instumentation的好处是什么呢?IBM文档的说法是:”Also, analysis of the lock statistics provided by lock instrumentation can be used to identify contention bottlenecks that may point out the need for additional locking or the need for the read and write locking capability provided by complex locks. “此处的意思就很明显了,由此我又查到了splat和trace,可惜还没来得及学习如何用。使用lock instrumentation是有前提条件的,那就是你的aix系统要使能了lock instrumentation,这个可以通过bosboot的-L参数实现。我试验过了,但是我不晓得如何在系统起来之后去验证一下”-L              Enable MP locks instrumentation.”的确被turn ON了。
知道了lock instrumentation之后,我终于明白lock_alloc里的第三个参数class的意义了,但是occurrence还是很困扰我。

2. Complex_lock
字面意义上的复杂锁,上篇博文中没提这个,是因为当时我觉得Simple_lock已足够满足我们的要求。最近又使劲看文档,IBM按照锁的粒度把Simple_lock归结到MP-Safe里面,也就是说使用Simple_lock能确保MP安全,但不够efficient,如果要efficient,您得使用Complex_lock,即所谓的MP-efficient 。在lock_instrumentation这方面,两者的使用完全一样。为啥Complex lock就efficient呢,主要是因为后者是shared read,也就是说对于Complex_read, 如果一个代码执行路径通过lock_read进入critical section后,另一条执行路径如果也使用lock_read,它也可以进入这个section中。我用lock_mine在代码中测试了一下,发现lock_read之后,lock_mine显示当前路径没有获得锁,所以下面的代码序列执行起来是没有问题的:
   lock_read(&lock);
   lock_read(&lock);
也就是read-read可以共享critical section,但是read-write是exclusive的。这在Linux内核中其实是rwlock嘛,:-)
但是Complex_lock不能用在process-interrupt这种环境下,我猜是Complex如果发现它要获取的锁当前被别人占用,它就会睡眠。Simple_lock就不存在这方面的限制,但是它不对读写操作进行区分,因而被无情地划分到了MP-safe这一档次里,下面的代码会直接造成死锁:
   simple_lock(&s_lock);
   simple_lock(&s_lock);

AIX内核中还有lockl和kernel_lock,不过文档明确说这两种锁在新代码中不应该使用,所以就不提了。





阅读(6651) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

阿吉达2014-01-23 17:54:14

学习了