一、前言
简而言之,一个程序至少有一个进程,一个进程至少有一个线程
二、进程(Process)
1. 定义与组成
- 定义: 进程是操作系统中资源分配的基本单位,是程序在计算机上运行的一个实例。
- 组成:
- 地址空间: 每个进程有独立的虚拟地址空间,包含代码段、数据段、堆和栈等。
- 进程控制块(PCB): 存储有关进程状态的信息,如进程 ID、寄存器状态、调度信息等。
- 文件描述符表: 存储进程打开的文件及其状态。
2. 资源与隔离
- 独立的地址空间: 每个进程在独立的虚拟地址空间中运行,保证进程间的数据不会互相干扰。
- 资源隔离: 进程拥有独立的内存和资源,进程间不会直接共享资源,这有助于提高系统的稳定性和安全性。
3. 开销
- 创建和销毁开销: 创建进程涉及分配新的地址空间、初始化数据结构等,开销较大。销毁进程时,系统需要回收资源。
- 上下文切换: 切换进程需要保存和恢复进程的状态,涉及到大量的上下文切换开销。
4. 进程间通信(IPC)
- 机制: 进程间通信可以通过管道(pipes)、消息队列(message queues)、共享内存(shared memory)、信号量(semaphores)等机制实现。
- 开销: IPC 机制的开销较大,因为涉及到进程间的同步和数据传输。
5. 进程创建与销毁
- 创建: 通常通过
fork()
系统调用创建子进程。fork()
会复制父进程的地址空间和资源到子进程。 - 销毁: 进程可以通过
exit()
终止自身,父进程可以通过wait()
等待子进程的终止。
6.优缺点
优点:
- 顺序程序的特点:具有封闭性和可再现性;
- 程序的并发执行和资源共享。多道程序设计出现后,实现了程序的并发执行和资源共享,提高了系统的效率和系统的资源利用率。
缺点:
- 操作系统调度切换多个线程要比切换调度进程在速度上快的多。而且进程间内存无法共享,通讯也比较麻烦。
- 线程之间由于共享进程内存空间,所以交换数据非常方便;在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
三、线程(Thread)
1. 定义与组成
- 定义: 线程是进程内的一个执行单元,线程间共享同一进程的资源。
- 组成:
- 寄存器: 每个线程有自己的寄存器集。
- 栈: 每个线程有独立的执行栈,用于存储函数调用和局部变量。
- 线程局部存储: 用于存储每个线程独立的数据。
2. 资源与共享
- 共享资源: 同一进程内的线程共享进程的地址空间、文件描述符、全局变量等。这使得线程间的数据交换更加高效。
- 隔离: 线程之间没有独立的地址空间,因此它们对数据的修改是直接的,这可能导致竞争条件(race conditions)等问题。
3. 开销
- 创建和销毁开销: 线程的创建和销毁开销相对较小,因为线程共享进程的资源,不需要分配新的地址空间。
- 上下文切换: 线程的上下文切换比进程的上下文切换开销小,因为线程共享同一进程的状态。
4. 线程间通信
- 机制: 线程间通信通常利用共享内存进行,因为它们共享同一个地址空间。同步机制如互斥锁(mutexes)和条件变量(condition variables)用于协调线程间的操作。
- 开销: 线程间的通信开销较小,主要由于资源共享和轻量级的同步机制。
5. 线程创建与销毁
- 创建: 通常通过线程库(如 POSIX 线程库
pthread
)创建新线程。pthread_create()
用于启动新线程。 - 销毁: 线程可以通过
pthread_exit()
终止自身,或由其他线程调用pthread_join()
等待其终止。
6.优缺点
优点:
- 1)它是一种非常"节俭"的多任务操作方式。
在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。
- 线程间方便的通信机制,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便;
- 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上;
- 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
缺点:
- 调度时, 要保存线程状态,频繁调度, 需要占用大量的机时;
- 程序设计上容易出错(线程同步问题)。
四、主要区别总结
进程 | 线程 | |
地址空间 | 每个进程有独立的地址空间 | 线程共享同一进程的地址空间 |
资源共享 | 进程之间资源隔离,通信需要 IPC 机制 | 线程共享资源,通信通过共享内存进行,效率更高 |
创建与销毁开销 | 大 | 小 |
上下文切换 | 慢 | 快 |
崩溃影响 | 进程崩溃不会影响其他进程 | 线程崩溃可能影响同一进程中的其他线程 |
五、实际应用场景
- 进程: 适用于需要高隔离性的应用,例如多个不同的服务(如数据库、web 服务器)运行在独立的进程中,以避免彼此影响。
- 线程: 适用于需要并发处理的应用,如网络服务器、计算密集型任务等,通过多线程实现高效的任务处理和响应。