linux操作系统之竞态条件(时序竞态)

(1)时序竞态:前后两次运行同一个程序,出现的结果不同。

(2)pause函数:使用该函数会造成进程主动挂起,并等待信号唤醒,调用该系统调用的进程会处于阻塞状态(主动放弃CPU)

          函数原型:int pause(void);  返回值为-1,并设置errno为EINTR

         

     使用pause和alarm实现sleep函数;

(3)时序问题分析

              1)如果在执行完函数alarm函数调用时(还没有计时完),此时进程失去cpu,进入就绪等待状态。

              2)定时时间到,内核向当前进程发送SIGALRM信号,信号无法被处理,信号处于阻塞等待状态。

              3)当进程再次获得cpu资源时,SIGALRM信号被递达,信号捕捉,执行捕捉函数。

              4)捕捉函数结束后,返回当前进程主控流程,pause()被调用挂起等待,无法被唤醒。

    主要原因:是因为在alarm函数和pause函数之间执行的时间比定时长,导致定时完了还没执行pause函数。

 (4)解决方法:使用sigsuspend函数(在严格要求时序的场合下使用)

         函数原型:int sigsuspend(const sigset_t *mask)

                             sigsuspend调用期间,进程信号屏蔽字由参数mask指定。

     实现原理:在sigsupend调用之前屏蔽该信号,临时信号屏蔽字mask中解屏蔽这个信号,那么信号来的时候在sigsuspend中是将信号阻塞,在mask中则使用该信号。

(5)总结

           竞态条件和系统负载有很紧密的关系,体现出信号的不可靠性。针对于这种情况,应提早预见,主动规避。             

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux操作系统之全局异步IO及可重入/不可重入函数

(1)全局变量异步I/O实现父子进程交替数数 1)信号捕捉函数 2)main函数实现信号交替 3)程序实现 1》创建子进程,父进程等待1s,等待子进程完成捕捉函数注册(捕捉信号SIGUSR1&#xff09…

LInux操作系统之SIGCHLD信号

(1)SIGCHLD产生条件 1)子进程终止的时候 2)子进程接收到SIGSTOP信号停止时 3)子进程处于停止状态,接受到SIGCONT后唤醒 (2)借助SIGCHLD使用waitpid信号实现父进程对子进程的回收 &a…

linux操作系统之终端

(1)终端分类: AltCtrlF1~F6 字符终端 pts :伪终端 AltCtrlF7 图形终端 SSH,Telnet 网路终端 (2)终端的启动流程 每一个进程都可以通过一个特殊的设备文件/dev/tty访问它的控制终端&#x…

linux操作系统之进程组及会话

(1)进程组(作业):代表一个或多个进程的集合。 1)父进程创建子进程时,默认子进程与父进程属于同一进程组,进程组id第一个进程id(组长id,父进程id)。 2)使用kill -SIGKILL -进程组id(负数&#xf…

linux操作系统之线程同步及互斥量

(1)线程同步 1)线程同步:指一个线程发出某一个功能运行时,在运行还没有结束的时候,该调用不返回。同时其它线程为保证数据的一致性,不能调用该功能。 2)多个控制流共同操作一个共享资…

linux操作系统之读写锁

(1)读写锁:只有一把锁,但是有两种状态(读,写) 1)读写锁的三种状态:读锁,写锁,不加锁 2)读写锁特性(12字)&…

linux操作系统之条件变量

(1)条件变量 条件变量本身不是锁,但它可以造成线程阻塞,通常与互斥锁配合使用。 (2)条件锁相关函数 pthread_cond_t类型,用于定义条件变量 1)初始化一个条件变量:pthrea…

linux操作系统之信号量、互斥量在进程间的同步、文件锁

(1)信号量:进化版的互斥量 多个线程间对某个对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作数据共享的目的,却导致线程并发性下降。 信号量&#x…

linux网络编程之网络应用设计模式、分层模型、通信过程

(1)网络协议 可以理解为规则,其中包含着数据传输和数据的解释。 典型的协议:传输层:tcp/udp协议,应用层:http/ftp协议,网络层:ip协议,网路接口:ar…

linux网络编程之通信协议格式

好文参考:《网路传输的三张表:MAC地址表,ARP缓存表和路由表》http://www.cnblogs.com/clovn/p/4911212.html (1)数据包封装 传输层及其一下的机制由内核决定,主要负责通讯的具体细节;应用层由用…

linux网络编程之Socket编程

(1)socket套接字 1)在linux环境下,socket用于表示进程间网络通信的特殊文件类型,其本质是内核借助缓冲区形成的伪文件(不占磁盘空间,除此之外还有二进制文件,管道,字符文…

Linux操作系统之简易实现server/client

1.首先将出错处理封装成函数,具体封装思想:是在底层函数的基础上将首字母大写(方便在编程中查找函数文件的manpage,而不需要使用命令,直接用shiftk),然后调用底层库函数并考虑出错处理,具体函数如下&#x…

linux网络编程之TCP三次握手和四次挥手

1.在TCP连接的过程中,有三个阶段,分别是建立连接,传递数据和断开连接,通讯时序图如下所示: 2.结合TCP数据报格式分析建立连接的三次握手 1)首先客户端发送一个带有SYN标志的TCP报文给服务器端,询问服务器端…

linux网路编程之多进程并发服务器

1)使用多进程并发服务器考虑的因素: (1)父进程描述最大文件描述符的个数(父进程需要关闭accept返回的新文件描述符) (2)系统内可创建进程的个数(与内存大小相关&#xff…

linux网路编程之多线程并发服务器

1)在使用进程模型开发服务器过程中考虑以下问题 (1)调整进程内最大文件描述符上限 (2)线程如有共享,考虑线程同步 (3)客户端线程退出时,做退出处理(线程分离&…

linux网路编程之TCP状态转换及端口复用

(1)TCP状态转换图 其中图中分为三种状态:实线代表的主动发起连接,虚线代表的被动发起连接,细实线代表的可以双向发起连接的状态。 主动发起连接方状态变化:1)主动发起连接的一方发送SYN标志位&…

linux网络编程之多路I/o转接服务器select

(1)多路IO转接服务器也叫做多任务IO服务器,其主要思想是不再由程序自己监听客户端连接,取而代之的是由内核替应用程序监视文件,具体实现模型如图所示: 当客户端请求和服务器连接时,内核接收到连接指令,告诉…

linux网络编程之多路I/O转接服务器poll函数

&#xff08;1&#xff09;poll函数 头文件&#xff1a;#include<poll.h> int poll(struct pollfd*fds, nfds_t nfds,int timeout); struct pollffd{ int fd;//文件描述符 short events;//监控的事件 short revents;//监控事件中满足条件返回的事情 }&#xff1…

《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr

C Primer第二章的内容主要介绍了变量和基础类型&#xff0c;包括C语言定义的基础内置类型、变量的定义及声明、符合类型如指针及引用的介绍和const及常量表达式constexpr的介绍&#xff0c;本次博客也从这四个方面进行系统的介绍&#xff0c;如果有不足之处&#xff0c;还望其他…

793. 阶乘函数后K个零 golang

Me(AC 33 / 44 个通过测试用例) func preimageSizeFZF(K int) int {count : 0for i : 0; i < 1000000; i {if trailingZeroes(i) K {count}}fmt.Println(count)//fmt.Println(trailingZeroes(25))return count}func trailingZeroes(n int) int {if n 0 {return 0}return …