Windows c++进程与线程

Windows C++ Process vs Thread

本文关键字:线程 进程 c++ Windows      更新时间:2023-10-16

在Windows c++中,如果一个线程正在做一个非常CPU密集型的操作,createThread()会导致一些线程变慢。createProcess()会缓解这种情况吗?如果是这样,createProcess()是否意味着代码必须驻留在第二个可执行文件中,或者这一切都可以发生在同一个可执行文件中?

进程和线程之间的主要区别是每个进程都有自己的内存空间,而线程共享它们运行的进程的内存空间。

如果一个线程是真正的CPU限制,它只会减慢另一个线程,如果它们都在同一个处理器核心上执行。createProcess不会缓解这个问题,因为进程仍然会有相同的问题。

还有,你在什么机器上运行这个?它有多个核吗?

不太可能——一个进程比一个线程"重"得多,所以它可能会更慢。我不确定你在问关于第二个可执行文件的问题,但你可以在同一个。exe上使用createProcess。

http://msdn.microsoft.com/en-us/library/ms682425 (v = vs.85) . aspx

听起来你正在寻找一些性能问题,所以也许尝试一个面向线程的分析器会有所帮助:http://software.intel.com/en-us/articles/using-intel-thread-profiler-for-win32-threads-philosophy-and-theory/

每个进程提供执行程序所需的资源。进程具有虚拟地址空间、可执行代码、系统对象的打开句柄、安全上下文、唯一进程标识符、环境变量、优先级类、最小和最大工作集大小以及至少一个执行线程。每个进程都由一个线程启动,通常称为主线程,但可以从它的任何线程创建额外的线程。

线程是进程中可以被调度执行的实体。一个进程的所有线程共享它的虚拟地址空间和系统资源。此外,每个线程维护异常处理程序、调度优先级、线程本地存储、唯一的线程标识符和一组结构,系统将使用这些结构保存线程上下文,直到它被调度。线程上下文包括线程的机器寄存器集、内核堆栈、线程环境块和线程进程地址空间中的用户堆栈。线程也可以有自己的安全上下文,可用于模拟客户端。

在资源有限的环境中,创建进程和创建线程都会导致额外的执行。这意味着无论您在某个时间点如何进行并行处理,您的其他执行行都会影响当前。正是由于这个原因,非常大的问题才适合采用并行分布式系统。线程和进程有利有弊。


线程

线程允许在一个地址空间内单独执行,这意味着你可以很容易地共享对象的数据变量实例,但这也意味着你会遇到更多的同步问题。这些都是痛苦的,你可以从api函数的剪切数中看到,这不是一个轻松的主题。线程在windows上的权重比进程轻,因此可以更快地上下旋转,并且使用更少的资源来维护。线程也会受到影响,因为一个线程可能导致整个进程失败。


流程

每个进程都有自己的地址空间,这样可以保护自己不被另一个进程打倒,但缺乏容易通信的能力。任何通信都必须涉及某种类型的IPC(管道,TCP,…)。

代码不必在第二个可执行文件中,只需要运行两个实例。

那会使事情变得更糟。当切换线程时,CPU只需要换出几个寄存器。因为一个进程的所有线程共享相同的内存,所以不需要刷新缓存。但是在进程之间切换时,也要切换映射内存。因此,CPU必须刷新L1缓存。这是痛苦的。

(二级缓存是物理映射的,即使用硬件地址。当然,这些不会改变。)