首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | linux相关 | linux认证 | 下载中心 | 专题
oklinux
 系统管理:中文环境 系统管理 桌面应用 内核技术 Linux基础:安装配置 常用命令 经验技巧 软件应用 Linux数据库:Mysql POSTGRE
 网络管理:网络安全 网络应用 Linux服务器 编程开发:PHP CC++ Python Perl SHELL 嵌入式开发 | PHP基础 PHP技巧 PHP应用 PHP文摘
 首页 linux资讯动态 Linux专题 | 其他Unix Linux解决方案 硬件相关 Linux认证 企业应用 Apache | 相关下载:软路由 参考手册 开发工具
 → 当前位置:首页>系统管理>内核技术>正文

Linux系统内核的同步机制“自旋锁”

OKLinux www.oklinux.cn 2007-04-12 来源:         会员收藏 游客收藏

自旋锁最多只能被一个可执行线程持有。自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去,在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。

信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用(_trylock的变种能够在中断上下文使用);而自旋锁适合于保持时间非常短的情况,因为一个被争用的自旋锁使得请求它的线程在等待重新可用时自旋,特别浪费处理时间,这是自旋锁的要害之处,所以自旋锁不应该被长时间持有。在实际应用中自旋锁代码只有几行,而持有自旋锁的时间也一般不会超过两次上下方切换,因线程一旦要进行切换,就至少花费切出切入两次,自旋锁的占用时间如果远远长于两次上下文切换,我们就可以让线程睡眠,这就失去了设计自旋锁的意义。

如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。

自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。

一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。

无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。自旋锁的实现和体系结构密切相关,代码一般通过汇编实现,定义在文件,实际用到的接口定义在文件夹 中, 自旋锁的API有:

 

CODE:spin_lock_init(x)

该宏用于初始化自旋锁x。自旋锁在真正使用前必须先初始化。该宏用于动态初始化指定的。

 

CODE:DEFINE_SPINLOCK(x)

该宏声明一个自旋锁x并初始化它。该宏在2.6.11中第一次被定义,在先前的内核中并没有该宏。

 

CODE:SPIN_LOCK_UNLOCKED

该宏用于静态初始化一个自旋锁。

 

CODE:DEFINE_SPINLOCK(x)等同于spinlock_t x = SPIN_LOCK_UNLOCKEDspin_is_locked(x) )

该宏用于判断自旋锁x是否已经被某执行单元保持(即被锁),如果是,返回真,否则返回假。

 

CODE:spin_unlock_wait(x)

该宏用于等待自旋锁x变得没有被任何执行单元保持,如果没有任何执行单元保持该自旋锁,该宏立即返回,否则将循环在那里,直到该自旋锁被保持者释放。

 

CODE:spin_trylock(lock)

该宏尽力获得自旋锁lock,如果能立即获得锁,它获得锁并返回真,否则不能立即获得锁,立即返回假。它不会自旋等待lock被释放。

 

CODE:spin_lock(lock)

该宏用于获得自旋锁lock,如果能够立即获得锁,它就马上返回,否则,它将自旋在那里,直到该自旋锁的保持者释放,这时,它获得锁并返回。总之,只有它获得锁才返回。

 

CODE:spin_lock_irqsave(lock, flags)

该宏获得自旋锁的同时把标志寄存器的值保存到变量flags中并失效本地中断。

 

CODE:spin_lock_irq(lock)


 

该宏类似于spin_lock_irqsave,只是该宏不保存标志寄存器的值。禁止本地中断并获取指定的锁

 

CODE:spin_lock_bh(lock)

该宏在得到自旋锁的同时失效本地软中断。

 

CODE:spin_unlock(lock)

该宏释放自旋锁lock,它与spin_trylock或spin_lock配对使用。如果spin_trylock返回假,表明没有获得自旋锁,因此不必使用spin_unlock释放。

共2页: 上一页 1 [2] 下一页
上一篇: Linux系统下解析Elf文件DT_RPATH后门   下一篇: linux2.6内核编译
收藏于收藏夹】 【评论】 【推荐】 【投稿】 【打印】 【关闭

相关文章
· linux2.6内核编译
· Linux系统下解析Elf文件DT_RPATH后门
· Linux 内核解读入门
· Linux重新编译内核指南
· Linux内核编译完整过程
· Linux系统内核代码特色一览
· 如何编译Linux的内核
· THE LINUX/I386 BOOT PROTOCOL
· 如何编译一个Linux操作系统内核-Ubuntu方
· 一次即大功告成 Linux内核升级全过程
发表评论
密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。)
站内搜索
阅读排行榜
·Kernel command using Lin
·用命令行加挂Linux的文件
·Linux and symmetric mult
·Linux内核可装载模块对设
·使用 SystemTap 调试内核
·Linux内核和核心OS组件的
·busybox 制作tiny linux
·揭示恶意的Linux内核模块
·主流嵌入式Linux系统下GUI
·Linux系统内核接收以太帧
最新文章
· Linux内核编程实战经验谈
· linux 内核升级和系统引
· 深入理解LINUX内核中文版
· 内核编译常见错误排除
· linux内核编译时,修改内
· 编译内核
· Linux编译内核详解
· LINUX 内核编译小技巧
· Linux内核下载
· Linux内核2.6简介
· 揭开Linux系统内核调试器
· Linux操作系统内核编码风
· 更换Fedora Core 6的内核
· 介绍RedHat AS4内核配置
· 内核操作 Linux2.6内核驱

设为首页 - 加入收藏 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2007 All rights reserved OKLinux.Cn 版权所有
合作联系 QQ:18743986 Email:arlan8005#163.com