1

我正在读取多个小文件并将它们输出到一个 5 秒长的文件中。我无法控制输入文件何时进入,它们有多大,每个文件中包含的时间长度等。我想每 5 秒输出一个完整文件,其中每个文件中的所有数据在 5 秒间隔内生成。我希望它以准流式方式运行,没有缓冲文件并在未来 5 秒内创建输出。

在这种情况下,我必须通过休眠和唤醒极点来处理不存在输入文件的情况以获取新值。但是,当我达到 5 秒标记时,我还需要停止睡眠/轮询,以便输出新的 5 秒块。这意味着我必须与时钟进行一些比较才能知道是否已经过了 5 秒并且我已准备好输出我的结果。

我想知道这些挂钟检查中的每一个是否都会成为对操作系统的系统调用,需要付出所有代价?如果可能,无需太多努力,我宁愿尽量减少 CPU 调用以获取挂钟(主要是为了节省 CPU,我将进行非常快速的轮询,并且数十个应用程序中的每一个的持续 CPU 调用实际上可能会烧掉一些中央处理器)。我更喜欢的是一个不依赖 cpu 周期并且只偶尔调用操作系统来重新同步它的内部计时器的系统。现在对于这个程序,我不值得特意去实现任何复杂的东西,但这让我感到好奇。c++ 语言是否已经创建了任何方法来执行我所描述的操作,使用 cpu 时间并间歇性地同步到挂钟,或者每次我尝试获取时间时它们总是进行系统调用?

谢谢

4

2 回答 2

2

是的,从本质上讲,操作系统将为获取进程的挂起时间提供便利。

当然,操作系统本质上也是一个程序,可以用C++编写,因此需要直接从硬件查询时间。这确实是可能的,但需要直接访问硬件的权限。在现代操作系统中,这通常是不可能的,因此操作系统本身(具有足够的权限)会完成这项工作,并为所谓的“用户空间”程序提供获取挂钟时间的接口。

于 2012-06-18T18:42:11.173 回答
0

这是一个平台相关的问题。您正在谈论的 Linux 系统调用是gettimeofday(),它是专门编写的,具有极低的开销。在某些机器上,低至 20ns。以下是有关如何完成的一些详细信息:

相当于 gettimeofday 的更快

基本技巧是并非每个操作系统服务都需要上下文切换。在这种情况下,Linux 可以提供高分辨率的当前时间,同时完全保留在用户空间中。除非你能证明你已经制造了瓶颈,否则相信你的 C 库会做正确的事。

于 2012-06-18T19:49:37.257 回答