【面试问题】进程和线程的区别——通俗易懂

news2024/9/21 23:32:50

  • 1. ”进程“是什么
    • 1.2 管理进程
    • 1.3 内存管理
    • 1.4 进程间通信
  • 2. 线程是什么
  • 3.进程和线程的区别

1. ”进程“是什么

在对比"进程"和"线程"两者之间的区别前,我们需要先了解什么是"进程"?什么是"线程"?

**“进程”(process)也叫"任务"(task)**即咱们电脑的任务管理器中有个进程页面,这个页面所展示的都是电脑里正在运行的一些进程.只有当一个程序跑起来了,才能叫"进程",否则不算是"进程",像电脑磁盘里放着一些文件、可执行程序等等这些都不能算是进程!

在这里插入图片描述

一个系统在同一时刻可以跑多个进程,每个进程都会消耗一些资源CPU,内存,磁盘,网络…所以当进程多了电脑了就卡了呗.(有的人说是C盘东西多了,电脑卡清一清就没事了,其实也跟这个有一定关联,当你把软件卸了,对应着"进程"也就没了.因此电脑卡的本质就是同一时刻进程数量太多,CPU扛不住了~.那么这个时候就有大聪明说了:“那我在网上下载的学习资料,会不会导致电脑卡呢”?一般来说是不会卡的,因为下载后它只是一个程序,并没有运行起来,不过当你把学习资料打开了俺就不知道卡不卡咯<=_<=)因此"进程"是操作系统资源的分配单位,"进程"是由操作系统内核负责管理.

1.2 管理进程

“进程"是一个重要的"软件资源”,**是由操作系统内核负责管理的.**这里的管理分两部分:描述,组织.

所谓描述即有哪些属性和特征;组织即通过一定的数据结构把多个这样的基本单位(进程)串起来.

一、描述: 使用结构体(C语言)描述"进程"属性,这个结构体有个特殊的名字**“PCB”(进程控制块);**

  1. 进程持有哪些硬件资源:

a)pid:进程的身份标识符(唯一数字).

b)内存指针: 指向了当前对象的内存是哪些.(分配内存)

c)文件描述附表: 硬盘文件等其他资源.

以上资源都比较好分配,不好分配的资源"CPU",我们看到在任务管理器上跑着上百个"进程",而CPU只有一个(现在都是多核心CPU),为了能够保证这些进程能"同时运行",“分时复用”,于是涉及到以下两个概念:

并行: 微观上同一时刻,两个核心上的进程,用时执行.

并发: 微观上,同一时刻,一个核心只能运行一个进程,但是它能够对多个进程之间进行超快速的切换.我们看起来好像是在同时运行.

“并行"和"并发"往往统称为"并发”.因此并发解决了多个进程运行.而为了分配有限的CPU,操作系统提供了一个调度器模块,来负责调度CPU执行这么多个进程.而引入进程就是为了解决"并发编程"问题.

  1. 进程调度的相关属性:

    a)进程的状态:

    就绪状态:随时准备去cpu执行

    **运行状态:**正在执行

    **阻塞状态:**一个进程短时间内无法响应.

    b)优先级:比如进程A急需,进程B可以等一会,那么就会先执行进程A

    c)上下文:CPU的寄存器记录A进程在CPU执行到什么进度了,等操作系统调度完B进程回来,能够继续按A进程上次在CPU执行的进度继续下去.(类似于游戏存档读档).寄存器保存的就是这个进程运行过程中的进度,而保存上下文就是寄存器的值存在PCB中,恢复上下文就是把PCB中的值给寄存器恢复回去.

    d)记账信息:操作系统统计每个进程在CPU上占用的时间和执行的数量,根据这个决定下一次如何调度

    二、**组织:**通过双向链表把多个PCB串到一起.

创建一个进程,其实是创建一个PCB结构体对象,并插入到链表中,销毁即把PCB节点删除掉,任务管理器看到的进程列表,其实是遍历这个PCB链表.

1.3 内存管理

前面提到“内存指针”,表示的是当前进程的内存有哪些,这里的指针指向的并非是一个真实的内存,而经过了一个抽象的过程构造出一个虚拟内存。

为了防止多个进程的内存之间相互干扰(比如“内存越界导致程序bug”),引用了“虚拟地址空间”,不再使用真实的物理地址,由操作系统和MMU硬件设备进行虚拟到物理地址的转换。当转换前的进程内存越界了,MMU就会转换失败,及时向进程反馈错误(SIGN SEGEMENT FAULT 导致进程崩溃)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZJbKRCK-1670414253949)(C:\Users\COFFEEWEN\AppData\Roaming\Typora\typora-user-images\image-20221206202849420.png)]

1.4 进程间通信

有些情况下,多个进程之间需要进行数据的交互,于是就有了进程间通信。进程间通信有多种实现方式,但核心思路是一样的,大概就是有一个“公共空间”,多个进程都可以访问。(就好比外卖柜,每个人都可以点外卖,外卖员 把外卖放进外卖柜,点单人再去外卖柜取。)

目前主流操作系统的进程通信机制有如下:

  1. 管道
  2. 共享内存
  3. 文件
  4. 网络
  5. 信号量
  6. 信号

2. 线程是什么

引入进程最主要的目的是为了解决"并发编程"问题,这也就意味着CPU进入到了多核心时代。前面提过电脑卡是因为CPU跑的线程过多导致的.那么增加了CPU的核心就可以完全解决卡顿问题吗?其实并不是,只有进程的话,进程的创建销毁和调度开销太大(消耗资源多,速度慢),为了进一步提高性能,于是引入了"线程 “【也叫"轻量级进程”:节省了创建/销毁资源】

“线程”:一个线程就是一个"执行流",每个线程按照顺序执行自己的代码,多个线程之间可以"同时"执行多份代码.

**一个进程最少包含一个(主线程)或多个"线程",每个线程有自己的执行任务的逻辑(执行流),在一个进程里的线程共享一个内存空间,而线程是操作系统调度的分配单位.**一个线程也是通过一个PCB来描述的(前面说的进程都是建立在一个进程里只有一个线程来讲的.),一个进程里就有可能对应着多个PCB.【节省了创建/销毁资源:只有当创建第一个线程时,开销跟创建一个进程是一样的,后续的线程创建和销毁,只是创建和销毁线程,并没有进行销毁/创建资源(线程多少会占用点资源的).从而也就节省了开销。】

抽象?来个栗子:

比如我家开了个加工厂,厂里有一套加工设备和一条物流线专门供应这个工厂进出货物。一个月后做的风生水起,这时候我想扩建一下,于是我就决定再加一个厂再进一套设备,再联系一条物流线。但是这样就很麻烦了,要找厂要找物流,于是我又决定干脆直接在原先的厂里再进一套加工设备,这样不就省了场地和物流吗?而在一个厂房里的多个加工设备是共享共用一个厂房里的资源。这就是所谓的一个进程里有多个线程,叫做“多线程”。而再开一个厂,这叫做“多进程”。 但是有个例外,当一个厂房里塞满了加工设备,这个时候并不一定能提高效率了,反而会变的慢。多个设备在一个厂房里共用一个资源,当A设备需要这个加工材料时,B设备正好也需要,于是就可能这两个设备“干起来了”,但是开多个厂就不会有这种现象。这种现象称为“线程安全问题” 其实还有很多的“线程安全问题”根本问题就是**“线程”之间是“抢占式”访问的。** 其中有一个问题就是:如果一个线程抛异常,可能导致整个进程出异常,也就是这个进程里的所有线程没了.所以 进程比线程安全,线程比进程效率高

3.进程和线程的区别

  • 进程:
  1. 创建、销毁、调度慢。
  2. 多个进程之间不共享同一个内存空间。
  3. 进程是体统分配资源的最小单位。
  • 线程:
  1. 创建、销毁、调度快。
  2. 一个进程里至少有一个线程(即主线程)或多个线程。
  3. 多个线程之间共享同一个内存空间。
  4. 线程是系统调度的最小单位。

线程虽然比进程轻量,但是人们还不满足,于是有了“线程池”(ThreadPool)和“携程”(Coroutine)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HIFI测序揭示拟南芥MSH1参与介导的细胞器基因组重组与变异积累规律

近日&#xff0c;中国农业科学院农业基因组所武志强课题组在《The Plant Journal》在线发表了题为“Long-read sequencing characterizes mitochondrial and plastid genome variants in Arabidopsis msh1 mutants”的研究论文&#xff0c;该研究通过高精度的长读长测序&#x…

安卓APP源码和设计报告——仿淘宝水果商城

项目名称 仿淘宝水果商城项目概述 随着互联网技术地高速发展&#xff0c;计算机进入到每一个人的生活里&#xff0c;从人们的生活方式到整个社会的运转都产生了巨大的变革&#xff0c;而在信息技术发达的今天&#xff0c;互联网的各种娱乐方式都在渗透到人们的生活方式之中&…

Procreate绘画教程

Procreate绘画教程 从 30 多年的设计师/插画家那里彻底有效地学习 Procreate&#xff01;已更新至 Procreate 5.2&#xff01; 课程英文名&#xff1a;Procreate Solid Foundations 此视频教程共10.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码…

三条建议!让您在世界杯期间确保网络安全!

2022年11月&#xff0c;全球的目光都聚焦在依旧“夏日炎炎”的卡塔尔。随着人们观看、分享赛事的习惯从传统的电视转为网络&#xff0c;世界杯必将成为整个2022年的“流量王”。在我国&#xff0c;仅仅德国与日本的一场比赛在微博平台就带来了13.8亿次阅读。 据估计&#xff0…

细粒度图像分类论文研读-2020

文章目录Filtration and Distillation: Enhancing RegionAttention for Fine-Grained Visual Categorization(by localization- classification subnetwork)AbstractIntroductionApproachDiscriminative Regions ProposingFeature Learning and Recognition EnsembleFiltration…

Spring源码深度解析:十一、Spring的循环依赖

一、前言 文章目录&#xff1a;Spring源码深度解析&#xff1a;文章目录 这篇文章是接着 Spring源码深度解析&#xff1a;七、bean的加载① - doGetBean 的继续分析过程。 二、什么是循环依赖 循环依赖&#xff0c;其实就是循环引用&#xff0c;就是两个或者两个以上的 bea…

【MySQL】数据处理函数

只有当你开始相信自己时&#xff0c;你才拥有真正的人生。——《洛奇》 前言&#xff1a; 大家好&#xff0c;我是爱打拳的程序猿。今天给大家展示是数据处理函数的用法&#xff0c;分为单行处理函数和分组函数。数据处理函数主要是为了更方便解决数据的各种问题。文章以代码和…

2023年Unity UI教程

2023年Unity UI教程 Unity 新 UI 系统 UI 工具包的完整概述 课程英文名&#xff1a;Modern Unity UI with UI Toolkit 此视频教程共10.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码附件全 下载地址 课程编号&#xff1a;336 百度网盘地址&am…

SSM框架-获取容器的方式

9 容器 9.1 获取容器 记载类路径下的容器所在的配置文件,也就是之前用的 public class App2 {public static void main(String[] args) {ApplicationContext ctx new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao (BookDao) ctx.…

liunx 部署 kkfileview文件预览 以及解决https访问

kkfileview gitee地址 https://gitee.com/kekingcn/file-online-preview 1.下载office组件 wget https://kkfileview.keking.cn/LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz tar -zxvf LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz cd LibreOffice_7.1.4.2_Linux_x86-64_rpm/R…

TensorRT推理手写数字分类(一)

系列文章目录 &#xff08;一&#xff09;使用pytorch搭建模型并训练 文章目录系列文章目录前言一、网络搭建1.LeNet网络结构2.pytorch代码二、网络训练1.pytorch代码2.结果展示三、保存和加载模型1.保存整个网络2.保存网络中的参数总结前言 为了学习一下使用TensorRT进行推理…

硬核!Github星标79.4K的阿里强推Java面试参考指南到底有多强?

谈到Java面试&#xff0c;相信大家第一时间脑子里想到的词肯定是金三银四&#xff0c;金九银十。好像大家的潜意识里做Java开发的都得在这个时候才能出去面试&#xff0c;跳槽成功率才高&#xff01;但LZ不这么认为&#xff0c;LZ觉得我们做技术的一生中会遇到很多大大小小的面…

Java并发编程—如何写好代码?链式调用该怎么玩?

目录 一、案例说明 二、原生方式代码流程 三、链式调用代码流程 四、链式调用手搓的方式&#xff1a; 五、总结&#xff1a; 在上一篇博客https://blog.csdn.net/qq_52545155/article/details/128212148?spm1001.2014.3001.5501&#xff0c;博主在写商城统计商品价格的时…

mybatis中其他数据源也使用XML进行操作(SqlSessionFactory.openSession(Connection connection)方法)

文章目录1. 前言2. 先说结论3. 例子1. 准备数据2. 思考过程3. 结论1. 前言 当前在使用springbootmybatis的时候&#xff0c;通常会先在配置文件中配置好数据源&#xff0c;并在Mapper.xml文件编写好相关SQL&#xff0c;使用mybatis进行对数据库进行所谓的crud操作。 有时候会出…

nginx代理https妈妈级手册

目录 背景说明 相关地址 https证书生成 nginx安装及配置 结果展示​编辑 背景说明 为了保证传输加密、访问安全&#xff0c;我们采用nginx服务器将http服务代理为https。所需材料&#xff1a;openssl&#xff08;用来生成证书&#xff09;、http服务、nginx自身。 相关地址…

C/C++第三方库zeromq、log4cpp交叉编译、本地安装ubuntu180.04

一、zeromq的编译安装 1&#xff09;ubuntu下命令 apt-get install libzmq3-dev不推荐这种方式&#xff0c;因为很可能安装的版本并不是最新的&#xff1b; 2&#xff09;自己编译安装&#xff08;推荐&#xff09; 地址&#xff1a;https://github.com/zeromq/libzmq/relea…

设计模式--装饰者模式

文章目录前言一、未使用设计模式二、装饰者模式1.定义2.角色三、应用场景四、优缺点优缺前言 晓子&#xff08;咖啡店员&#xff09;&#xff0c;来一杯美式&#xff0c;加点威士忌和砂糖。 抱歉啊&#xff0c;猫。收银系统还没有你说的组合&#xff0c;要不换一个&#x1f60…

React 的调度系统 Scheduler

大家好&#xff0c;我是前端西瓜哥。今天来学习 React 的调度系统 Scheduler。 React 版本为 18.2.0 React 使用了全新的 Fiber 架构&#xff0c;将原本需要一次性递归找出所有的改变&#xff0c;并一次性更新真实 DOM 的流程&#xff0c;改成通过时间分片&#xff0c;先分成一…

nnUnet测试

https://github.com/MIC-DKFZ/nnUNet nnUnet要在Windows上跑起来有点麻烦&#xff0c;主要是项目路径的问题&#xff0c;我目前测试了2分类遥感数据&#xff08;其实只要是二分类都行&#xff0c;无所谓什么数据&#xff09;&#xff0c;我这里说难是因为我没有安装&#xff0…

【SQL】MVCC 多版本并发控制

MVCC多版本并发控制快照读与当前读隔离级别隐藏字段&#xff0c;undo log 版本链隐藏字段trx_id版本链read view举例说明read committed&#xff08;读已提交&#xff09;隔离级别下repeatable read&#xff08;可重复读&#xff09;隔离级别下innodb如何解决幻读总结并发问题的…