进程是程序的一次执行,线程可以理解为进程中的执行的一段程序片段。
一个程序至少有一个进程,一个进程至少有一个线程。
进程是操作系统资源分配的基本单位,而线程是操作系统执行的最小单位。
地址空间和资源分配:进程有独立的地址空间,比如在linux下面启动一个新的进程,系统必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种非常昂贵的多任务工作方式。而运行一个进程中的线程,它们之间共享大部分数据,使用相同的地址空间,因此线程的创建,销毁及调度的开销一般都远小于进程。当然,线程拥有自己的局部变量和堆栈(注意不是堆)。
通信:线程之间的通信比较方便。同一进程下的线程共享数据(比如全局变量,静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信的方式进行。
相互关系:进程拥有一个完整的虚拟地址空间,不依赖于线程而独立存在;线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
进程和线程有时候并不完全区分,而往往根据上下文理解其含义。
参考资料:
[1] 面试总结-进程、线程与多线程
http://www.cnblogs.com/obama/archive/2013/04/12/3016509.html