自旋锁和读写自旋锁

自旋锁和读写自旋锁

ID:38799081

大小:55.54 KB

页数:17页

时间:2019-06-19

自旋锁和读写自旋锁_第1页
自旋锁和读写自旋锁_第2页
自旋锁和读写自旋锁_第3页
自旋锁和读写自旋锁_第4页
自旋锁和读写自旋锁_第5页
资源描述:

《自旋锁和读写自旋锁》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、自旋锁分类: 疯狂内核之同步与互斥2010-05-1819:59 395人阅读 评论(0) 收藏 举报加锁(locking)是一种广泛应用的同步技术。当内核控制路径必须访问共享数据结构或进入临界区时,就需要为自己获取一把“锁”。由锁机制保护的资源非常类似于限制于房间内的资源,当某人进入房间时,就把门锁上。如果内核控制路径希望访问资源,就试图获取钥匙“打开门”。当且仅当资源空闲时,它才能成功。然后,只要它还想使用这个资源,门就依然锁着。当内核控制路径释放了锁时,门就打开,另一个内核控制路径就可以进入房间

2、。下图显示了锁的使用。5个内核控制路径(P0,PI,P2,P3和P4)试图访问两个临界区(C1和C2)。内核控制路径P0正在C1中,而P2和P4正等待进人C1。同时,P1正在C2中,而P3正在等待进入C2。注意P0和P1可以并行运行。临界区C3的锁现在打开着,因为没有内核控制路径需要进人C3。  Linux锁的应用之一在多处理器环境中,取名叫自旋锁(spinlock)。如果内核控制路径发现自旋锁“开着”,就获取锁并继续自己的执行。相反,如果内核控制路径发现锁由运行在另一个CPU上的内核控制路径“锁着”

3、,就在周围“旋转”,反复执行一条紧凑的循环指令,直到锁被释放。自旋锁的循环指令表示“忙等”。即使等待的内核控制路径无事可做(除了浪费时间),它也在CPU上保持运行。不过,自旋锁通常非常方便,因为很多内核资源只锁1毫秒的时间片段;所以说,等待自旋锁的释放不会消耗太多CPU的时间。一般来说,由自旋锁所保护的每个临界区都是禁止内核抢占的。在单处理器系统上,这种锁本身并不起锁的作用,自旋锁技术仅仅是用来禁止或启用内核抢占。请注意,在自旋锁忙等期间,因为并没有进入临界区,所以内核抢占还是有效的,因此,等待自旋锁

4、释放的进程有可能被更高优先级的所取代。这种设计是合理的,因为不能因为占用CPU太久而使系统死锁。 在Linux中,每个自旋锁都用spinlock_t结构表示:typedefstruct{   raw_spinlock_traw_lock;#ifdefined(CONFIG_PREEMPT)&&defined(CONFIG_SMP)   unsignedintbreak_lock;#endif#ifdefCONFIG_DEBUG_SPINLOCK   unsignedintmagic,owner_cpu

5、;   void*owner;#endif#ifdefCONFIG_DEBUG_LOCK_ALLOC   structlockdep_mapdep_map;#endif}spinlock_t;typedefstruct{   volatileunsignedintslock;}raw_spinlock_t;其中包含两个重要的字段意义如下:slock:该字段表示自旋锁的状态:值为1表示“未加锁”状态,而任何负数和0都表示“加锁”状态。break_lock:表示进程正在忙等自旋锁(只在内核支持SMP和内核

6、抢占的情况下使用该标志)。内核提供六个宏用于初始化、测试及设置自旋锁。所有这些宏都是基于原子操作的,这样可以保证即使有多个运行在不同CPU上的进程试图同时修改自旋锁,自旋锁也能够被正确地更新。 1、spin_lock_init——初始化自旋锁,并把自旋锁的lock->raw_lock置为1(未锁)#definespin_lock_init(lock)               /do{                        /   staticstructlock_class_key__ke

7、y;         /                        /   __spin_lock_init((lock),#lock,&__key);      /}while(0)void__spin_lock_init(spinlock_t*lock,constchar*name,           structlock_class_key*key){#ifdefCONFIG_DEBUG_LOCK_ALLOC   /*    *Makesurewearenotreinitializinga

8、heldlock:    */   debug_check_no_locks_freed((void*)lock,sizeof(*lock));   lockdep_init_map(&lock->dep_map,name,key,0);#endif   lock->raw_lock=(raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;    lock->magic=SPINLOCK_MAGIC;   lock->owner

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。