我的网站

         
当前位置: 主页 > 我的网站23 >

为什么子进程要继承处理器亲缘性?

时间:2024-10-22 02:34 来源:网络整理 转载:我的网站
请先考虑一个典型的程序为什么需要启动一个子进程。(当然资源管理器不算一个典型的程序)这是因为手头的任务被分解为子任务,无论出于何种原因,这些子任务都被放入子流程中。例如,在实现多次遍历型编译器/链接器时,其中每次遍历都作为管道中的单独进程实现。

现在考虑为什么你可能希望设置进程的亲缘性以将其限制为单个处理器。一个原因是,该进程可能存在导致其在多处理器计算机上崩溃或行为异常的错误。对于为单处理器版本的 Windows 编写的旧程序或多处理器计算机仍然非常昂贵时,这很常见。

在这种情况下,你会选择将在挂起状态下启动程序,方法是将 CREATE_SUSPENDED 标志传递给 CreateProcess 函数,然后将该进程的处理器亲缘性设置为单个处理器,然后恢复进程的主线程。

但是,如果问题出在你启动的进程的子进程中怎么办?由于你无法控制进程启动其子进程的方式,因此无法潜入并设置子进程的亲缘性。

这就是处理器亲缘性需要在子进程中被继承的原因:如果在父进程上设置了亲缘性,这个设置将会应用到该进程可能作为其执行的一部分启动的所有子进程。

可能希望设置进程亲缘性的另一个原因是限制 CPU 使用率。 (例如,你可以将 CPU 密集型应用程序限制为双处理器计算机的单个处理器。)同样,如果进程启动子进程,则希望这些子进程受到与其父进程相同的限制,以便整个任务仍仅限于单个处理器。

这就是子进程继承处理器亲缘性的原因:因为它几乎总是你所想期待的行为。

总结

工作中我很少涉及处理器亲缘性方面的内容,可能我的程序没有达到有必要使用它们的量级吧。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。本文来自:《Why is processor affinity inherited by child processes?》