时序竞态(竞态条件)
产生原因:仍然以前文实现的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不会等到。
时序竞态(竞态条件)相关推荐
- 5分钟搞懂用户态,内核态
5分钟搞懂用户态,内核态 1. 什么是用户态,内核态 用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O.内核必须提供一组通用的访问接口,这些接口就叫系统调用 ...
- 用户态/内核态、用户栈/内核栈
一.用户态和内核态 内核态和用户态是操作系统的两种运行级别,用于区分不同程序的不同权利. 内核态就是拥有资源多的状态,或者说访问资源多的状态,也称为特权态.相对来说,用户态就是非特权态,访问的而资源将 ...
- 用友BIP助力大型企业构建“敏态+稳态”的数智企业摩天
摩天,用友旗下社会化的企业数智化学习认证社区,提供数智营销.智慧医疗.数智金融.智能制造.项目管理等精品课程,数智化人才上摩天!https://mot.yonyou.com/ 在多变的商业环境下,与时 ...
- 42.Linux应用调试-初步制作系统调用(用户态-内核态)
1首先来讲讲应用程序如何实现系统调用(用户态->内核态)? 我们以应用程序的write()函数为例: 1)首先用户态的write()函数会进入glibc库,里面会将write()转换为swi(S ...
- 操作系统之计算机系统概述:4、操作系统的运行机制(内核态用户态、特权指令非特权指令、内核程序应用程序)
4.操作系统的运行机制 思维导图: 内核程序VS用户程序: 特权指令和非特权指令: 内核态和用户态: 内核态和用户态的切换: 思维导图: 内核程序VS用户程序: 用户程序:这种程序只能调用操作系统的资 ...
- 操作系统用户态内核态线程同步
1.计算机系统中有两类程序:系统程序和应用程序.为了保证系统程序不被应用程序破坏,为计算机设置了两种状态:内核态和用户态. 内核态运行的程序可以访问计算机的任何资源不受限制. 用户态运行的程序可以直接 ...
- 计算机基础理论知识梳理篇(二):目态(用户态)、管态(内核态)
目态与管态 多数计算机系统将CPU执行状态分为目态(用户态)与管态(内核态),CPU的状态属于程序状态字PSW的一位,CPU交替执行操作系统程序和用户程序. 1. CPU设计中的目态.管态 目态指非特 ...
- linux 用户态 内核态 通信,procfs(从0开始,内核态和用户态通信charpter2)
这篇博文将针对linux内核态与用户态通信方式中的procfs进行详细的学习. /proc主要存放内核的一些控制信息,所以这些信息大部分的逻辑位置位于内核控制的内存,在/proc下使用ls -l你会发 ...
- 京东竞店竞品数据一键监控,快速查看——慢慢买「市场洞察」升级
随着电商行业的快速兴起与发展,越来越多的品牌开辟了线上的销售渠道,几乎每天都有大量的知名品牌和新兴品牌涌入电商平台. 在如今日益壮大的电商市场中,电商商家不仅要思考如何在商品同质化的对弈中胜出,更需要 ...
- linux内核态用户态交互,Linux用户态和内核态交互的几种方式
创建于 2013-04-13 迁移自本人的百度空间 -------------------------------- 1/内核态->用户态 在kernel module中调用printk是最简单 ...
最新文章
- 第四回 基类中的修饰符,应该根据你对架构的理解去定义它们,没有绝对的
- Django中载入js和css文件
- 论文笔记:ZFNet
- Spring框架分为哪七大模块以及各模块的主要功能作用
- llmp_install.zip
- python学习-递归(阶乘、汉诺塔)
- React的生命周期(旧)
- Python3回文相关算法小结
- HashSet源码解析(最好先看HashMap的源码解析)
- 分享基于silverlight的一个大文件上传控件
- 2.FactoryMethod-工厂方法模式
- Linux文件浏览命令
- springboot集成rocketmq
- 张俊芳电机学17章计算题以及答案
- 十进制,二进制,八进制,十六进制的解意和详细转换
- 生物信息学分析 | 物种间的同源基因的批量注释
- 钕铁硼的尺寸与形位公差
- python查询12306余票_【python】用GUI编写一个12306余票查询的系统,附源码
- 快速搭建日志系统——ELK STACK
- “用指定的用户名和密码无法登录到该ftp服务器”解决办法
热门文章
- h.264 去块滤波
- linux cat显示若干行
- centos6.5安装配置LDAP服务[转]
- Hyper-V 替换 vmwp
- vbs向指定的日志文件添加日志
- linux 文件inode,linux文件系统-inode学习整理
- vs mysql iss_MySQL5.7与8.0的连接问题(vs2015\2017)
- 浏览器打印设置横向打印_爱普生打印机无线连接设置
- python安装界面翻译_python环境搭建
- VS2019 WPF制作OTA上位机(二)获取bin文件路径