产生原因:仍然以前文实现的sleep函数为例,如果进程在执行完alarm函数后,突然失去CPU,被阻塞等待(这是有可能的,进程在执行过程中,若非原子操作,都有可能随时失去CPU),如果失去CPU的时间大于了sleep函数需要睡眠的时间,则此时在执行pause函数前,信号已经到了,因此会先处理信号(软中断,而不是先执行pause函数),在信号处理完后,再去执行pause函数,此时进程会被永远挂起,不会被唤醒,因为SIGALRM信号已经被处理了。时序竞态:即由于进程之间执行的顺序不同,导致同一个进程多次运行后产生了不同结果的现象。如上述sleep函数,有时执行结果是正确的,有时却会导致进程永远被挂起,因此这就是一个时序竞态问题。因此需要重新对该函数进行改进。

1. 注册SIGALRM信号处理函数(sigaction...)

2. 调用alarm(1) 函数设定闹钟1秒。

3. 函数调用刚结束,开始倒计时1秒。当前进程失去cpu,内核调度优先级高的进程(有多个)取代当前进程。当前进程无法获得cpu,进入就绪态等待cpu。

4. 1秒后,闹钟超时,内核向当前进程发送SIGALRM信号(自然定时法,与进程状态无关),高优先级进程尚未执行完,当前进程仍处于就绪态,信号无法处理(未决)

5. 优先级高的进程执行完,当前进程获得cpu资源,内核调度回当前进程执行。SIGALRM信号递达,信号设置捕捉,执行处理函数sig_alarm。

6. 信号处理函数执行结束,返回当前进程主控流程,pause()被调用挂起等待。(欲等待alarm函数发送的SIGALRM信号将自己唤醒)

7. SIGALRM信号已经处理完毕,pause不会等到。

时序竞态(竞态条件)相关推荐

  1. 5分钟搞懂用户态,内核态

    5分钟搞懂用户态,内核态 1. 什么是用户态,内核态 用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O.内核必须提供一组通用的访问接口,这些接口就叫系统调用 ...

  2. 用户态/内核态、用户栈/内核栈

    一.用户态和内核态 内核态和用户态是操作系统的两种运行级别,用于区分不同程序的不同权利. 内核态就是拥有资源多的状态,或者说访问资源多的状态,也称为特权态.相对来说,用户态就是非特权态,访问的而资源将 ...

  3. 用友BIP助力大型企业构建“敏态+稳态”的数智企业摩天

    摩天,用友旗下社会化的企业数智化学习认证社区,提供数智营销.智慧医疗.数智金融.智能制造.项目管理等精品课程,数智化人才上摩天!https://mot.yonyou.com/ 在多变的商业环境下,与时 ...

  4. 42.Linux应用调试-初步制作系统调用(用户态-内核态)

    1首先来讲讲应用程序如何实现系统调用(用户态->内核态)? 我们以应用程序的write()函数为例: 1)首先用户态的write()函数会进入glibc库,里面会将write()转换为swi(S ...

  5. 操作系统之计算机系统概述:4、操作系统的运行机制(内核态用户态、特权指令非特权指令、内核程序应用程序)

    4.操作系统的运行机制 思维导图: 内核程序VS用户程序: 特权指令和非特权指令: 内核态和用户态: 内核态和用户态的切换: 思维导图: 内核程序VS用户程序: 用户程序:这种程序只能调用操作系统的资 ...

  6. 操作系统用户态内核态线程同步

    1.计算机系统中有两类程序:系统程序和应用程序.为了保证系统程序不被应用程序破坏,为计算机设置了两种状态:内核态和用户态. 内核态运行的程序可以访问计算机的任何资源不受限制. 用户态运行的程序可以直接 ...

  7. 计算机基础理论知识梳理篇(二):目态(用户态)、管态(内核态)

    目态与管态 多数计算机系统将CPU执行状态分为目态(用户态)与管态(内核态),CPU的状态属于程序状态字PSW的一位,CPU交替执行操作系统程序和用户程序. 1. CPU设计中的目态.管态 目态指非特 ...

  8. linux 用户态 内核态 通信,procfs(从0开始,内核态和用户态通信charpter2)

    这篇博文将针对linux内核态与用户态通信方式中的procfs进行详细的学习. /proc主要存放内核的一些控制信息,所以这些信息大部分的逻辑位置位于内核控制的内存,在/proc下使用ls -l你会发 ...

  9. 京东竞店竞品数据一键监控,快速查看——慢慢买「市场洞察」升级

    随着电商行业的快速兴起与发展,越来越多的品牌开辟了线上的销售渠道,几乎每天都有大量的知名品牌和新兴品牌涌入电商平台. 在如今日益壮大的电商市场中,电商商家不仅要思考如何在商品同质化的对弈中胜出,更需要 ...

  10. linux内核态用户态交互,Linux用户态和内核态交互的几种方式

    创建于 2013-04-13 迁移自本人的百度空间 -------------------------------- 1/内核态->用户态 在kernel module中调用printk是最简单 ...

最新文章

  1. 第四回 基类中的修饰符,应该根据你对架构的理解去定义它们,没有绝对的
  2. Django中载入js和css文件
  3. 论文笔记:ZFNet
  4. Spring框架分为哪七大模块以及各模块的主要功能作用
  5. llmp_install.zip
  6. python学习-递归(阶乘、汉诺塔)
  7. React的生命周期(旧)
  8. Python3回文相关算法小结
  9. HashSet源码解析(最好先看HashMap的源码解析)
  10. 分享基于silverlight的一个大文件上传控件
  11. 2.FactoryMethod-工厂方法模式
  12. Linux文件浏览命令
  13. springboot集成rocketmq
  14. 张俊芳电机学17章计算题以及答案
  15. 十进制,二进制,八进制,十六进制的解意和详细转换
  16. 生物信息学分析 | 物种间的同源基因的批量注释
  17. 钕铁硼的尺寸与形位公差
  18. python查询12306余票_【python】用GUI编写一个12306余票查询的系统,附源码
  19. 快速搭建日志系统——ELK STACK
  20. “用指定的用户名和密码无法登录到该ftp服务器”解决办法

热门文章

  1. h.264 去块滤波
  2. linux cat显示若干行
  3. centos6.5安装配置LDAP服务[转]
  4. Hyper-V 替换 vmwp
  5. vbs向指定的日志文件添加日志
  6. linux 文件inode,linux文件系统-inode学习整理
  7. vs mysql iss_MySQL5.7与8.0的连接问题(vs2015\2017)
  8. 浏览器打印设置横向打印_爱普生打印机无线连接设置
  9. python安装界面翻译_python环境搭建
  10. VS2019 WPF制作OTA上位机(二)获取bin文件路径