进程与线程,一次说清!

😄作者简介: 小曾同学.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 等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小曾同学.com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值