linux同步机制.ppt

上传人:小飞机 文档编号:5437936 上传时间:2023-07-07 格式:PPT 页数:28 大小:679.50KB
返回 下载 相关 举报
linux同步机制.ppt_第1页
第1页 / 共28页
linux同步机制.ppt_第2页
第2页 / 共28页
linux同步机制.ppt_第3页
第3页 / 共28页
linux同步机制.ppt_第4页
第4页 / 共28页
linux同步机制.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《linux同步机制.ppt》由会员分享,可在线阅读,更多相关《linux同步机制.ppt(28页珍藏版)》请在三一办公上搜索。

1、Linux同步机制,李翌,日期:2007年11月22日,概述,内核同步的类型:与中断的同步多线程的同步SMP内核抢占,概述,原子手段,忙等同步,睡眠同步,复杂,简单,效率低,效率高,atomic,lock_intspin_lock,mutexread write sem.,其它同步手段,RCUPerCPU DATApreempt disable,注意:这里的效率高低只是同步手段本身的效率,但是否在实际中效率高低要根据使用的上下文环境具体分析,概述,from ULK III,PerCPU Data,每个CPU使用独有的数据针对多CPU访问,从根本上避免锁的使用最快的方法(比使用原子操作快5%左右

2、)若有本CPU异步同步要求(中断或softIRQ),则另需要同步手段使用:DEFINE_PER_CPU(type,name)per_cpu(name,cpu),Atomic,原子性操作中不用考虑中断打断问题实现总线锁定,不用考虑其它CPU同步问题使用:对基本数据类型的同步:int,bits不能保证两个或多个数据的同步比其它同步手段效率高,可以作为构建其它复杂同步手段使用不应看作简单的变量修改、获取操作,它涉及到cache 的刷新和总线的锁定,有一定的开销,Atomic,修改操作:修改并返回结果操作:,atomic_set();set_bit();clear_bit();change_bit()

3、;atomic_add();atomic_sub();atomic_inc();atomic_dec();,xchg();cmpxchg();atomic_cmpxchg();atomic_inc_return();atomic_dec_return();atomic_add_return();atomic_sub_return();atomic_inc_and_test();atomic_dec_and_test();atomic_sub_and_test();atomic_add_negative();atomic_add_unless();test_and_set_bit();test_

4、and_clear_bit();test_and_change_bit();,Atomic,任何修改数值并返回的atomic操作都有隐含的mem barrier任何只修改数值不返回的atomic操作,linux不保证barrier操作!,ULK:Notice that in multiprocessor systems,all atomic operations described in the earlier section Atomic Operations act as memory barriers because they use the lock byte.,只针对X86!,int

5、_lock&preempt disable,单CPU的同步手段效率高,不影响吞吐量影响实时性,spin_lock,多CPU的同步手段Spin_lock:preempt Disable;LOCK for(;lock;);lock+;在单CPU下退化为空指令:在抢占内核下,退化为禁止抢占指令在非抢占内核下,完全退化为空操作若内核配置上Spin_lock debug,则不论是否配置成了SMP,都会启动spin_lock,为什么需要禁止抢占?,spin_lock,同一CPU上获取两次spin_lock,必会导致死锁。现象:无异常打印但系统无反映Spin_lock是忙等操作,影响吞吐量使用:当在SMP下

6、的多个CPU下需要同步数据访问时当访问数据时间很短,低于线程切换时间,spin_lock_init()Runtime initializing given spinlock_tspin_lock()/spin_unlock()Acquire or release given lockspin_lock_irq()/spin_unlock_irq()Disable local interrupts and acquire given lockRelease given lock and enable local interruptsspin_lock_irqsave()/spin_unlock_

7、irqrestore()Save current state of local interrupts,disable local interruptsand acquire given lockRelease given lock and restore local interrupts to given previous statespin_trylock()Try to acquire given lock;if unavailable,returns zerospin_islocked():Return nonzero if the given lock is currently acq

8、uired,spin_lock,r/w spin lock,允许多个读操作同时,对写进行同步。适合与对更改操作远少于读取操作的数据结构使用:,rw_lock_init(),rw_is_locked()read_lock(),read_lock_irq(),.write_lock(),write_lock_irq(),.,r/w spin lock,实现:rwlock_t是其lock结构,其锁字段为32bits整数,初始化为 0 x01000000 获取write锁,按照 0 x01000000来获取获取read锁,按照1来获取,seq lock,与read_write spin lock 类似

9、,是不对称锁偏向于write操作,可以在有read操作时候获取到write锁使用:,seq lock,实现:,typedef struct unsigned sequence;spinlock_t lock;seqlock_t;,static inline void write_seqlock(seqlock_t*sl)spin_lock(,static inline void write_sequnlock(seqlock_t*sl)smp_wmb();+sl-sequence;spin_unlock(%sl-lock);,seq lock,实现:,Semaphores,实现可睡眠的等待使用

10、:当实现较长时间的等待操作只能在进程(线程)上下文中使用可以实现较复杂的类型:二进制、互斥、计数信号量FIFO,Priority等待队列优先级继承重入、delete safe.,Semaphores,atomically transforms a write lock into a read lock,Completion,通知事件完成,只能使用一次以下场合,使用sem的问题:两个线程同步,线程1创建一个MUTEX,并设置成获取状态,传递给线程2,同时执行Down操作等待该信号量线程2执行完某操作后,执行UP,释放这个MUTEX线程1唤醒,直接删除该MUTEX问题:可能线程1的Down和线程2

11、的down同时执行,当线程2执行到释放该MUTEX时,线程1还在UP操作中,引发错误。,Linux 上实现,RCU,目的对于有大量读操作性能极大提升,读操作不用获取任何互斥信号实现:首要条件:所有CPU上,对齐地址的存储操作都是原子的对引用方式使用的变量有效,A=1,A=2,A=9,A=4,Linux 上实现,RCU,读,写,回收,rcu_assign_pointer(),Protect:rcu_read_lock()rcu_read_unlock(),rcu_dereference(),Defer:synchronize_rcu()&call_rcu(),Linux 上实现,RCU,#define rcu_assign_pointer(p,v)(smp_wmb();(p)=(v);),#define rcu_dereference(p)(typeof(p)_p1=p;smp_read_barrier_depends();(_p1);),Linux 上实现,RCU,RCU 示例,总结,根据上下文情况选择同步手段读写频率临界区大小执行上下文smp vs up同步手段应在设计时确定同步手段在理解其原理后才能使用,否则应使用简单的方式,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号