Linux系统时间和时序,什么是时序竞态 Linux系统时序竞态问题分析
什么是时序竞态?将同一个程序执行两次,正常情况下,前后两次执行得到的结果应该是一样的。但由于系统资源竞争的原因,前后两次执行的结果有可能得到不一样的结果,这个现象就是时序竞态。时序竞态前导例
在讲时序竞态具体现象之前,我们先来看一个生活中常见的场景:
想午睡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系统时序竞态问题分析相关推荐
- win7计算机时间显示错误,win7系统时间怎么调总是不对如何解决?win7系统时间总是不对解决方法...
运行win7系统的时候会遇到一些奇奇怪怪的问题,比如有用户说win7系统时间怎么调总是不对,修改之后开机时间又变成很早之前的,每次都是这样,都要重新调整,非常麻烦,有什么办法可以解决win7系统时间总 ...
- C语言linux gettimeofday()函数和time()函数的区别(后者只能得到秒级系统时间,前者能得到毫秒甚至微秒级系统时间)
UNIX及Linux的时间系统是由「新纪元时间」Epoch开始计算起,单位为秒.Epoch是指定为1970年1月1日凌晨零点零分零秒,格林威治时间.目前大部份的UNIX系统都是用32位来记录时间,正值 ...
- linux系统时间显示错误的是,教你解决linux操作系统时间错误
您是否还遇到了Linux OS同步错误,但不知道如何自定义它? 这是方法,这是您可以轻松更改Linux OS时间的两种方法. 对于linux操作系统的时间,在没有互联网或者时间同步服务器的话,就算是配 ...
- java获取系统时间的几种方法_Java篇—获取当前系统时间的三种方式(超详细+多方法)...
1.通过util包中的Date类来获取当前时间 方法1详细代码: public class Exercise17 { public static void main(String[] args){ D ...
- 苹果当前系统时间与服务器不一致,苹果iOS14时钟Bug与系统时间不同 比系统时间慢了3小时...
苹果iOS14时钟Bug与系统时间不同 苹果刚发布了iOS14正式版,新增了类似于安卓负一屏的功能,可以添加时钟组件.近日,网友发现iOS14时钟出现Bug,时钟插件显示时间比系统时间慢了整整三个小时 ...
- linux messages 时间错乱_BATJ 常考的 21 条 Linux 命令,速度收藏!
来源: http://t.cn/EqTIhES 一.文件和目录 1. cd命令 (它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径) cd /home 进入 ...
- c语言系统时间的结构体变量,C语言中的系统时间结构体类型
1.time_t 类型:长整型,一般用来表示从1970-01-01 00:00:00时以来的秒数,精确度:秒:由函数time()获取: 该类型定义在头文件 /usr/include/sys/time. ...
- linux 系统时间 硬件时间,linux 设置系统时间和硬件时间
linux 的系统时间有时跟硬件时间是不同步的 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟.系统时钟是指当前Linux Kernel ...
- php 中国标准时间,linux 系统时间与硬件时间与中国标准时间
Linux下设置时区 提供两种最根本有效的方式,就是更改时区.这里以更改为国内上海时间例子,其他地方时区同理. 方法一 备份文件 mv /etc/localtime /etc/localtime.ba ...
- linux在shell中获取系统时间,linux在shell中获取时间
获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量 DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以使 ...
最新文章
- QT的QHttpPart类的使用
- 面试官:你不懂六大设计原则,回去等通知吧!
- python cmp函数未定义_python用plt画图时,cmp设置方法
- 拼装机器人感想_机器人心得体会(20190510062147)
- 重构《一》-- 提取方法
- php对键盘控制,键盘控制 - 陈映亮的个人空间 - OSCHINA - 中文开源技术交流社区...
- 为什么电脑CPU这么贵?
- (必读)工业机器人基础教程——快速入门学习
- Android Native Crash的log分析和定位
- linux服务器端口的状态,Linux查看端口状态及关闭端口方法
- 关于Vs配置Opencv出现的错误“ 0x000007fefdf6a06d (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常:”!!!
- Saas 多租户模式介绍
- Vue之filters传参问题
- 计算机能使用硬盘吗,旧电脑的硬盘能直接插在新电脑上用吗?
- Python学习笔记第二十九天(N维数组(ndarray))
- sudo apt-get update报错:W: 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。W: 部分索引文件下载失败。如果忽略它们,那将转而使用旧的索引文件
- R计算两列数据的相关系数_使用R语言中的corrplot来绘制相关系数矩阵热图
- zookeeper-入门介绍架构使用(这一篇足以)
- linux 抓图,关于Linux下的抓图软件和使用方法介绍
- IObit Uninstaller 10Pro BD
热门文章
- JFreeChart使用说明一--api介绍
- WorkFlow设计篇Step.2—传参的用法-订单金额的处理(续)-WF4.0
- MySQL 数据库大小写的问题
- MySQL两种表存储结构MyISAM和InnoDB的性能比较测试
- 提升 DevOps 效率,试试 ChatOps 吧!
- css的background属性
- [转]Android最佳实践之:StrictMode介绍
- python3 报错 ‘builtin_function_or_method‘ object has no attribute 解决方法
- java Proxy.newProxyInstance 动态代理 简介
- linux shell mkdosfs 命令用于建立 dos 文件系统