• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > 信号量的原子操作是如何实现的?

信号量的原子操作是如何实现的?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了信号量实现进程同步,信号量的实现和应用,信号量实现前驱关系,信号量pv操作,操作系统信号量等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:信号量的原子操作是如何实现的?
描述:

操作系统有信号量(semaphore)的概念……检查数值、修改变量值以及可能发生的休眠操作均为单一的、不可分割的原子操作完成。保证一个一个信号量操作开始,则在操作完成或阻塞之前,其他进程均不允许访问该信号量。这种原子性对于解决同步问题和避免竞争条件是绝对比较的。

以上是摘自《现代操作系统》中的一段话,我的问题是:信号量的原子操作是如何实现的?


解决方案1:

一般是采用CPU支持的特殊指令实现Compare-And-Swap。参见http://en.wikipedia.org/wiki/Compare-and-swap

解决方案2:

还记得小学上课的场景吗? 当老师问:“这个问题谁能回答?” 如果这时候所有知道答案的小盆友全都站起来回答,你一句我一句整个课堂会乱套了。 于是老师定下规则发言之前必须举手,由老师从举手的同学中挑一个来回答。当一个同学答完后,老师再挑下一位同学来回答。 这里的“举手”就是信号,通知给“老师”(操作系统),由“老师”(操作系统)统一进行调度。 所以整套机制的关键就是制定规则和执行调度的“老师”(操作系统)。 当你站在操作系统的角度,所有的线程都需要经过你来执行时,你会发现要实现信号量的实现并不难。

解决方案3:

信号量是建立在原子操作基础上的。

信号量实现的关键在于,如何原子地递增或者递减一个变量?

对于单 CPU 系统,在 x86 平台有对指定内存递增和递减的指令。然而,对多 CPU 系统这样仍然不够。为此,在多数 CPU 平台,使用特定的 lock 前缀,使得在指令执行过程中锁住内存总线,这样其它 CPU 由于得不到总线仲裁的许可,无法同时修改其值。

进程执行 P 操作的时候,首先原子地递减相应的计数,如果执行完之后小于零,则失败,扔到等待队列中。这个检查检查的是递减指令执行之后的标志,存放于 CPU 自己的寄存器中,不会与其它 CPU 共享,所以总是准确的。V 操作类似。

参考资料:《独辟蹊径品内核:Linux内核源代码导读》(李云华著),第 2.3.1、2.3.2 节。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 信号量的原子操作是如何实现的?

相关文章

  • 2017-06-05 关于。exe文件在wince60自启动的问题
  • 2017-06-05 关于USB设备的问题,在线等
  • 2017-06-17接口技术与硬件设计片内外设
  • 2017-06-05 请教上海的兄弟
  • 2017-06-05 用串口调试助手往wince平板上发送数字,结果自动换行是怎么回事?
  • 2017-06-05 用ntddk\src\general\setup\install列子里的程序安装网卡后,在硬件管理器里面该硬件出现惊叹号??
  • 2017-06-05 Tornado
  • 2017-06-17嵌入式系统的构成
  • 2017-06-05 通用Hook函数方法检测进程的问题
  • 2017-06-17如何建立嵌入式系统开发平台

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 初学者疑惑:如何用vc写代码和调试
    • ZTEME3760Linux驱动移植问题
    • windows停止u盘做了哪些操作呢
    • 本人最近在做驱动(ds),希望能同大家交流心得。
    • 请问在那里可以找到FAT12的资料?
    • 有人使用eCos开发嵌入式操作系统吗?求助……
    • android蓝牙软件接收STM32发送过来字节流问题
    • win2000ddK写的MODEM安装程序如何在XP中用
    • 原创fpga的经典视频教程,非常给力!
    • wince50DataAbort和位对齐异常

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有