首页 > 系统相关 >线程和进程的区别

线程和进程的区别

时间:2025-01-13 16:32:15浏览次数:3  
标签:区别 线程 进程 共享 执行 CPU 资源

1、线程是什么

线程是应用程序执行的最小单位,是CPU调度和执行的基本单元。然后每一个进程至少都会有一个线程(也就是main方法所在的线程,也称为主线程),也可以有多个线程。线程在进程运行中,也共享进程的资源(比如内存、文件扫描等等)。线程本身也拥有自己的执行路径、计数器、栈和局部变量等等。

简单来说,一个线程其实就是一个执行流,每个进程都能拥有一个或者多个执行流。

(需要了解进程的话可以去看上一篇博文,里面有具体内容)


1.1线程的状态

新建状态(New):线程被创建,但是还没启动。

就绪状态(Ready):线程准备好了,可以在CPU上运行,但是得等待调度。

运行状态(Running):线程被调度到CPU上运行。

阻塞状态(Blocked):线程在等待某些操作时(如I/O操作、锁),会被阻碍。

终止状态(Terminated):线程执行完毕,生命周期结束。


2、为啥要有线程

2.1、“并发编程”成为“刚需”

  • 单核CPU的发展遇到了瓶颈,想要提高算力,就需要多核CPU,并发编程就更能利用多核CPU的资源。
  • 有许多应用场景都需要“等待IO”,在等待IO的时候,为了能够让计算机继续运行其他工做,“并发编程”也就成了其中的关键。

2.2、进程可以实现并发编程,但是线程更加轻量级

  • 创建线程比创建进程快。
  • 销毁线程比销毁进程快。
  • 调度线程比调度进程快。

3、线程和进程的区别

3.1、定义

进程:操作系统分配资源的基本单位,表示一个正在执行的程序。每一个进程都拥有独立的内存、系统资源、文件描述等。操作系统通过进程来隔离不同应用程序的运行。

线程:线程是进程的执行单位,是CPU指令执行的基本单位。一个进程可以拥有多个线程,这些线程共享进程所得的系统资源,但是每个线程都有自己的独立执行的栈和计数器。

就好比如一个黑老大,他有地盘有资源,他就要把这些地盘和资源分给小弟,让这些小弟给他处理各种杂碎的事情,这些小弟也就共享了黑老大的资源和地盘。


3.2、资源占用

  • 进程:每一个进程都拥有自己独立的内存、代码、数据和堆栈,每一次创建都要较高的资源和时间开销。
  • 线程:每一个进程都是在一个进程里面的,进程拥有的资源有限,多线程共享进程里的资源,线程之间的切换比进程之间的切换更加高效,因为他们切换不需要更改内存上下文。

3.3、内存空间

  • 进程:进程之间是隔离的,每个进程都有自己的独立空间,所以当某个进程崩溃后其他进程并不会被影响。
  • 线程:线程共享同一进程的内存空间,包括代码段、数据段等。这使得线程之间可以方便地进行通信,但也带来共享数据时需要同步的问题(如死锁、数据竞争等)。

3.4、通信方式

  • 进程:进程间通信(IPC)需要专门的机制,如管道、消息队列、共享内存、套接字等。因为进程之间是独立的,所以直接访问其他进程的内存空间是不可行的。
  • 线程:同一进程中的线程可以直接访问共享内存,进行高效的数据交换。线程间通信的方式比进程间通信更加直接和高效。

3.5、创建与销毁

  • 进程:创建一个进程的开销比较大,需要操作系统分配独立的内存空间和资源。进程的创建和销毁都比较耗时和复杂。
  • 线程:线程的创建和销毁比进程要轻量得多。因为线程共享进程的资源,线程的创建和销毁只需要分配和释放少量资源。

3.6、切换开销

  • 进程:进程是操作系统资源的独立单位,当切换进程时,操作系统需要保存和恢复当前进程的上下文,包括寄存器、内存、打开的文件等。
  • 线程:线程切换的开销较小,因为线程共享进程的资源,切换时只需要恢复上下文,不需要涉及进程级别的内存切换。

3.7、使用场景

  • 进程:适用于独立的任务执行,如运行不同的应用程序、服务等。每个进程之间隔离性和独立性高,适合多任务操作。
  • 线程:适用于需要大量并操作的场景,如在同一个应用程序中需要执行多个并发任务(例如浏览器中多个标签网页,Web服务器的请求处理等)。

选择使用进程还是线程取决于任务的需求,进程适合独立任务,线程适合并发执行和高效的资源共享。 

标签:区别,线程,进程,共享,执行,CPU,资源
From: https://blog.csdn.net/2301_80302655/article/details/144751733

相关文章

  • 鸿蒙 NEXT 开发中,普通对象跨线程如何传递
    大家好,我是V哥,在鸿蒙HarmonyOSNEXT开发中,跨线程对象传递可以通过拷贝形式实现,确保两个线程的对象内容一致,但各自指向线程的隔离内存区间。以下是使用SharedArrayBuffer实现跨线程共享内存的完整案例代码,包括详细解释,整理的学习笔记,分享给大家。关注威哥不迷路,学习鸿蒙就很酷。......
  • html和html5有什么区别呢?
    HTML与HTML5在前端开发中的区别主要体现在以下几个方面:文档类型声明:HTML的文档类型声明较为复杂且通常自动生成,难以记忆。HTML5的文档类型声明则大大简化,更加易于记忆和使用。结构语义化:HTML缺乏结构语义化的标签,难以清晰表达文档结构。HTML5新增了如<header>,<nav>......
  • Standards模式和Quirks模式有什么区别?
    Standards模式和Quirks模式在前端开发中的主要区别体现在浏览器如何解释和渲染HTML和CSS。这两种模式是由文档类型(DOCTYPE)声明触发的,对前端开发者和网页设计师来说至关重要。以下是它们之间的主要区别:渲染方式的差异:Standards模式:也称为严格呈现模式,用于呈现遵循最新Web标准......
  • rgba()和opacity这两个的透明效果有什么区别呢?
    rgba()和opacity在前端开发中都是用来实现透明效果的,但它们之间存在着一些显著的区别。以下是对这两者透明效果差异的详细解释:取值范围与透明度控制:rgba():这是一个CSS颜色函数,用于设置颜色,并可以指定其透明度。rgba代表红绿蓝和透明度(Alpha)四个通道,取值范围是0-255(红、绿、蓝......
  • Qt多线程开发全解析
     目录一、引言二、Qt多线程基础概念2.1线程与进程2.2Qt中的线程类三、Qt多线程的使用场景3.1耗时操作处理3.2实时数据处理3.3多任务并发执行四、Qt多线程的实现方式4.1继承QThread类4.2使用QThreadPool线程池4.3利用QtConcurrent框架五、线程间的同步......
  • DOM和BOM有什么区别?
    DOM和BOM在前端开发中都是重要的概念,它们之间的区别可以从以下几个方面进行阐述:含义不同:DOM,全称为DocumentObjectModel(文档对象模型),是W3C组织推荐的处理可扩展置标语言的标准编程接口。它定义了表示和修改文档所需的对象和这些对象的行为和属性,以及这些对象之间的关系。简......
  • 请说说`<script>`、`<script async>`和`<script defer>`的区别
    在前端开发中,<script>标签用于嵌入或引用JavaScript代码。<script>标签有几个属性可以影响脚本的加载和执行方式,其中async和defer是两个常用的属性。以下是它们之间的主要区别:普通的<script>:当浏览器遇到<script>标签时,它会立即下载并执行该脚本。在执行脚本期......
  • 说说bind、call、apply的区别?并手写实现一个bind的方法
    bind、call、apply都是JavaScript中改变函数执行上下文的方法,他们的主要区别体现在调用函数时所传递的参数形式上。call:call方法接收一个参数列表,第一个参数将用作函数中的this对象,其余参数将直接作为函数调用时的参数。functiongreet(greeting,name){console.l......
  • 【芯片封测学习专栏 -- D2D 和 C2C 之间的区别】
    请阅读【嵌入式开发学习必备专栏Cache|MMU|AMBABUS|CoreSight|Trace32|CoreLink|ARMGCC|CSH】文章目录OverviewD2D(Die-to-Die)互联D2D定义D2D特点D2D使用场景C2C(Chip-to-Chip)互联C2C定义C2C特点C2C使用场景D2D和C2C的差异总结实际案例D2D......
  • 分析基于ASP.NET Core Kernel的gRPC服务在不同.NET版本的不同部署方式的不同线程池下
    分析基于ASP.NETCoreKernel的gRPC服务在不同.NET版本的不同部署方式的不同线程池下的性能表现使用默认的gRPC项目模板创建,垃圾回收器类型为ServerGC(Servergarbagecollection)。使用ghz工具在不同的请求总数、连接数、并发数的参数下,进行压力测试,接口为/greet.G......