当前位置: 首页 > news >正文

进程和线程的区别和联系

进程和线程的区别和联系

  • 1. 认识线程
  • 2. 进程和线程的关系
  • 3. 进程和线程的区别
  • 4. 线程共享了进程哪些资源
    • 1. 上下文切换
    • 2. 线程共享了进程哪些资源
      • 1.代码区
      • 2. 数据区
      • 3. 堆区

1. 认识线程

线程是进程的一个实体,它被包含在进程中,一个进程至少包含一个线程,一个进程也可以包含多个线程线程CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程.

网络上有一个图片是这样描述进程与线程的:

在这里插入图片描述

为什么会有线程的存在:

早在80年代,由于进程的创建和销毁以及切换存在较大的空间开销,因此人们急需一种轻型的进程技术来减少资源的开销.于是便线程的概念便但诞生了.线程被设计成进程的一个执行路径,同一个进程中的线程共享进程资源.因此系统对于线程的调度远远小于进程.

在这里插入图片描述

虽然说线程之间的切换开销小,但是由于多个线程共享同一个进程的资源,所以如果一个线程崩溃,那么就可能导致整个进程被系统抹杀.但是进程不用担心,每个进程都有独立的代码和数据空间(程序上下文),即使这个进程崩了也不会影响到其他的进程,就类似于我QQ崩了跟我微信有什么关系.

大家通过上述的图片也可以看见,一个进程中包含多个线程,通俗点理解的话就是,我的B站,可以一边看视频,一边投币,顺便再点个收藏这些都是由不同的线程来完成的任务.所以这里就体现了进程和线程的包含关系.

2. 进程和线程的关系

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。

(3)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。

(4)处理机分给线程,即真正在处理机上运行的是线程。

(5)线程是指进程内的一个执行单元,也是进程内的可调度实体。

3. 进程和线程的区别

  1. 本质区别: 进程是操作系统进行资源分配的基本单位,线程是独立调度和分派的基本单位。
  2. 包含关系: 如果一个进程内有多个线程,则执行过程并不是一条直线,而是多条线(线程)共同完成的.线程是进程的一部分,所以线程也被称为轻量级进程或轻权进程.
  3. 资源开销: 每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销:线程可以看作轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小.
  4. 进程和线程的创建和销毁: 假如我要创建一个进程,我先要遍历我的内存资源找到一块合适的内存再分配给它,当我要销毁一个进程时,还是要先遍历我的内存资源,找到我的进程才能对其进行销毁.但是如果是创建一个线程,我们可以认为该进程是一个酒店,当我想创建一个线程时,直接开一个房间就好了,销毁线程时直接退房,此时可以看出,进程的创建和销毁在资源分配上浪费了很多时间,但是线程的创建和销毁则不需要那么麻烦.
  5. 内存分配: 同一个进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的.
  6. 影响关系: 一个进程崩溃后,在保护模式下并不会对其他进程产生影响,但是一个线程崩溃,可能会导致包含该线程的整个进程都直接死掉.所以多进程要比多线程健壮.
  7. .操纵者不同:进程的操纵者一般是操作系统,线程的操纵者一般是编程人员。
  8. 执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行.

4. 线程共享了进程哪些资源

再了解该知识点时,我们先了解一下什么是上下文切换.

1. 上下文切换

这里小鱼画了一个简易的进程和线程的关系图
在这里插入图片描述

为了便于更好的理解我给大家优化一下上述的图:

在这里插入图片描述

我们可以将整个进程看成一个工厂,为生产活动体提供了设计图,场地,流水线(线程)等生产要素,而线程呢?我们就可以理解为是这个工厂的一个个流水线,流水线本身会有一个操作台,具体的零件在这里被生产,由于生产线需要由工人来操作才能开始执行,但是由于这个工人并不知道该零件加工到了哪一部分,所以需要通过查阅该流水线的生产记录才可以弄清这个流水线的零件加工到那种程度,才能为接下来的后续加工提供保障,并且,当工人停止这次流水线的执行之后,也需要记录这次的生产进度,以备下次读取,这些生产进度可以理解为上下文,读生产记录和写生产记录的过程称为上下文切换.

2. 线程共享了进程哪些资源

我们知道了进程和线程的本质区别是:

进程是操作系统进行资源分配的基本单位,线程是独立调度和分派的基本单位.线程之间共享着进程的资源.

但是我们真的理解这句话的含义吗?

下面就为您解答:

线程私有资源

函数运行时的信息保存在栈帧中,栈帧中保存了函数的返回值、调用其它函数的参数、该函数使用的局部变量以及该函数使用的寄存器信息,如图所示,假设函数A调用函数B:

在这里插入图片描述

此外,CPU 执行指令的信息保存在一个叫做程序计数器的寄存器中,通过这个寄存器我们就知道接下来要执行哪一条指令。由于操作系统随时可以暂停线程的运行,因此我们保存以及恢复程序计数器中的值就能知道线程是从哪里暂停的以及该从哪里继续运行了。

由于线程运行的本质就是函数运行,函数运行时信息是保存在栈帧中的,因此每个线程都有自己独立的、私有的栈区。

在这里插入图片描述
同时函数运行时需要额外的寄存器来保存一些信息,像部分局部变量之类。这些寄存器也是线程私有的,一个线程不可能访问到另一个线程的这类寄存器信息。

从上面的讨论中我们知道,到目前为止,所属线程的栈区、程序计数器、栈指针以及函数运行使用的寄存器是线程私有的.

以上这些信息有一个统一的名字,就是线程上下文,thread context。

我们也说过操作系统调度线程需要随时中断线程的运行并且需要线程被暂停后可以继续运行,操作系统之所以能实现这一点,依靠的就是线程上下文信息。

此时我们已经知道了哪些资源是线程私有的。除此之外,剩下的都是线程间共享资源。那么剩下的还有什么呢?还有图中的这些。

在这里插入图片描述

这其实就是进程地址空间的样子,也就是说线程共享进程地址空间中除线程上下文信息中的所有内容,意思就是说线程可以直接读取这些内容。
接下来我们分别来看一下这些区域。

1.代码区

进程地址空间中的代码区,这里保存的是什么呢?从名字中有的同学可能已经猜到了,没错,这里保存的就是我们写的代码,更准确的是编译后的可执行机器指令

那么这些机器指令又是从哪里来的呢?答案是从可执行文件中加载到内存的,可执行程序中的代码区就是用来初始化进程地址空间中的代码区的
在这里插入图片描述

线程之间共享代码区,这就意味着程序中的任何一个函数都可以放到线程中去执行,不存在某个函数只能被特定线程执行的情况。

2. 数据区

进程地址空间中的数据区,这里存放的就是所谓的全局变量/成员变量。

什么是成员变量?(在方法外定义的遍历就是成员变量)

在这里插入图片描述

3. 堆区

堆区是程序员比较熟悉的,我们在 java中new 出来的数据就存放在这个区域,很显然,只要知道变量的地址,也就是引用,任何一个线程都可以访问引用指向的数据,因此堆区也是线程共享的属于进程的资源。

在这里插入图片描述

相关文章:

进程和线程的区别和联系

进程和线程的区别和联系1. 认识线程2. 进程和线程的关系3. 进程和线程的区别4. 线程共享了进程哪些资源1. 上下文切换2. 线程共享了进程哪些资源1.代码区2. 数据区3. 堆区1. 认识线程 线程是进程的一个实体,它被包含在进程中,一个进程至少包含一个线程,一个进程也可以包含多个…...

Java学习笔记——集合

目录集合与数组的对比集合体系结构Collection——常见成员方法Collection——迭代器基本使用Collection——迭代器原理分析Collection——迭代器删除方法增强for——基本格式增强for——注意点Collection——练习集合与数组的对比 package top.xxxx.www.CollectionDemo;import …...

差分运放公式推导-运算放大器

不知道大家有没遇到这种情况,在计算电路的时候,有时候会突然的忘记一些公式啊啥的,需要回去翻看笔记或者查资料,知其然而不知其所以然。今天跟大家一起来一起推导一遍差分运放的计算过程。 计算过程其实归根结底还是根据运放的虚…...

金丹二层 —— 字符串长度求解的四种方法

前言: 1.CSDN由于我的排版不怎么好看,我的有道云笔记比较美观,请移步有道云笔记 2.修炼必备 1)入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (m…...

深入剖析Linux——进程信号

致前行的人: 要努力,但不着急,繁花锦簇,硕果累累都需要过程! 目录 1.信号概念 1.1生活角度的信号 2. 技术应用角度的信号 3.Linux操作系统中查看信号 4.常用信号发送 4.1通过键盘发送信号 4.2调用系统函数发送信号 4.3…...

API-Server的监听器Controller的List分页失效

前言 最近做项目,还是K8S的插件监听器(理论上插件都是通过API-server通信),官方的不同写法居然都能出现争议,争议点就是对API-Server的请求的耗时,说是会影响API-Server。实际上通过源码分析两着有差别&am…...

jupyter notebook 进阶使用:nbextensions,终极避坑

jupyter notebook 进阶使用:nbextensions,终极避坑吐槽安装 jupyter_contrib_nbextensions1. Install the python package(安装python包)方法一,PIP:方法二,Conda(推荐)&…...

C 语言编程 — Doxygen + Graphviz 静态项目分析

目录 文章目录目录安装配置解析Project related configuration optionsBuild related configuration optionsConfiguration options related to warning and progress messagesConfiguration options related to the input filesConfiguration options related to source brows…...

Mybatis报BindingException:Invalid bound statement (not found)异常

一、前言 本文的mybatis是与springboot整合时出现的异常,若使用的不是基于springboot,解决思路也大体一样的。 二、从整合mybatis的三个步骤排查问题 但在这之前,我们先要知道整合mybatis的三个重要的工作,如此才能排查&#x…...

HttpRunner3.x(1)-框架介绍

HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。主要特征继承的所有强大功能requests ,只需以人工方式获得乐趣即可处理HTTP&#xf…...

pytest学习和使用20-pytes如何进行分布式测试?(pytest-xdist)

20-pytes如何进行分布式测试?(pytest-xdist)1 什么是分布式测试?2 为什么要进行分布式测试?2.1 场景1:自动化测试场景2.2 场景2:性能测试场景3 分布式测试有什么特点?4 分布式测试关…...

三、Python 操作 MongoDB ----非 ODM

文章目录一、连接器的安装和配置二、新增文档三、查询文档四、更新文档五、删除文档一、连接器的安装和配置 pymongo: MongoDB 官方提供的 Python 工具包。官方文档: https://pymongo.readthedocs.io/en/stable/ pip安装,命令如下&#xff1…...

求最大公约数和最小公倍数---辗转相除法(欧几里得算法)

目录 一.GCD和LCM 1.最大公约数 2.最小公倍数 二.暴力求解 1.最大公约数 2.最小公倍数 三.辗转相除法 1.最大公约数 2.最小公倍数 一.GCD和LCM 1.最大公约数 最大公约数(Greatest Common Divisor,简称GCD)指的是两个或多个整数共有…...

音视频开发_获取媒体文件的详细信息

一、前言 做音视频开发过程中,经常需要获取媒体文件的详细信息。 比如:获取视频文件的总时间、帧率、尺寸、码率等等信息。 获取音频文件的的总时间、帧率、码率,声道等信息。 这篇文章贴出2个我封装好的函数,直接调用就能获取媒体信息返回,copy过去就能使用,非常方便。…...

Springboot集成Swagger

一、Swagger简介注意点! 在正式发布的时候要关闭swagger(出于安全考虑,而且节省内存空间)之前开发的时候,前端只用管理静态页面, http请求到后端, 模板引擎JSP,故后端是主力如今是前…...

Vue全新一代状态管理库 Pinia【一篇通】

文章目录前言1. Pinia 是什么?1.1 为什么取名叫 Pinia?1.2. 为什么要使用 Pinia ?2. 安装 Pinia2.1.创建 Store2.1.1. Option 类型 Store2.1.2 Setup 函数类型 Store2.1.3 模板中使用3. State 的使用事项(Option Store )3.1 读取 State3.2 …...

STM32 -4 关于STM32的RAM、ROM

一 stm32 的flash是什么、有什么用、注意事项、如何查看 一 、说明 它主要用于存储代码,FLASH 存储器的内容在掉电后不会丢失,STM32 芯片在运行的时候,也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储了应用…...

第一个 Qt 程序

第一个 Qt 程序 “hello world ”的起源要追溯到 1972 年,贝尔实验室著名研究员 Brian Kernighan 在撰写 “B 语言教程与指导(Tutorial Introduction to the Language B)”时初次使用(程序),这是目前已 知最早的在计算机著作中将…...

Spring注解驱动开发--AOP底层原理

Spring注解驱动开发–AOP底层原理 21. AOP-AOP功能测试 AOP:【动态代理】 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式; 1、导入aop模块:Spring AOP,(Spring-aspects) 2、定义一个业务逻辑类(Ma…...

对象的动态创建和销毁以及对象的复制,赋值

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C​​​​​​​ 🔥座右铭:“不要等到什么都没有了,才…...

JVM调优,调的是什么?目的是什么?

文章目录前言一、jvm是如何运行代码的?二、jvm的内存模型1 整体内存模型结构图2 堆中的年代区域划分3 对象在内存模型中是如何流转的?4 什么是FULL GC,STW? 为什么会发生FULL GC?5 要调优,首先要知道有哪些垃圾收集器及哪些算法6 调优不是盲目的,要有依据,几款内…...

docker部署zabbix监控

docker部署zabbix监控 1、环境说明 公有云ubuntu22.04 系统->部署docker环境zabbix-server 6.4 2、准备docker环境 更新apt以及安装一些必要的系统工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-co…...

C语言刷题(6)(猜名次)——“C”

各位CSDN的uu们你们好呀,今天,小雅兰还是在复习噢,今天来给大家介绍一个有意思的题目 题目名称: 猜名次 题目内容: 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果: A选…...

两年外包生涯,感觉自己废了一半....

先说一下自己的情况。大专生,17年通过校招进入湖南某软件公司,干了接近2年的点点点,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了五年的功能测试…...

【python】喜欢XJJ?这不得来一波大采集?

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 俗话说的好:技能学了~就要用在自己喜欢得东西上!! 这我不得听个话~我喜欢小姐姐,跳舞的小姐姐 这不得用python把小姐姐舞采集下来~嘿嘿嘿 完整源码、素材皆可点击文章下方名片…...

公司测试员用例写得乱七八糟,测试总监制定了这份《测试用例编写规范》

统一测试用例编写的规范,为测试设计人员提供测试用例编写的指导,提高编写的测试用例的可读性,可执行性、合理性。为测试执行人员更好执行测试,提高测试效率,最终提高公司整个产品的质量。 一、范围 适用于集成测试用…...

LeetCode 热题 HOT 100【题型归类汇总,助力刷题】

介绍 对于算法题,按题型类别刷题才会更有成效,因此我这里在网上搜索并参考了下 “🔥 LeetCode 热题 HOT 100” 的题型归类,并在其基础上做了一定的完善,希望能够记录自己的刷题历程,有所收获!具…...

【Java进阶篇】—— File类与IO流

一、File类的使用 1.1 概述 File 类以及本章中的各种流都定义在 java.io 包下 一个File对象代表硬盘或网络中可能存在的一个文件或文件夹(文件目录) File 能新建、删除、重命名 文件和目录,但 File不能访问文件内容本身。如果我们想要访问…...

Mysql 竟然还有这么多不为人知的查询优化技巧,还不看看?

前言 Mysql 我随手造200W条数据,给你们讲讲分页优化 MySql 索引失效、回表解析 今天再聊聊一些我想分享的查询优化相关点。 正文 准备模拟数据。 首先是一张 test_orde 表: CREATE TABLE test_order (id INT(11) NOT NULL AUTO_INCREMENT,p_sn VARCHA…...

MATLAB算法实战应用案例精讲-【智能优化算法】海洋捕食者算法(MPA) (附MATLAB和python代码实现)

目录 前言 知识储备 Lvy 飞行 布朗运动 算法原理 算法思想 数学模型...

网站改版Excel怎么做/宁波seo推广哪家好

在SQL Server中执行存储过程:sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。用的时候直接就可以用了。在SQL Server的查询分析器中,输入以下代码:declare tot_amt intexecute order_tot_amt 1,tot_amt outputsele…...

广州卓天跨境电商网站/东莞seo快速排名

假设有如下C语言结构体:struct Tekuba_Net { unsigned char value1;float value2;int value3;};将tekuba_Net结构存放在NSMutableArray类型tekubaArray数组中代码清单如下:struct Tekuba_Net tekuba_Net;tekuba_Net.value11;tekuba_Net.value22.0;tekuba_Net.value32;//将str…...

网站后台可以做两个管理系统么/百度贴吧首页

OpenSSL 生成pfx Window需要安装OpenSSL(需要下载),Linux自带OpenSSL工具(无需安装) Window下载地址: 1. 官网 2. 上传了一份到csdn Window 命令 # 生成私钥 "D:\Program Files\OpenSSL-Win64\bi…...

网站seo关键词/的磁力搜索引擎

使用CEdit::SetLimitText()函数来完成此功能。 Call this member function to set the text limit for this CEdit object. void SetLimitText( UINT nMax ); nMax: The new text limit, in characters. 比如限制ID为IDC_EDIT_CODE的编辑框控件,最多只能输入30个字符…...

新吴区推荐做网站价格/百度平台营销宝典

原文链接 http://www.oschina.net/p/facebook-presto Presto是Facebook最新研发的数据查询引擎,可对250PB以上的数据进行快速地交互式分析。据称该引擎的性能是 Hive 的 10 倍以上。 PrestoDB 是 Facebook 推出的一个大数据的分布式 SQL 查询引擎。可对从数 G 到…...

嘉定做网站/焦作seo推广

希望有大神能够有所指导啊。还是有点不是很了解&#xff0c;下面是自己调试代码的一些体验过程。 #include <ioCC2530.h> #include <string.h>#define uint unsigned int#define uchar unsigned char#define time 10uint i,k,p;//定义LED的端口#define r P1_…...