进程与线程的区别

原文地址

进程 VS 线程

进程是一个应用的执行实例。这意味着什么?举个例子,当你双击微软的Word图标的时候,你启动了一个运行Word的进程。线程是进程内部的执行路径。同时,一个进程能容纳多个线程。当你启动Word的时候,操作系统创建了一个进程并且开始执行进程的主线程。

值得一提的是,进程能坐的任何事情,线程都能做。但是当一个进程包含了多个线程,每个线程可以被当做一个轻量的进程。因此,进程和线程在本质上的区别,是他们被用来完成的工作。线程被用来完成小任务,然而进程被用来完成更繁重的任务——基本上用来执行应用。

进程和线程的另一个区别是:在同一个进程中的线程共享同样的地址空间,而不同的进程却不会这样。这允许线程去读/写相同的数据结构和变量,也使得线程之间的通信变得容易了。进程之间的通信——也被称作IPC——是很困难而且资源密集的。

多线程

多个线程是被允许的。有一个常见的例子用来说明多线程的优势:你能够让一个Word进程通过背景线程去渲染文档,但同时另一个运行中的线程能够接受用户输入,因此你才能够编辑一个新的文档。

如果我们面对一个只有单线程的应用,那么应用程序将只能一次做一件事——因此同时渲染和响应用户输入在单线程应用中是不可能实现的。

每个进程都有他自己的地址空间,但是同一个进程中的多个线程共享着这个地址空间。线程也能够在该进程内共享任何资源。这意味着在线程之中共享数据非常容易,但也使得线程之间很容易相互依赖,而导致不好的事情发生。

多线程程序必须谨慎的编写代码去防止这种事情发生。更新被多个线程所共享的数据结构的代码段被称为critical sections(临界区)。当临界区运行在一个线程上的时候,其他线程就不被允许进入这个临界区,这一点是非常重要的。这被叫做同步,我们不会在这一点上再做深入的讨论。但重点是多线程需要谨慎的编程。

同样的,线程之间上下文环境切换所需要的代价通常也比进程之间的要小。最后,线程之间通信的花销(通信时所需的代价)相对于进程来说也小得多。

这里有几点关于进程和线程之间区别的总结:

  1. 线程比进程更容易创建,因为他们不需要独立的地址空间
  2. 多线程需要谨慎编程,因为线程共享的数据结构一次只应该被一个线程改变。不像线程,进程不共享相同的地址空间
  3. 线程被认为是轻量的,因为相对于进程来说,线程所需的资源要少很多
  4. 进程相互独立。而线程之间共享了同样的地址空间,因此是相互依存的,所以一定要注意不要让不同的线程之间相互干扰。这和上面的第二点总结表达的是相同的观点
  5. 进程可由多个线程组成

转载请注明出处

坚持原创技术分享,您的支持将鼓励我继续创作!