什么是时序竞态?将同一个程序执行两次,正常情况下,前后两次执行得到的结果应该是一样的。但由于系统资源竞争的原因,前后两次执行的结果有可能得到不一样的结果,这个现象就是时序竞态。时序竞态前导例

在讲时序竞态具体现象之前,我们先来看一个生活中常见的场景:

想午睡10分钟,于是定了个10分钟的闹钟,希望10分钟后闹钟将自己叫醒。

正常情况:定好闹钟,午睡,10分钟后闹钟叫醒自己;

异常情况:定好闹钟,躺下睡觉2分钟,被同学叫醒去打球,打了20分钟后回来继续睡觉。但在打球期间,闹钟早就响过了,将不会再唤醒自己。

这个例子与之后要讲的时序竞态有很大的相似之处。

##时序竞态问题分析

我们再回过头来看上面所写的mysleep程序。这个函数有可能是下面的时序:

SIGALRM默认动作是终止进程,因此我们要将其捕捉,对SIGALRM注册信号处理函数;

调用alarm(1)函数定时1秒钟;

alarm(1)调用结束,定时器开始计时。就在这时,进程失去CPU,进入就绪态等待CPU(相当于被同学叫醒去打球)。失去CPU的方式有可能是内核调度了优先级更高的进程取代了当前进程,使得当前进程无法获得CPU;

我们知道,alarm函数如果采用自然定时法的话,定时器将一直计时,与进程状态无关。于是,1秒后,闹钟定时时间到,内核向当前进程发送SIGALRM信号。高优先级进程尚未执行完毕,当前进程仍然无法获得CPU,继续处于就绪态,信号无法处理(处于未决状态);

优先级高的进程执行完毕,当前进程获得CPU资源,内核调度回当前进程执行。SIGALRM信号递达,并被进程处理;

信号处理完毕后,返回当前主控流程,并调用pause()函数,挂起等待alarm函数发送的SIGALRM信号将自己唤醒;

但实际SIGALRM信号已经处理完毕,pause()函数永远不会等到。

##解决时序竞态问题

通过以上时序分析,我们可以看出,造成时序竞态的原因就是SIGALRM信号在进程失去CPU的时候就已经发送过来。为了防止这个现象出现,我们可以先将该信号阻塞,将其“抓住”,再在解除阻塞的时候立刻调用pause函数挂起等待。这样即使在调用alarm就失去CPU,也可以在进程重新获得CPU时将抓到的SIGALRM信号重新“放出来”,并将之后的pause函数唤醒。

但在解除阻塞与pause等待挂起信号之间,还是有可能失去CPU,除非将这两个步骤做成一个“原子操作”。Linux系统提供的sigsuspend函数就具备这个功能。所以,在时序要求比较严格的场合下都应该使用sigsuspend函数,而非pause函数。

Linux系统时间和时序,什么是时序竞态 Linux系统时序竞态问题分析相关推荐

  1. win7计算机时间显示错误,win7系统时间怎么调总是不对如何解决?win7系统时间总是不对解决方法...

    运行win7系统的时候会遇到一些奇奇怪怪的问题,比如有用户说win7系统时间怎么调总是不对,修改之后开机时间又变成很早之前的,每次都是这样,都要重新调整,非常麻烦,有什么办法可以解决win7系统时间总 ...

  2. C语言linux gettimeofday()函数和time()函数的区别(后者只能得到秒级系统时间,前者能得到毫秒甚至微秒级系统时间)

    UNIX及Linux的时间系统是由「新纪元时间」Epoch开始计算起,单位为秒.Epoch是指定为1970年1月1日凌晨零点零分零秒,格林威治时间.目前大部份的UNIX系统都是用32位来记录时间,正值 ...

  3. linux系统时间显示错误的是,教你解决linux操作系统时间错误

    您是否还遇到了Linux OS同步错误,但不知道如何自定义它? 这是方法,这是您可以轻松更改Linux OS时间的两种方法. 对于linux操作系统的时间,在没有互联网或者时间同步服务器的话,就算是配 ...

  4. java获取系统时间的几种方法_Java篇—获取当前系统时间的三种方式(超详细+多方法)...

    1.通过util包中的Date类来获取当前时间 方法1详细代码: public class Exercise17 { public static void main(String[] args){ D ...

  5. 苹果当前系统时间与服务器不一致,苹果iOS14时钟Bug与系统时间不同 比系统时间慢了3小时...

    苹果iOS14时钟Bug与系统时间不同 苹果刚发布了iOS14正式版,新增了类似于安卓负一屏的功能,可以添加时钟组件.近日,网友发现iOS14时钟出现Bug,时钟插件显示时间比系统时间慢了整整三个小时 ...

  6. linux messages 时间错乱_BATJ 常考的 21 条 Linux 命令,速度收藏!

    来源: http://t.cn/EqTIhES 一.文件和目录 1. cd命令 (它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径) cd /home    进入 ...

  7. c语言系统时间的结构体变量,C语言中的系统时间结构体类型

    1.time_t 类型:长整型,一般用来表示从1970-01-01 00:00:00时以来的秒数,精确度:秒:由函数time()获取: 该类型定义在头文件 /usr/include/sys/time. ...

  8. linux 系统时间 硬件时间,linux 设置系统时间和硬件时间

    linux 的系统时间有时跟硬件时间是不同步的 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟.系统时钟是指当前Linux Kernel ...

  9. php 中国标准时间,linux 系统时间与硬件时间与中国标准时间

    Linux下设置时区 提供两种最根本有效的方式,就是更改时区.这里以更改为国内上海时间例子,其他地方时区同理. 方法一 备份文件 mv /etc/localtime /etc/localtime.ba ...

  10. linux在shell中获取系统时间,linux在shell中获取时间

    获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量 DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以使 ...

最新文章

  1. QT的QHttpPart类的使用
  2. 面试官:你不懂六大设计原则,回去等通知吧!
  3. python cmp函数未定义_python用plt画图时,cmp设置方法
  4. 拼装机器人感想_机器人心得体会(20190510062147)
  5. 重构《一》-- 提取方法
  6. php对键盘控制,键盘控制 - 陈映亮的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 为什么电脑CPU这么贵?
  8. (必读)工业机器人基础教程——快速入门学习
  9. Android Native Crash的log分析和定位
  10. linux服务器端口的状态,Linux查看端口状态及关闭端口方法
  11. 关于Vs配置Opencv出现的错误“ 0x000007fefdf6a06d (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常:”!!!
  12. Saas 多租户模式介绍
  13. Vue之filters传参问题
  14. 计算机能使用硬盘吗,旧电脑的硬盘能直接插在新电脑上用吗?
  15. Python学习笔记第二十九天(N维数组(ndarray))
  16. sudo apt-get update报错:W: 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。W: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件
  17. R计算两列数据的相关系数_使用R语言中的corrplot来绘制相关系数矩阵热图
  18. zookeeper-入门介绍架构使用(这一篇足以)
  19. linux 抓图,关于Linux下的抓图软件和使用方法介绍
  20. IObit Uninstaller 10Pro BD

热门文章

  1. JFreeChart使用说明一--api介绍
  2. WorkFlow设计篇Step.2—传参的用法-订单金额的处理(续)-WF4.0
  3. MySQL 数据库大小写的问题
  4. MySQL两种表存储结构MyISAM和InnoDB的性能比较测试
  5. 提升 DevOps 效率,试试 ChatOps 吧!
  6. css的background属性
  7. [转]Android最佳实践之:StrictMode介绍
  8. python3 报错 ‘builtin_function_or_method‘ object has no attribute 解决方法
  9. java Proxy.newProxyInstance 动态代理 简介
  10. linux shell mkdosfs 命令用于建立 dos 文件系统