当前位置:  技术问答>linux和unix

一段代码,在单核/多核环境下运行,结果不一样,求高手解释!

    来源: 互联网  发布时间:2017-02-06

    本文导语:  我测试linux(centos5.6)上面的信号是否是安全的,不会丢失(哪怕cpu占用率100%的时候)。 发现一个奇怪的现象。下面一小段代码的主要功能是,创建两个计时器,定时输出一段字符串,其中第二个计时器做了一些消耗cpu的...

我测试linux(centos5.6)上面的信号是否是安全的,不会丢失(哪怕cpu占用率100%的时候)。

发现一个奇怪的现象。下面一小段代码的主要功能是,创建两个计时器,定时输出一段字符串,其中第二个计时器做了一些消耗cpu的计算。我是在windows xp sp3的vbox 4.1下面安装的linux。

我发现单cpu机器运行和多cpu机器运行,结果是不一样的,这到底是为什么?
代码:

#include 
#include 
#include 
#include 
#include 
int count1=0,count2=0; 
void handler1(int sig,siginfo_t*,void*){ 
     if(sig==SIGRTMIN){printf("Timer 1s:%dn",++count1);} 

void handler2(int sig,siginfo_t*,void*){ 
     if(sig==SIGRTMIN+1){printf("              Timer 2s:%dn",++count2);} 
     for(int i=0;i0); 
     return 0; 


运行结果和发现: 
(1)当第二个计时器没有消耗cpu的计算时(我注释掉for循环),程序的结果如我的预期: 
Timer 1s:1 
Timer 1s:2 
               Timer 2s:1 
Timer 1s:3 
Timer 1s:4 
               Timer 2s:2 
Timer 1s:5 
Timer 1s:6 
               Timer 2s:3 
Timer 1s:7 
Timer 1s:8 
               Timer 2s:4 
Timer 1s:9 
Timer 1s:10 
               Timer 2s:5 
  
(2)当for循环存在的时候,如果此时的运行环境是1个cpu,那么结果仍然是正确的。不过,每次打印之间间隔的时间变得很长了,总运行时间也远不止10s。 
(3)当for循环存在的时候,如果此时的运行环境是多个cpu(vbox可以更改cpu个数),那么结果就是非常奇怪的: 
Timer 1s:1 
Timer 1s:2 
                 Timer 2s:1 
                 Timer 2s:2 
                 Timer 2s:3 
                 Timer 2s:4 
                 Timer 2s:5 
                 Timer 2s:6 
                 Timer 2s:7 
                 Timer 2s:8 
                 Timer 2s:9 
  
(4)我的初步分析: 
当机器只有一个cpu的时候,OS和进程轮流使用时间片。两个timer轮流使用cpu时间,当第二个timer在消耗cpu的时候,期间OS并没有给两个计时器增加时间,也不会通知两个计时器的事件。 
  
但是多cpu的时候,OS占用一个cpu,不断的给两个计时器计时。所以第二个timer不断的被OS提醒运行,占用了进程的所有的cpu时间,而第一个timer的计时信号则不断的被OS插入提醒列表,但是没有被响应。 
  
这也就是说明linux的行为,在cpu数量发生变化的时候,是会改变的? 

|
在aix环境下试验了一下,行为与lz的第3种情况类似

不仅第一个timer没有执行,连sleep也没有执行
看样子是全部的时间都给了timer2
可能与timer2中的for循环的执行耗时超过2s有关

信号处理程序的优先级相对较高,所以sleep得不到调度

    
 
 

您可能感兴趣的文章:

  • 用Jbuilder3 遇到问题不能运行把可疑代码注掉后可以运行但是重新使用可疑代码时又可以运行了多次重复都是如此
  • 请问在java多线程中,是只有run(){}内的代码运行在一个新线程下呢?还是这个类中的代码都运行在一个新线程下?
  • jbuilder4.0 企业版能否把代码编译成在特定平台上运行的代码
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 请问谁运行过《Java XML 编程指南》中的代码?
  • 在线等,为什么我的代码原来可以运行,现在不可以了????TextPad
  • Java 代码运行洞察库 Metrics
  • 求调用ie代码,运行成功即给分,在线等待!
  • 请教:Linux下编译c代码,运行程序时出现undefined symbol exp
  • 怎样用代码设置frame,让它运行开始就最大化显示。
  • java运行windows的cmd命令简单代码
  • shell脚本运行5秒后自动退出的代码
  • 求驱动程序源代码(能在RedHat7.2, Kernel2.4下编译,装载运行)每个100分
  • 刚下载一个内核源代码,怎样将它编译出来,然后安装运行呢?
  • 请问如何用EMACS编译调试运行C代码?
  • 大家好!我最近一个浏览器的原代码不知道怎么编译运行。。请帮帮忙?
  • 如何用c shell实现让一个a.exe在后台运行,请给出shell代码
  • 各位师兄师姐再帮忙看看为什么下面的代码运行时出错?
  • 怎么写shell代码 写好shell怎么运行?
  • 在unix下写一个每日批处理的程序,如何实现每日某个时间触发我要运行的代码?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ STL Bitsets构造函数及成员函数解释及代码示例
  • Java源代码解释器 Beanshell
  • 请高手帮我解释一下这段代码!!!
  • awk '!a[$2]++' 谁能解释一下这行代码
  • 问一句代码,请大家解释一下。
  • 求代码解释
  • 我刚看java,知道它的目标代码是解释执行的,目标执行速度快吗?
  • 谁能给我解释一下这段代码?
  • 读PCI时有段代码不懂,请高手解释一下
  • 谁给解释一下这段代码,立即给分!
  • 谁能帮我解释下这段代码
  • 帮忙解释下段代码!
  • java demo中的Notepad中的这段代码看不懂,谁给解释一下
  • 怎样让网页输出不解释html代码
  • 下面是mysql5.0源代码中嵌入的一条汇编语句,哪位老大能给解释一下?
  • Linux 2.4.18 中编写的一段代码,请高手帮忙解释一下意思。。。。。。。。。。
  • 有高手能帮我解释一下这段代码的意图吗?谢谢!
  • 请教,我将windows下的带有中文解释的代码在linux打开,全是乱码
  • 谁给解释一下这段代码?
  • 一段20行左右的C代码,设计到一些内核接口结构体和宏,大家帮我解释一下好么?
  • 帮忙解释下这几句汇编代码,各位大虾
  • javascript 添加到收藏夹和书签代码示例
  • 在JBuilder中,为什么编写的代码中,当代码出现关键字时,后面的部分代码就移位了,当在有关键字的那些代码行进行选择时,也会出现鼠标位
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • 为什么两行代码间不加入其他代码就崩溃,而加入了日志代码后就不崩溃?
  • JSP中清空cookie代码参考
  • 在ubuntu8.10 新立得中安装anjuta,为什么没有代码提示功能,怎么做才有,还有自动代码补全和代码提示有什么区别,
  • java运行windows的cmd命令简单代码 iis7站长之家
  • 到底怎么样的代码算是有效代码?请教了。。
  • HTML网页中的html body onload自动跳转方法介绍及自动跳转代码示例
  • 如果要研究源代码以提高自己,哪一个开放源代码的软件比较合适?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3