如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
2003年9月长沙铁道学院学报№3第21卷第3期JOURNALOFCHANGSHARAILWAYUNIVERSITYSept.2003文章编号:100022499(2003)0320072205Linux操作系统内核同步机制分析胡小龙,李刚,陈明(中南大学信息科学与工程学院,湖南长沙410075)摘要:通过分析Linux内核2.4版本的源代码,讨论了Linux操作系统内核同步机制基本原理和Linux内核实现的各种锁机制,给出了各种锁机制的特点及其基本用法.关键词:Linux内核;同步;锁机制中图分类号:TP316文献标识码:AAnalysisofLinuxKernelSynchronizationMechanismHUXiao2long,LIGang,CHENMing(CollegeofInformationScienceandEngineering,CentralSouthUniversity,Changsha410075,China)Abstract:AimedtoanalysethefoundationoftheLinuxkernelsynchronizationbyhackingLinuxkernelversion2.4,variouslockingimplementationmechanismsandtheirusagearealsocon2cerned.Keywords:Linuxkernel;synchronization;lockingmechanismLinux是支持并发多任务操作系统,Linux内核2.4及以前版本是内核态不可抢占的,也就是说,当正在运行的进程处于内核态时,其他进程(更高优先级的进程)不能通过抢占获得CPU,除非该进程由于某种原因(如等待磁盘数据)自动放弃CPU.这一特性隐含着处理非阻塞系统调用的内核控制路径间是自动互斥的,只要不是由中断或异常处理程序更新的内核数据结构都可以很安全地被访问[1].但事实上系统中存在许多阻塞系统调用(引起进程切换)、处理器异常和外部设备的异步中断,这些操作都可在当前进程处于内核态时发生,从而引起内核代码交织执行的情况;从内核版本2.0被引入以来,Linux支持对称多处理器(SMP)系统,多个CPU可以并行运行内核代码.这样内核数据被多个内核控制路径共享存取,就会产生资源竞争[2].根据资源竞争产生的原因及所保护的数据不同,Linux操作系统为内核代码提供了多种同步与互斥机制以保护内核数据的安全共享.1操作系统锁机制基本原理操作系统锁机制的基本原理,就是在某个锁操作过程中不能与其他锁操作交织执行,以免多个执行路径对内核中某些重要的数据及数据结构进行同时操作而造成混乱.Linux操作系收稿日期:20030306作者简介:胡小龙(1968),男,湖南常德人,中南大学副教授,博士.©1995-2005TsinghuaTongfangOpticalDiscCo.,Ltd.Allrightsreserved.第3期胡小龙等:Linux操作系统内核同步机制分析37统内核的锁机制一般通过3种基本方式来实现,即原语、关中断和总线锁.CPU是在每次指令执行结束时检测中断信号的,如果能通过一条指令完成某个操作,则这个操作是原子的,即执行过程过中不会被中断,从而从芯片级保证该操作所存取的数据不能被多个内核控制路径同时访问.但一般CPU单条指令所涉及的操作有限而且操作很简单,往往只是某个位或整型数的算术逻辑运算,有时为了完成较为复杂的不可中断操作,需要多条指令来完成,这时在单CPU情况下,可采用关中断的方式来避免交叉执行[2].此外,在对称多处理器(SMP)环境中,单CPU涉及读-修改-写原语不再是原子的,因为,在某个CPU执行读-修改-写指令时有多次总线操作,其他CPU竞争总线,可导致对同一存储单元的读-写操作与其他CPU对这一存储单元交叉,这时CPU提供了一个前缀操作码lock来锁定总线[3].2Linux内核锁机制的实现2.1原子操作根据所存取的数据类型,Linux内核提供了2种类型的原子操作:位图(bitmaps)和原子类型(atomic-t).位图提供对位的原子操作,主要用于具有分配和释放操作的大量数据单元的管理,如文件系统I节点和磁盘块的分配与释放等.Linux内核提供对位图操作如表1所示,其中addr为位图地址,nr为位图中的位号.表1位图原子操作函数原型函数原型描述voidset-bit(intnr,volatilevoid3addr)设置位图addr中的第nr位voidclear-bit(intnr,volatilevoid3addr)