Linux原理与结构 作者 郭玉东 全书 第9章.pptVIP

Linux原理与结构 作者 郭玉东 全书 第9章.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
  虽然进程有各自独立的虚拟地址空间,一般情况下不会出现交叉引用的问题,但由于它们运行在同一个计算环境中,共用同一个内核,不可避免地会发生一些相互作用,如竞争独占资源、访问共享对象、协调多方动作等。独占资源(如处理器、外部设备等)同时只能由一个进程使用,对独占资源竞争的结果是一个进程获得,其它进程等待。共享对象(如共用的数据结构等)允许多个进程访问,但访问操作应是原子的,不应出现交叉重叠。相互协作的进程(如生产者与消费者进程)之间需要协调动作,以便保持步调一致。   为了使进程之间能够和谐共处、有序竞争,操作系统需要提供保证机制,大致包括互斥(Mutual Exclusion)与同步(Synchronization)。互斥是一种竞争机制,用于保护共享的独占资源。同步是一种协调机制,用于统一进程的步调。互斥是排外的、封闭的,表示资源属于自己,不许别的进程再动,因而多使用锁(Lock)。同步是开放的、合作的,在自己完成某个动作或用完某个资源之后会主动通知合作者或唤醒等待者,因而常使用信号灯或信号量(Semaphore)。   Linux内核提供了多种互斥与同步机制,如自旋锁、序号锁、RCU、信号量、信号量集合等。除信号量集合之外,其余机制都是内核自己使用的, 用于保护被所有进程共用的内核资源、协调核内进程的动作。可以说没有互斥与同步机制,就无法保证内核的和谐与稳定。      为了实现多处理器或并发环境中的互斥与同步机制,内核需要提供一些基础操作,如格栅操作、原子操作、抢占屏蔽操作、进程等待操作等。格栅操作用于设定一些特殊的控制点,以保证点后指令不会在点前指令完全完成之前开始执行,从而控制指令的执行顺序。原子操作是对单个内存变量的不可分割的基本操作(如变量加、减等),用于保证某些特殊内存操作的完整性。抢占屏蔽操作用于控制进程的调度时机,如禁止某些场合下的进程调度等。进程睡眠与等待操作用于管理进程等待队列,以便在条件成熟时唤醒其中的进程。 9.1.1 格栅操作   正常情况下,编译或汇编器按序生成程序代码,处理器也按序执行程序代码,不会出现乱序现象。然而,为了提高执行速度,目前的汇编和编译器通常会对程序进行优化,如调整指令顺序等,处理器在执行指令期间也会采取一些加速措施,如高速缓存、乱序发射、并行执行等,因而进程对内存的实际访问顺序可能与程序的预定顺序不一致。大部分情况下,指令顺序的调整不会改变程序的行为,但也有一些例外,如将临界区内的指令移到临界区外执行就可能产生难以预料的后果。为了保证程序行为的一致性,Intel处理器提供了特殊指令、GCC编译器提供了优化格栅、Linux操作系统提供了内存格栅操作,用于控制指令的执行顺序。   优化格栅用于防止编译器的过度优化,以保证所生成代码的正确性。Linux实现的优化格式是宏barrier,定义如下:   #define barrier() _asm_ _volatile_(: : :memory)   宏barrier告诉编译器三件事:将要插入一段汇编代码(_asm_)、不要将这段代码与其它代码重组(_volatile_)、所有的内存位置都已改变(memory),因而此前保存在寄存器中的所有内存单元的内容都已失效,此后对内存的访问需要重新读入,不能用已有的寄存器内容对程序进行优化。   内存格栅用于保证指令的执行顺序。在Intel处理器中,有些指令是串行执行的,可以作为内存格栅,如I/O指令、带lock前缀的指令、写控制寄存器的指令等。另外,Intel处理器还专门引入了三条格栅指令,其中lfence(读格栅)保证其后的读操作不会在其前的读操作完全完成之前开始,sfence(写格栅)保证其后的写操作不会在其前的写操作完全完成之前开始,mfence(读写格栅)保证其后的读写操作不会在其前的读写操作完全完成之前开始。   Linux提供了多个内存格栅宏,它们其实就是对上述三条指令的包装,如下:   #define mb() asm volatile(mfence:::memory) // 读写内存格栅   #define rmb() asm volatile(lfence:::memory) // 读内存格栅   #define wmb() asm volatile(sfence ::: memory) // 写内存格栅   因而,格栅就是屏障,只有当前面的指令完全执行完之后其后的指令才会开始执行。在程序中插入格栅可以保证程序的执行顺序,虽然会影响程序的执行性能。 9.1.2 原子操作   由于机器指令的功能过于简单,一个稍微复杂的操作通常都必须用多条指令完成。如操作x=x+3通常被翻译成三条指令:将x的值读入到某个寄存器、将寄存器的值加3、将寄存器的内容写回x。考虑如下

文档评论(0)

开心农场 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档