线程详细剖析(三)

摘自《C++多核编程》

6.2  线程和进程的比较

线程和进程都能够提供并发程序执行。当您决定使用多个进程还是多个线程时,上下文切换需要使用的系统资源、吞吐量、实体间通信、程序简化等都是需要考虑的问题。

6.2.1 上下文切换

当您创建一个进程时,可能只需要主线程这一个线程就可以实现进程的功能了。当进程有着多个并发子任务时,多个线程能够在上下文切换的开销较小的情况下提供子任务的异步执行。如果处理器可用性较低或者只有一个内核,并发执行的进程由于需要进行上下文切换而带来较大的开销。相同的情况下,如果使用线程,只有当下一个要指派到处理器的线程来自另一个进程时,才会发生进程上下文切换。较少的开销意味使用的系统资源较少,而且上下文切换的时间也更短。当然,如果有足够的处理器用于周转,那么上下文切换就不再是一个问题。

6.2.2  吞吐量

使用多个线程可以增加应用程序的吞吐量。当只有一个线程时,I/O 请求会让整个进程暂停。有了多个线程后,当一个线程等待I/O请求时,应用程序将继续执行。当一个线程被阻塞时,另一个线程便可以执行。整个应用程序不需要等待每个I/O请求被满足,其他不依赖于被阻塞线程的任务可以继续执行。

6.2.3 实体间的通信

线程与被称为对等线程的进程中其他线程之间,不要去特殊的通信机制。线程可以直接与其他对等线程进行数据的传递和接收。这节省了使用多个进程时,为了建立和维护特殊的通信机制所使用的系统资源。线程是通过使用进程地址空间中的共享内存来通信的。例如,如果进程声明了一个全局队列,进程中的线程A可以保存对线程B要处理的文件名。线程B可以从队列中读取该文件名并处理数据。

进程也可以通过共享内存进行通信,但是进程有着独立的地址空间,因此共享内存存在于进行通信的两个进程的地址空间外部。如果有一个进程希望将它处理的文件名传递给其他进程,可以使用消息队列。需要在涉及的进程的地址空间外部建立这个消息队列,而且通常需要大量的设置才能够很好的工作。这增加了用于维护和访问共享内存所使用的空间和时间。

猜你喜欢

转载自www.cnblogs.com/rohens-hbg/p/10225370.html