2012-03-12 78 views
2

开始体验一些实时线程。 我只是通过调用usleep(TIME)将我的线程发送到睡眠。 这将保证线程至少睡眠TIME。 我现在用TIME = 10ms进行了测量,得到了一个期望值为μ= 10,1ms的高斯函数。第二次测量的时间= 1us:我在4us处得到一个大的峰值。正在忙着等待

那么,为什么第二次测量不是高斯?我的第一个想法是,这个线程并没有真正的睡眠,但它却让人忙于等待。如here (old beahavior)所述,没有忙等待。如何解释这两条曲线?

+0

出于兴趣,你在运行什么操作系统来获得系统定时器的这种分辨率?我见过的最好的是4ms,而不是4us ...... :) – 2012-03-12 13:37:06

+0

你用什么底层系统实时线程?你见过[RTAI](https://www.rtai.org/)吗? – Shahbaz 2012-03-12 13:43:02

+0

它是一个xilinx fpga(PPC440),带有linux 3.0内核 – user1264182 2012-03-12 13:45:38

回答

4

由于定时功能的分辨率。你自己说,它保证当时睡在至少。它不能保证准确睡眠的原因是因为它很可能以四微秒的间隔运行。

man page也提到这样的现象:

睡眠可能略有通过任何系统活性,或通过用在处理由系统计时器的粒度呼叫或的时间被延长。

+0

,所以你的意思是(睡觉时1us)没有其他的活动,除了睡觉和醒来,因为它没有延长。 – user1264182 2012-03-12 13:43:58

+0

@ user1264182:可能它是一个实现细节 - 它可能会延迟这样的延迟,使得它有时会睡4个微秒(例如25%的时间),有时不睡(例如75%的时间)。就我个人而言,我对此表示怀疑,这会为已经标记为短时间内不准确的电话带来不必要的复杂性。可以这么说,在某个较低的范围内,无论您要求什么,您都会等待'X'微秒。 – paxdiablo 2012-03-12 13:48:06

+0

我预计至少会有X us。令人困惑的是,当我的线程正在休眠并且最小的睡眠时间X将被忽略时,没有其他线程开始。 – user1264182 2012-03-12 14:09:24

1

这可以用函数调用的开销来解释,也许是一种等待较小间隔的不同方法。你可以考虑一个不可避免的延迟,但可以减去较大的等待时间。