- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux内核同步机制简介1 介绍由于现代Linux操作系统是多任务、SMP、抢占式以及中断是异步执行的,导致共享资源容易被并发访问,从而使得访问共享资源的各线程之间互相覆盖共享数据,造成被访问数据处于不一致状态,因此Linux提供了同步机制来防止并发访问。常用的同步机制(如自旋锁)用来保护共享数据使用起来简单有效,但由于CPU的处理速度与访问内存的速度差距越来越大,导致获取锁的开销相对于CPU的速度在不断的增加。因为这种锁使用了原子操作指令,需要原子地访问内存,即获取锁的开销与访问内存的速度相关。Linux内核根据对不同共享资源的特性,提供多种同步机制:原子操作、自旋锁、读-写自旋锁、信号量、读-写信号量、完成变量、顺序锁、禁止抢占、内存屏障及RCU,本文将对其分别进行简要介绍。2 原子操作(atomic)2.1 基本原理所谓原子操作,就是该操作绝不会在执行完毕前被任何其它任务或事件打断,它是最小的执行单位,不可能有比它更小的执行单位。原子操作通常是内联函数,通过内联汇编指令来实现。原子操作需要硬件的支持,因此不同的体系结构的实现方式不同。内核提供了两组原子操作接口:整数操作和位操作。2.1.2 原子整数操作原子操作主要用于实现资源计数,很多引用计数就是通过原子操作实现的。原子类型定义如下:(参看RHEL6.5GA_x86_64内核文件:/root/include/linux/types.h)typedefstruct{volatile intcounter} atomic_t;针对整数的原子操作只能对atomic_t类型的数据进行处理,原因如下:让原子函数只接受atomic_t类型的操作数,可以确保原子操作只与这种特殊类型一起使用。使用atomic_t类型确保编译器不对相应的值进行优化,使得原子操作最终接收到正确的内存地址。可以屏蔽不同体系结构上实现原子操作的差异。2.1.2 原子位操作位操作函数是对普通的内存地址进行操作的,对所操作的数据类型没有要求。位操作函数有两个参数:一个是位号,一个是指针。第0位表示给定地址的最低有效位,第31位表示给定地址的最高有效位,第32位表示下一个字的最低有效位(32位系统)。2.2 相关函数2.2.1 原子整数参考RHEL6.5GA_x86_64内核文件:/root/arch/x86/include/asm/atomic_32.h函数描述ATOMIC_INIT(int i)原子地初始化变量为iint atomic_read(atomic_t *v)原子地读取变量vvoid atomic_set(atomic_t * v, int i);原子地设置变量v的值为ivoid atomic_add(int i, atomic_t *v);原子地给变量v加ivoid atomic_sub(int i, atomic_t *v);原子地给变量v减iint atomic_sub_and_test(int i, atomic_t *v);原子地从v减i,等于0返回真,否则返回假void atomic_inc(atomic_t *v);原子地给变量v加1void atomic_dec(atomic_t *v);原子地给变量v减1int atomic_dec_and_test(atomic_t *v);原子地从v减1,等于0返回真,否则返回假int atomic_inc_and_test(atomic_t *v);原子地从v加1,等于0返回真,否则返回假int atomic_add_negative(int i, atomic_t *v);原子地从v加i,等于负数返回真,否则返回假2.2.2 原子位参考RHEL6.5GA_x86_64内核文件:/root/include/asm-generic/bitops/atomic.h函数描述void set_bit(int nr, volatile unsigned long *addr)原子地置位void clear_bit(int nr, volatile unsigned long *addr)原子地清除void change_bit(int nr, volatile unsigned long *addr)原子地翻转int test_and_set_bit(int nr, volatile unsigned long *addr)原子地置位并返回该位原来的值?inttest_and_clear_bit(int nr, volatile unsigned long *addr)原子地清除并返回该位原来的值?inttest_and_change_bit(int nr, volatile unsigned long *addr)原子地翻转并返回该位原来的值?3 自
您可能关注的文档
最近下载
- (YUM)百胜验厂审核详细要求清单.pdf VIP
- 四上数学口算竖式脱式应用题每日一练60天(60页).pdf VIP
- 《云南彝良地区地质构造特征探讨.docx VIP
- 三上数学口算竖式脱式应用题每日一练60天(60页).pdf VIP
- 2025年新青岛版数学三年级上册全册课件.pptx
- 《旅游客源地与目的地概况》教案 第1课 了解世界旅游业(一).pdf VIP
- 人教版劳动教育四年级上册全册教学设计.pdf VIP
- 2022年国家人体生物监测工作手册.pdf VIP
- 电子课件自主学习修订版第一单元开启自主学习的旅程.pptx VIP
- JBT 4333.2-2013 厢式压滤机和板框压滤机 第2部分:技术条件.pdf VIP
文档评论(0)