进程和线程是两个紧密相关的概念,它们最主要的区别是线程是进程的一部分,一个进程可以包含多个线程,但是线程不能包含进程。每个可执行的程序都包含两个基本部分,即进程和线程。它们都是用于执行一系列的指令,都是由程序或系统进行初始化。
进程是可执行程序的一个实例,它包含程序代码和当前程序中的所有活动。根据不同的操作系统,一个进程可能有多个不同的线程并发的执行各自的指令。程序是一系列指令的集合,而这些指令最终都由进程执行。进程包含了执行程序时所需要的环境,即运行时所需要的系统资源,每个进程都有各自的内存空间。可能很多人以为进程等同于应用程序,但是实际上,一个应用程序在运行的时候,可能会包括很多个相关的进程。为了实现进程间通信 IPC(即 Inter Process Communication),很多系统都用 pipes、sockets 等工具来实现。IPC 不仅用于同一系统中的不同进程间的通信,还可用于不同系统的进程间通信。
一个线程可以执行一系列的程序指令,不同系统的进程和线程实现是不一样的。但是对所有系统来说,线程都是进程的组成部分,一个进程中至少要有一个线程。同一进程中的多个线程可共享这个进程的资源,这样也有利于实现线程间通信。
在单处理器系统中,处理器通过在不同的时间切换不同的线程来实现多任务并发。线程的切换速度是非常快的,所以会给人一种所有线程都同时在运行的感觉。在多处理器系统中,不同的线程可以在不同的处理器上同时运行,实现真正的并行处理。
综上,线程可以看作是轻量级的进程 ,它可以在一个进程里面执行一系列的指令。计算机系统可以并发或并行的运行多个进程和线程。
下表详细描述了进程和线程的区别
进程 |
线程 |
|
定义 |
一个程序的正在执行的实例叫进程 |
线程是进程的组成部分 |
处理方法 |
它从父进程中拷贝数据,并对这些数据进行操作 |
它可直接访问所在进程中的数据 |
通信 |
进程间通信只能通过 IPC 实现 |
一个进程中的线程间可直接相互访问 |
运行开销 |
通常进程运行的开销是比较大的 |
线程可当作轻量级进程,运行开销非常小 |
创建方式 |
新进程只能通过拷贝父进程的方式来创建 |
新线程的创建非常简单,无需复制,可直接生成 |
控制方式 |
一个进程只能控制它的子进程 |
一个进程中的所有线程间都可相互操作 |
改变影响 |
任何父进程的改变都不会影响到它的子进程 |
主线程的改变会影响到其它子线程的行为,而子线程的改变通常不会相互影响 |
运行内存 |
每个进程都运行在自己的内存空间中 |
所有子线程都共享同一内存空间 |
文件描述符 |
大多数文件描述符都不能共享 |
子线程可共享文件描述符 |
文件系统 |
文件系统的上下文不可共享 |
子线程间共享文件系统上下文 |
信号 |
信号处理不能共享 |
子线程间共享信息处理 |
控制者 |
进程由操作系统控制 |
通常主线程由进程控制,而子线程可由程序员创建和控制 |
依赖 |
一个进程的运行不需要依赖其它进程 |
线程的运行依赖于进程,即线程无法独立存在 |