【发布时间】:2011-11-29 18:22:39
【问题描述】:
我的应用程序使用 fork 系统调用每隔 100 毫秒执行一次检查点。但是,我注意到我的应用程序在使用检查点(分叉)时会显着减慢。我测试了 fork 调用所花费的时间,结果是 1 到 2 毫秒。那么为什么 fork 会大大降低我的应用程序的速度。请注意,我一次只保留 1 个检查点(分叉进程),并在每次使用新检查点时终止前一个检查点。另外,我的电脑有一个巨大的内存。
请注意,我的分叉进程在创建后只是休眠。只有在需要回滚时才会唤醒它。因此,它不应该由操作系统安排。我想到的一件事是,由于 fork 是一种写时复制机制,所以每当我的应用程序修改页面时都会发生页面错误。但这会显着减慢应用程序的速度吗?如果没有检查点(分叉),我的应用程序在大约 3.1 秒内完成,使用它大约需要 3.7 秒。任何想法,是什么减慢了我的应用程序?
【问题讨论】:
-
分叉很重,让操作系统创建一个全新的进程。如果可以的话,你真的应该使用线程。它们重量轻,强度较低。
-
但是我的分叉进程在创建后只是休眠。只有在需要回滚时才会唤醒它。
-
在 fork() 之后,您在子级或父级中修改的每个页面都会导致页面错误,这意味着上下文切换和复制页面。因此,这将直接取决于您的应用程序使用了多少内存以及您在分叉后修改了多少
-
@linuxuser27:如果没有大量额外工作,线程对于检查点机制毫无用处,正是因为它们不在写入时复制进程地址空间(即使它们比
fork更轻的东西。