作者ephesians (发起钱像乱喷水)
看板Programming
标题[问题] 程式执行
时间Sat Aug 11 01:15:25 2007
我有三个问题,是之前写程式遇到的,不晓得背後运作的机制如何,请指教.
1.
我在Windows写一个程式,其中片段有:
cout << "..." << endl; //假设印AAA
CreateProcess(...); //假设印BBB
先印一个字串再建立新process,此process执行也会印东西,
假设以上前者印AAA,後者印BBB,
接着执行时发现难理解的现象,印出的是:
BBB
AAA
我说要先印的文字,跑到後面去了.
这原因是什麽?
是不是因为cout那行不是直接进行印文字的动作,
而是将一个印文字的请求推入output queue,
而之後的CreateProcess进行得比较快,比之前印文字的动作还快?
2.
我写一个Windows程式,建立sample process做执行时间的测量,
反覆测试许多次,发现每次的执行时间都不一样,
程式的输出是先印出(ExitTime - CreateTime),然後是KernelTime,然後是UserTime,
在很快的连续反覆测试之後,印出的数据会看到 15 0 15, 0 0 0, 或 15 15 0.(毫秒)
而这次读到15毫秒,下次可能读到927毫秒,再下次又不同.
这样的结果是不是因为有时程式是在时脉容许执行的区间,有时不在容许执行的区间?
3.
第三个问题比较难讲清楚. 我在一个PC Cluster做一件事情,
写了以下程式:
for (i=0; i<N; i++) {
system("ssh Node" + i + " JobTest.exe");
}
使用回圈,依次用ssh呼叫各节点执行JobTest.exe,
JobTest.exe程式内容是读取所在节点的区域档案,并储存到共用的网路磁碟.
节点Node 0到Node N之间,有些机器是空缺的,或是当机的,
在不确定节点是否都提供服务时,我直接送ssh命令,因为我认为如果它不接受命令,
顶多等待久一点,但没有结果而已.
结果,发现很神奇的事情,在网路磁碟上竟然有Node 0到Node N的档案,一个都不缺,
但可确定的是,至少有一个节点不存在.(因为那台电脑搬去做别的事)
另外是,在这回圈呼叫ssh命令之後,
过一会儿,又有一个回圈要读取网路磁碟上的档案,
读取的原则是比对档案最後修改时间是不是靠近之前ssh命令呼叫的时间,
结果,发现反覆测试好几次,虽然档案数量相同,但程式读档数目却变来变去.
这问题蛮难抓bug发生点,因为不确定是传输上有问题,覆写网路磁碟档案有问题,
或者是读档原则有问题.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.117.133.171
※ 编辑: ephesians 来自: 59.117.133.171 (08/11 01:16)
1F:→ PsMonkey:2: multi-process OS? 61.228.192.189 08/11 14:11
2F:推 ggg12345:console output 通常以一横行为单位, 换 140.115.1.146 08/11 22:16
3F:→ ggg12345:行就会释出 console 的拥有权. 140.115.1.146 08/11 22:17
4F:→ ggg12345:把其他会吃cpu time 的 process 都砍了, 140.115.1.146 08/11 22:19
5F:→ ggg12345:尤其是网路I/O.工作管理员测的时间是准的 140.115.1.146 08/11 22:21