了解Linux的锁与同步
上周看了Linux的进程与线程,对操作系统的底层有了更进一步的一些了解.我同时用Linux内核设计与实现和Solaris内核结构两本书对比着看,这样更容易产生对比和引发思考.现代操作系统很多思路都是相同的,比如抢占式的多线程及内核、虚拟内存管理等方面.但另外一方面还是有很多差异.在了解锁和同步之前,原子操作是所有一切底层实现的基础. 原子操作Atomic通常操作系统和硬件都提供特性,可以对一个字节进行原子操作的的读写,并且通常在此基础上来实现更高级的锁特性.
原子操作通常针对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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |