快速业务通道

了解Linux的锁与同步

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-20

上周看了Linux的进程与线程,对操作系统的底层有了更进一步的一些了解.我同时用Linux内核设计与实现Solaris内核结构两本书对比着看,这样更容易产生对比和引发思考.现代操作系统很多思路都是相同的,比如抢占式的多线程及内核、虚拟内存管理等方面.但另外一方面还是有很多差异.在了解锁和同步之前,原子操作是所有一切底层实现的基础.

原子操作Atomic

通常操作系统和硬件都提供特性,可以对一个字节进行原子操作的的读写,并且通常在此基础上来实现更高级的锁特性.

  • atomic_t结构

原子操作通常针对int或bit类型的数据,但是Linux并不能直接对int进行原子操作,而只能通过atomic_t的数据结构来进行.目前了解到的原因有两个.

一是在老的Linux版本,atomic_t实际只有24位长,低8位用来做锁,如下图所示.这是Linux是一个跨平台的实现,可以运行在多种 CPU上,有些类型的CPU比如SPARC并没有原生的atomic指令支持,只能在32位int使用8位来做同步锁,避免多个线程同时访问.(最新版SPARC实现已经突破此限制)

另外一个原因是避免atomic_t传递到程序其他地方进行操作修改等.强制使用atomic_t,则避免被不恰当的误用.


atomic_t my_counter = ATOMIC_INIT(0);

val = atomic_read( &my_counter );

atomic_add( 1, &my_counter );

atomic_inc( &my_counter );

atomic_sub( 1, &my_counter );

atomic_dec( &my_counter );
  • 原子操作硬件上的实现

Solaris的实现是基于test-and-set的指令,并且该指令为原子操作.比如Solaris的实现在SPARC上是基于ldstub和cas指令,在x86上用的是cmpxchg指令.但是Linux似乎直接用的add指令.

OpenSolaris i386的实现


	movl	4(%esp), 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号