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

进程和线程的区别

时间:2025-01-14 14:10:35浏览次数:1  
标签:区别 调度 虚拟地址 单位 线程 进程 资源分配

什么是进程和线程? 为什么要引入线程? 进程和线程的区别?
什么是进程和线程?
为什么要引入线程?
进程和线程的区别?
什么是进程和线程?

什么是进程?

进程是程序在某个数据集合上的一次运行活动(不仅包含正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说 CPU、内存、网络资源等),也是操作系统进行资源分配和保护的基本单位

通俗来说,进程就是程序的一次执行过程,程序是静态的,它作为系统中的一种资源是永远存在的。而进程是动态的,它是动态的产生,变化和消亡的,拥有其自己的生命周期

举个例子:同时挂三个 QQ 号,它们就对应三个 QQ 进程,退出一个就会杀死一个对应的进程。但是,就算你把这三个 QQ 全都退出了,QQ 这个程序死亡了吗?显然没有。

什么是线程?

一个进程中可以有多个线程,它们共享这个进程的资源比如代码段、数据段、打开的文件等,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。线程又称为迷你进程,它比进程更容易创建,也更容易撤销

举个例子,QQ 和 Chrome 浏览器是两个进程,Chrome 进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件

操作系统会给每个进程分配一个虚拟地址空间(vitural address),每个进程包含的栈、堆、代码段这些都会从这个地址空间中被分配一个地址,这个地址就被称为虚拟地址,底层指令写入的地址也是虚拟地址。该进程下的所有线程共享这个虚拟地址空间。

有了虚拟地址空间后,CPU 就可以通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到内存之前会先被转换成合适的物理地址,这个虚拟地址到物理地址的转换过程称为地址翻译/地址转换(address translation)。

地址翻译需要 CPU 硬件和操作系统的密切合作:CPU 上的内存管理单元(Memory Management Unit,MMU)就是专门用来进行虚拟地址到物理地址的转换的,不过 MMU 需要借助存放在内存中的页表,而这张表的内容正是由操作系统进行管理的,操作系统为每个进程建立了一张页表

为什么要引入线程?

在引入线程前,进程是操作系统进行资源分配和独立调度的基本单位。

由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,需要较大的时空开销,限制了并发程度的进一步提高。为减少进程切换的开销,把进程作为资源分配单位和调度单位这两个属性分开处理,即进程还是作为资源分配的基本单位,但是不作为调度的基本单位(很少调度或切换),把调度执行与切换的责任交给线程,即线程成为独立调度的基本单位,它比进程更容易(更快)创建,也更容易撤销。

记住这句话!引入线程前,进程是资源分配和独立调度的基本单位。引入线程后,进程是资源分配的基本单位,线程是独立调度的基本单位。

进程和线程的区别?
线程与进程的比较如下:

进程是资源(包括内存、打开的文件等)分配的基本单位,线程是 CPU 调度的基本单位;

进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈;

线程和进程一样具有就绪、阻塞、执行三种基本状态,同样具有状态之间的转换关系;

线程能减少并发执行的时间和空间开销;

对于线程相比进程能减少开销,体现在:

线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息,比如内存管理信息、文件管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,而是共享它们;
线程的终止时间比进程快,因为线程释放的资源相比进程少很多;
同一个进程内的线程切换比进程切换快,因为同一个进程下的线程共享该进程的虚拟地址空间等资源,所以在切换时,这些共享资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据。所以,线程的上下文切换相比进程,开销要小很多;
由于同一进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更高了;
所以,不管是时间效率,还是空间效率线程比进程都要高

标签:区别,调度,虚拟地址,单位,线程,进程,资源分配
From: https://www.cnblogs.com/zh718594493/p/18670653

相关文章

  • Java ProcessBuilder 启动的进程阻塞不退出问题。
    https://wiki.sei.cmu.edu/confluence/display/java/FIO07-J.+Do+not+let+external+processes+block+on+IO+buffers java通过调用进程读取输出启动进程的标准输出时,如果被调用进程的,标准输出以及错误流的缓冲区被写满,后续写入会导致调用进程会卡住,无法正常结束。 确保waiffo......
  • 【操作系统---Linux】Linux编程中最常用的控制线程的函数(内附手绘底层逻辑图 通俗易懂
    绪论​每日激励:“不设限和自我肯定的心态:Icandoallthings。—StephenCurry”绪论​:本章是继承上一章线程基础,本章将结合代码和逻辑图的方式带你去认识和了解控制线程中常用的函数这些函数对后面的开发以及对线程底层的了解都非常的重要,后续将继续更新Linux线......
  • Executor建立线程示范代码java
    importjava.util.concurrent.Executor;publicclasstest{publicstaticvoidmain(String[]args)throwsInterruptedException{SubExecutorsubExecutor=newSubExecutor();subExecutor.execute(newTicketStation(200));subExecutor......
  • C++标准库vector 的push_back和emplace_back有什么区别?
    以下是对vector的push_back和emplace_back方法的详细解释:一、push_back方法功能:push_back是std::vector类的成员函数,用于在向量的末尾添加元素。当使用push_back时,会将元素的副本添加到向量的末尾。使用示例:#include<iostream>#include<vector>cl......
  • 自动化进程如何优化敏捷开发中的工作流
    一、敏捷开发管理工具的现状1.1敏捷开发管理工具的基本功能目前,敏捷开发管理工具的主要功能包括任务管理、进度跟踪、团队协作、资源分配、需求变更管理等。这些工具通常采用看板、任务板、甘特图、Burndown图等形式,帮助团队成员可视化地管理任务、跟踪项目进度、协调跨部门合......
  • 多线程同步与任务完成等待机制总结
    多线程同步与任务完成等待机制总结在多线程编程中,合理的同步机制能够有效地协调多个线程之间的执行顺序,确保任务按照预期执行。常见的同步机制包括CountDownLatch、CyclicBarrier、CompletableFuture、ExecutorService.invokeAll()和Phaser。接下来,我们将通过具体场景加......
  • OpenTelemetry 与prometheus的区别
    OpenTelemetry和Prometheus是两个在可观测性领域中常用的工具。但它们之间存在多方面的区别,本文从功能特性、数据模型、生态系统与集成等多个维度进行比较,最后给出它们的应用场景和适用返回。功能特性维度区别OpenTelemetry提供了一套全面的可观测性解决方案,涵盖了分布式追踪......
  • C++中线程同步与互斥的4种方式介绍、对比、场景举例
    在C++中,当两个或更多的线程需要访问共享数据时,就会出现线程安全问题。这是因为,如果没有适当的同步机制,一个线程可能在另一个线程还没有完成对数据的修改就开始访问数据,这将导致数据的不一致性和程序的不可预测性。为了解决这个问题,C++提供了多种线程同步和互斥的机制。1.......
  • inline、block、inline-block这三个属性值有什么区别?
    在前端开发中,CSS的display属性用于决定元素如何在页面上呈现。inline、block和inline-block是这个属性的三个常见值,它们各自具有不同的特点和行为。以下是这三个属性值的详细区别:block(块级元素):块级元素会独占一行,即在其前后创建新的行。块级元素会尽可能宽,默认填满其父元素......
  • css3的:nth-child和:nth-of-type的区别是什么?
    在CSS3中,:nth-child()和:nth-of-type()是两个功能强大的伪类选择器,它们都允许你选择一组元素中的特定元素,但它们的选择机制有所不同。:nth-child():nth-child()选择器是基于元素在其父元素中的位置(即它是第几个子元素)来选择元素的。这个选择器的计数是从1开始的,而且它会考......