线程的认识,本质,和进程的区别,哪些结构是共享/独立的,切换成本,不同os下的线程

目录

再次认识进程

用户视角

内核视角

引入线程 

概念

调度的基本单位 

模拟出图像

思考

线程的本质

线程和进程的区别 

线程哪些结构是共享的

引入

地址空间

系统资源

​编辑

线程哪些结构是单独拥有 

引入

地址空间

系统资源

线程间切换的成本更低

linux和windows下的线程


再次认识进程

用户视角

  • 之前我们对进程有一个概念,进程 = 进程相关内核数据结构 + 代码数据:
  • 这些都是我们可以看到的,进程确实有代码数据,有task_struct等等结构:

内核视角

  • 我们看到的那些,都是必须占用内存资源,否则凭什么可以被我们看到
  • 并且,进程包括的这些内容,都必须一起被开辟空间,不然单独申请一个页表或者别的属实没啥用
  • 也就是说 -- 我们申请资源时,都是以进程为单位
  • 说的高级一点就是 -- 进程是承担分配系统资源的基本实体

引入线程 

概念

  • 指一个程序里的一个执行路线
  • 多线程可以实现并发执行,它使得程序能够在同一进程内并发执行多个任务
  • 每个线程都可以独立执行不同的部分,从而使得多个任务可以同时进行,提高了程序的整体性能

调度的基本单位 

  • 之前我们曾说,cpu调度时,调度的是进程
  • 这里说的更清晰一点,其实调度的是task_struct

模拟出图像

通过从上面的概念,我们可以模拟出它在内核中的样子:

思考

我们是如何得到这幅图像的呢?

由于线程可以执行任务,且cpu调度的单位是pcb

  • 所以我们的线程至少需要一个pcb

因为线程可以在进程内执行任务

  • 所以首先明确,线程是囊括在进程范围内的
  • 不然如何拿到进程的资源呢?

因为执行的是进程派给它的任务

  • 所以线程可以直接使用进程的数据结构和资源
  • 因为进程在申请空间时,就已经创建过了,不需要线程再创建

因为在进程内执行

  • 进程内,实际上就是在进程的地址空间上执行
  • 因为线程执行任务用的就是进程的地址空间

然后将当前进程的资源分配给线程,这样线程就可以执行分配给他的那一部分的代码

通过cpu的调度,就可以实现并发

线程的本质

从图上来看,那些task_struct其实就可以被看作是线程

  • 因为比起进程来说,线程只是创建出更多的task_struct

前面说过,cpu调度的是task_struct

  • 那么也可以说 -- cpu的调度单位是线程
  • 其实cpu不关心它调度的是进程还是线程,它只认pcb

因为线程是cpu调度的基本单位

  • 所以线程也可以被叫做是进程内部的执行流

并且,线程的资源来自于进程,进程的资源来自于内核,这是有先后顺序的

线程和进程的区别 

这张图是我们之前认识的进程,一个进程只有一个pcb:

今天我们拓展了进程的概念,它可以拥有多个pcb,一个pcb就是一个线程:

通过这两张图我们可以发现:

  • 我们介绍的线程在调度时,和之前认识的进程,流程是一样的,将虚拟地址转换为物理地址,然后进行访问
  • 唯一不同的就是pcb的数量不同(也就是内部执行流数量不同)
  • 所以,我们之前学习的进程,实际上就是只拥有一个线程的进程
  • 下面那张图属于单进程多线程的进程

线程哪些结构是共享的

引入
  • 线程的资源都来源于进程
  • 为了更好的执行任务,很多资源都是被线程共享的
  • 比如多个线程共用一个地址空间
地址空间

所以,对于地址空间来说(从下往上看):

  • 代码区肯定是共享的,毕竟线程要执行的任务需要用到代码区的数据(比如函数,线程是可以调用的)
  • 全局区也是共享的,线程可以拿到全局变量
  • 堆区也是共享的,线程可以访问堆区上已经开辟的空间,但是一般访问不到(因为访问空间需要拿到起始地址)
  • 共享区肯定是可以共享的,他本来就是用于进程/线程共享的
系统资源
  • 这些基本的系统资源,都是共享的
  • 毕竟线程是用来完成同一进程的任务的,有些数据还是统一的比较好

线程哪些结构是单独拥有 

引入
  • 难道所有资源都是共享的吗?
  • 肯定不是这样的
  • 因为不同的线程执行的任务一般是不一样的,拥有的上下文数据肯定也不一样
地址空间

  • 栈区是不可以共享的,因为任务用到的变量肯定是不一样的
  • 所以要为每个线程分配不同的栈区域
系统资源
  • 因为执行的任务不同,线程也不同
  • 为了区分每个线程,以下资源是不可以共享的

  • 线程id用于区分线程,就像进程pid一样
  • 寄存器用于存放上下文数据,肯定要为每个线程单独配套,不然就乱了
  • 每个线程的状况不同,errno,信号屏蔽字,优先级自然也要不同

线程间切换的成本更低

为什么会这样说呢?

  • 切换的时候,是需要更换上下文数据的,不同的进程用到的资源一般不同,所以需要全部切换
  • 但是,线程的切换不需要切换地址空间和页表,以及其他的一些资源

当然,这些都只占原因的一部分,最大原因在于cpu的缓存机制:

  • 如果cpu直接与硬件交流,效率会很低,会耽误cpu的执行(因为要等待外设读取成功)
  • 所以cpu内置了cache,作为中间介质,提高io效率
  • 它会根据局部性原理,将内存的部分数据预读到cpu内部,方便cpu读取

  • 对于线程之间切换,他们很可能会用到相同的数据,所以缓存中的数据不会清除
  • 对于进程来说,由于进程的独立性,每次进程切换,都需要重新预读数据

linux和windows下的线程

  • 所以,linux下是没有真正意义上的线程结构的
  • 他是用pcb模拟出线程,而不是单独定义一种结构
  • windows下有真正的线程结构
  • 这两者比起来,linux中的线程执行任务时更加轻量化

为什么这么说呢?

  • windows中有单独的数据结构,那么在调度时,就会比linux更加频繁的切换上下文
  • 维护的成本也更加高(比如创建/释放线程,管理线程),而不像linux中,直接复用管理task_struct的方式即可

这样会造成什么结果呢?

  • 就是因为windows中调度时,数据结构更加复杂,所以它不能长时间运行,不然肯定会出问题
  • 而linux可以一直运行很久 

所以,我们一般将linux中的的进程,称为轻量化进程

  • 就是因为它和单独定义了线程结构的操作系统比起来,运行更加轻量化 :
  • 在linux的cpu眼中,它看到的pcb的量级 <= 线程拥有单独数据结构的系统中的pcb
  • 其他系统的pcb,代表的是完整的一个进程
  • 而linux中的pcb可能只代表进程中的一个执行流,那么它要调度的资源就比完整进程的要少 ; 也可能代表的也是完整进程,那么此时量级就相等了

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

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

相关文章

代码随想录算法训练营第五十九天|503. 下一个更大元素 II、42. 接雨水

第十章 单调栈part02 503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之…

进阶JAVA篇- Java 综合基本语法实践(习题一)

路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原 目录 第一道题&#xff1a;集合的灵活运用 第二道题&#xff1a;基础编程能力 第三道题&#xff1a; 手写 ArrayList 集合&#xff08;模拟实现 ArrayList 核心API&#xff09; 第四道题&#xff1a;二分查找的应用 第五道…

RandomAccessFile学习笔记

文章目录 RandomAccessFile学习笔记前言1、RandomAccessFile基本介绍1.1 RandomAccessFile相关基本概念1.2 RandomAccessFile家族体系 2、RandomAccessFile基本使用2.1 RandomAccessFile常用API介绍2.2 RandomAccessFile常用API演示2.3 RandomAccessFile实现断点续传 1、Random…

C语言--三目运算符

一.介绍⭐ <表达式1>&#xff1f;<表达式2>&#xff1a;<表达式3> 它的含义是&#xff1a;如果表达式1的值为真&#xff08;非零&#xff09;&#xff0c;则整个表达式的值为表达式2的值&#xff1b;否则&#xff0c;整个表达式的值为表达式3的值。 三目运算…

Python——常见内置模块

Python 模块&#xff08;Modules&#xff09;1、概念模块函数类变量2、分类3、模块导入的方法&#xff1a;五种4、使用import 导入模块5、使用from……import部分导入6、使用as关键字为导入模块或功能命名别名7、模块的搜索目录8、自定义模块 常见内置模块一、math模块二、rand…

【详解二叉树】

&#x1f320;作者&#xff1a;TheMythWS. &#x1f387;座右铭&#xff1a;不走心的努力都是在敷衍自己&#xff0c;让自己所做的选择&#xff0c;熠熠发光。 目录 树形结构 概念 树的示意图 树的基本术语 树的表示 树的应用 二叉树(重点) 二叉树的定义 二叉树的五…

交换技术-电路交换-报文交换-分组交换

交换技术是指主机之间、通信设备之间或主机与通信设备之间为交换信息所采用的数据格式和交换装置的方式。按交换技术可分为&#xff1a;电路交换、报文交换和分组交换。 电路交换 交换(switching)&#xff0c;就是按照某种方式动态地分配传输线路的资源。 电路交换是在源结点…

解决Vscode使用git提交卡住的问题

使用Vscode的git提交代码经常会很慢/卡住。 先点击左下角&#xff0c;进入设置 找到git的配置(建议直接搜索)&#xff0c;把use Editor As commit input的勾选去掉即可解决。

【批量修改文件名,并去掉括号】

操作 一、 批量修改文件名操作二、去除括号 一、 批量修改文件名操作 在浏览器等下载很多图片后&#xff0c;命名顺序乱七八糟&#xff0c;想要将图片进行重新命名&#xff0c;从数字1开始 首先&#xff0c;全选文件夹中的图片 右键&#xff0c;重明明&#xff0c;选择一张图…

【c++文件】

C是一种面向对象的编程语言&#xff0c;它广泛应用于各个领域&#xff0c;如游戏开发、嵌入式系统、操作系统等。在C编程中&#xff0c;文件操作是一项非常重要的技能。本文将介绍C文件操作的基本知识以及一些有趣的应用&#xff0c;带领大家一起探索C文件操作的魅力。 一、C文…

jQuery_08 each函数的使用

each函数的使用 可以循环数组&#xff0c;json&#xff0c;dom对象数组 1.$.each(要循环的内容,function(index,element){处理函数}) 要循环的内容可以是数组&#xff0c;json对象&#xff0c;dom数组 function&#xff1a;循环的处理函数 每个成员都会执行这个函数一次 index&…

kafka,RabbitMQ,RocketMQ,他们之间的区别,架构,如何保证消息的不丢失,保证不重复消费,保证消息的有序性

文章目录 Kafka、RabbitMQ、RocketMQ 之间的区别是什么&#xff1f;性能数据可靠性服务可用性功能 RabbitMQ如何保证消息不丢失&#xff1f;Kafka 的架构说一下&#xff1f;Kafka 怎么保证消息是有序的&#xff1f;Kafka 怎么解决重复消费&#xff1f;Kafka 怎么保证消息不丢失…

最新Midjourney绘画提示词Prompt教程无需魔法

最新Midjourney绘画提示词Prompt教程无需魔法使用 一、AI绘画工具 SparkAi【无需魔法使用】&#xff1a; SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01;本系统使用NestjsVueTypes…

C#,《小白学程序》第二十课:大数的加法(BigInteger Add)

大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算。 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法。 重复了部分 19 课的代码。 1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary>…

如何在Ubuntu系统上安装MongoDB

简单介绍 MongoDB是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档&#xff0c;数…

Centos Bind安装与排错

1.配置Centos系统静态IP vi/etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTOstaticIPADDR192.168.1.100NETMASK255.255.255.0GATEWAY192.168.1.1DNS18.8.8.8:wqsudo systemctl restart network.service 2.安装BIND&#xff08;需要服务器连接互联网&#xff0c;如果服务…

肾合胶囊 | 冬不养肾春易病,若出现了这六大表现,小心是肾虚!

冬季作为一年中最寒冷的季节&#xff0c;自然万物皆静谧闭藏&#xff0c;而肾具有潜藏、封藏、闭藏精气的特点&#xff0c;是封藏之本&#xff0c;肾的脏腑特性与冬季相通应&#xff0c;所以在冬季更应该重视养肾。 而现在正值初冬&#xff0c;正是开始养肾的最佳时间。此时培…

VBA技术资料MF86:将PPT文件批量另存为PDF文件

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

单例模式与多线程

目录 前言 正文 1.立即加载/饿汉模式 2.延迟加载/懒汉模式 1.延迟加载/懒汉模式解析 2.延迟加载/懒汉模式的缺点 3.延迟加载/懒汉模式的解决方案 &#xff08;1&#xff09;声明 synchronized 关键字 &#xff08;2&#xff09;尝试同步代码块 &#xff08;3&am…

图形编辑器开发:缩放和旋转控制点

大家好&#xff0c;我是前端西瓜哥。好久没写图形编辑器开发的文章了。 今天来讲讲控制点。它是图形编辑器的不可缺少的基础功能。 控制点是吸附在图形上的一些小矩形和圆形点击区域&#xff0c;在控制点上拖拽鼠标&#xff0c;能够实时对被选中进行属性的更新。 比如使用旋…