😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍
今天我们来聊聊线程和进程,这两个内容不仅在开发中经常出现,同样也会出现在面试中,今天我们一探究竟,看看两者有何区别。
进程和线程都是操作系统中用于实现并发的基本执行单元,
1. 定义
-
进程(Process)
-
进程是操作系统中资源分配的基本单位,是一个正在运行的程序的实例。
-
每个进程都有自己独立的地址空间,包括代码段、数据段和堆栈段。
-
一个进程可以包含多个线程。
-
进程之间的通信较复杂,如通过管道、信号、共享内存等。
-
-
线程(Thread)
-
线程是操作系统中CPU 调度的基本单位,是进程中的一个执行流。
-
一个线程是进程的一部分,线程共享进程的地址空间和资源(如内存、文件句柄(文件句柄详见文章末尾)等)。
-
一个进程可以有一个或多个线程(多线程)。
-
线程之间的通信较容易,因为它们共享进程的资源。
-
2. 主要区别
属性 | 进程 (Process) | 线程 (Thread) |
---|---|---|
基本概念 | 独立运行的程序实例,操作系统资源分配的基本单位。 | 进程中的一个执行单元,CPU 调度的基本单位。 |
地址空间 | 每个进程有自己独立的地址空间,地址空间之间相互隔离。 | 线程是共享进程的地址空间,不同线程可以访问相同的内存和资源。 |
资源共享 | 进程之间不共享资源(除非通过进程间通信 IPC)。 | 同一进程内的所有线程共享资源(如内存、文件句柄)。 |
通信方式 | 进程间通信(IPC,如管道、消息队列、共享内存等)较复杂,效率较低。 | 线程间通信非常简单,可直接使用共享内存或同步机制(如锁)。 |
开销 | 创建进程开销较大(如分配独立内存、加载程序代码等)。 | 创建线程开销较小(因为线程共享进程资源)。 |
调度 | 由操作系统内核调度,进程的切换(上下文切换)开销较大。 | 由操作系统内核调度,线程切换的开销比进程切换小。 |
独立性 | 进程是独立的,进程之间的崩溃不会影响其他进程。 | 同一进程中的线程是相互依赖的,一个线程崩溃可能会导致整个进程崩溃。 |
生命周期 | 进程的生命周期较长,通常由操作系统管理。 | 线程的生命周期较短,通常由进程管理,线程的结束不影响进程本身。 |
并发性 | 进程之间可以并发执行(多进程)。 | 同一进程内多个线程可以并发执行(多线程)。 |
使用场景 | 多进程常用于独立的应用程序或服务(如浏览器的不同标签页是不同进程)。 | 多线程常用于需要共享资源的场景(如计算密集型任务的并行处理)。 |
3. 进程与线程的关系
-
进程是线程的容器
-
一个进程中至少有一个主线程。
-
线程运行在进程中,依赖进程提供的资源(如内存和文件)。
-
-
线程共享进程资源
-
同一个进程中的所有线程共享全局变量、文件句柄、堆栈等资源。
-
但每个线程有自己的线程栈和寄存器上下文。
-
-
进程可以包含多个线程
-
多线程可以提高程序的并发性和性能。
-
例如,一个文本编辑器(进程)可以同时执行多个线程:一个线程负责用户输入,另一个线程负责语法检查,还有一个线程负责文件保存。
-
4. 优缺点对比
进程的优缺点:
优点 | 缺点 |
---|---|
独立性强,一个进程的崩溃不会影响其他进程。 | 创建和销毁进程的开销较大(如分配独立内存空间)。 |
安全性高,进程之间的资源隔离避免了意外修改。 | 进程间通信(IPC)复杂,效率较低。 |
适合运行独立的应用程序或服务。 | 上下文切换开销大,影响性能。 |
线程的优缺点
优点 | 缺点 |
---|---|
线程间通信简单,直接共享进程资源。 | 同一进程中的线程没有资源隔离,一个线程崩溃可能导致整个进程崩溃。 |
创建和销毁线程的开销小,效率高。 | 多线程共享资源容易引发同步问题(如死锁、资源竞争等)。 |
多线程可以充分利用多核 CPU 的并行计算能力。 | 开发多线程程序更复杂,需要处理线程同步和调度问题。 |
5. 实际应用场景
例如每个 Android 应用程序是一个独立的进程,在 Android 中,子线程用于执行耗时操作(如网络请求),而主线程用于更新 UI;
现代浏览器使用多进程架构,不同标签页运行在不同进程中,避免一个标签崩溃影响其他标签;数据库服务器(如 MySQL)运行在独立进程中,与客户端隔离。
6. 形象比喻
- 进程: 进程就像是一栋独立的房子,每栋房子有自己的独立空间,房子之间互不干扰。
- 线程: 线程就像是房子里的房间,每个房间共享房子的资源,但每个房间可以独立完成自己的任务。
【注释】
文件句柄:是操作系统用来标识打开文件的一个整数值。它是进程与文件系统之间的接口。在 Java 中,文件句柄对应 java.io.FileDescriptor 类。大多数 I/O 操作都是通过文件句柄来进行的,比如 FileInputStream、FileOutputStream 等。