这是个老生常谈的问题,因为它真的会经常被问到:)
进程可以认为是应用程序运行时的一个实例。比如你双击word的图标,你就启动了一个进程来运行word程序。而线程,是进程中的一段执行路径,一个进程可以包含多个线程。当你运行word的时候,操作系统就会创建一个进程,并且开始执行这个进程的主线程。
一个线程可以做进程可以做的所有的事情。因为一个进程可以包含多个线程,我们可以认为一个线程是个轻量级进程。所以,进程和线程的主要区别,是看用他们来做什么任务,线程通常用来完成一些小任务,而进程,通常用来完成一些重量级任务(最基本的就是应用程序的执行)。
二者之间的另一个重要区别是同一个进程的多个线程之间,共享相同的地址空间,而进程之间是不会共享的,他们有自己独立的进程空间。这使得多个线程之间可以共享同一个数据结构或变量,使相互之间的交互更容易。而进程之间的通信,我们通常称之为IPC,是另外一种机制,是相对比较耗费资源的
说到线程,必然要提到多线程。一个比较具象的例子可以想象一下你使用word的过程,有个线程在接收你的输入,有个线程在检查你单词的拼写,还可以有个线程在做打印。
如果应用程序是单线程的,那么在同一时刻,就只能做一件事情,想在一个单线程的程序中既做打印,同时又对用户输入做应答,这显然是不可能的。
之前我们提到,每个进程有自己的地址空间,同一个进程的多个线程之间是共享该进程的地址空间的,他们还会共享一些其他资源,这使得线程之间共享数据非常简单。但如果多个线程不加控制的对共享的数据同时发起读写,肯定就乱掉了……
所以在多线程编程的时候,我们要格外小心。多个线程修改共享数据的那个代码段,我们称之为临界区。当有一个线程进入临界区开始执行的时候,其他线程不允许再进入临界区。这涉及到同步、互斥相关的一些知识点,不是本文要关注的重点。
另一点区别是,线程的上下文切换要比进程的上下文切换廉价得多。
OK,我们来个总结,进程与线程的区别:
联系客服