如何用atomic挽救神秘消失的 1s ? 关于atomic.h的分析

本文详细分析了Linux内核中atomic_t的实现原理,探讨了为何在多处理器环境下需要volatile关键字的原因,以及atomic操作如atomic_add、atomic_sub等如何在不需要锁总线的情况下保证原子性。通过源码解读,阐述了内联汇编在实现原子操作中的作用,以及为何atomic_t被定义为结构体而非简单的volatile int。
摘要由CSDN通过智能技术生成

关于

刚注册了CDSN账号,想在这个平台上分享自己读Linux源代码的心得和体会。一方面是我希望把平常自己读代码的感悟写下来,回头来看不会忘记,另一方面则是鼓励自己多去写一点东西,把它培养成一种习惯。当然,我的理解并不一定100%正确,难免会有一些错误或是没有根据的猜想,如果读者们觉得有问题,我很欢迎大家指正我。

目前我仍然在边读书边理解,还未完全吃透代码,甚至连1%的代码可能都没见过,所以源码分析的干货不会太多,一般当我觉得我理解得差不多了我也许就会把它贴到博客上吧!我分析的Linux源代码的版本是2.2.26,之前大致把0.11的源码看完了。我感觉这个版本源码既没有2.6跨度那么大,也不像0.11、0.95那么原始,很适合我这种初学者研究阅读。

至于如何分析呢?因为内核极其庞大和复杂,而且子系统之间的互相的函数调用和变量引用也是错综复杂,所以不太可能按照函数的调用流程分析。另外如果先分析或是介绍一些基础知识,如X86汇编 ,计算机体系结构,虚拟内存blabla又太冗杂,这些内容网上都有,所以先不一一介绍了。所以我只想简单拿源文件一个个来分析吧!虽然这样不太合适er!另外这些文件都是i386架构下的........

另外关于研究Linux代码,看书我觉得《Linux完全注释》和《Understanding The Linux Kernel》这两本书很不错的一个,读源代码的话用Source Insight或是用这个网站 http://lxr.free-electrons.com/source/?v=2.2.26很方便的。嗯,我感觉还是比较喜欢读代码,平时很少写代码呃........

正文

代码索引:Linux/include/asm-i386/atomic.h

大家上过操作系统课,应该都听过互斥、竞争、信号量这些概念,相比大家都想知道这个东东在内核中是怎么实现的吧!

其实这个说简单也简单那,说复杂也很复杂。简单是因为原理很简单,就是一组数据结构,比如atomic(叫原子变量?),semaphore(信号量),spinlock(自旋锁)、rwlock(读写锁)之类的,以及对应的方法如atomic_add()、up()、down().....等方法,就这么多类型和方法,记住就好啦。原理上,一般来说如果有多个进程(姑且这么说吧~)想要修改一个变量,那么这个变量应该有一个对应的锁结构来保护它,这样一来任意一个进程在修改这个变量之前必须获得这个锁,获得完方可对变量进行操作,操作完再释放锁。举个例子,这就像很多人在食堂一楼充饭卡,尽管有很多想充,但只有一个人能在圈存机前操作,其他人只好在旁边等着玩手机一样。进程同样如此,如果锁被别人获取了,那么进程也只好“干等”,要么着急地原地打转(这就是所谓的自旋
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值