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

news2024/11/26 12:45:59

目录

再次认识进程

用户视角

内核视角

引入线程 

概念

调度的基本单位 

模拟出图像

思考

线程的本质

线程和进程的区别 

线程哪些结构是共享的

引入

地址空间

系统资源

​编辑

线程哪些结构是单独拥有 

引入

地址空间

系统资源

线程间切换的成本更低

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.coloradmin.cn/o/1255103.html

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

相关文章

【强化学习】动态规划算法实践

文章目录 【强化学习】动态规划算法实践一. 实验过程1.1 Environment1.2 Policy Iteration1.3 Policy Evaluation1.4 Policy Improvement1.5 Value Iteration 二. 实验结果与分析2.1 分析Policy Iteration和Value Iteration收敛误差随着迭代次数的分布曲线 【强化学习】动态规划…

性能测试必会技能之Jmeter:利用jmeter插件收集性能测试结果汇总报告和聚合报告

利用jmeter插件收集性能测试结果 汇总报告&#xff08;Summary Report &#xff09; 用来收集性能测试过程中的请求以及事务各项指标。通过监听器--汇总报告 可以添加该元件。界面如下图所示 汇总报告界面介绍&#xff1a; 所有数据写入一个文件&#xff1a;保存测试结果到本地…

【c++模版】

在计算机科学的世界里&#xff0c;模板是一种非常强大的工具&#xff0c;它允许我们编写通用的代码&#xff0c;这些代码可以处理多种数据类型。在C中&#xff0c;模板是实现泛型编程的主要方式之一。本文将详细介绍C模板的基本概念&#xff0c;并通过一些有趣的例子和现实生活…

Unity 关于Input类的使用

Input类在我们游戏开发中需要获取外设设备&#xff08;比如键盘、鼠标、游戏手柄等&#xff09;进行交互时&#xff0c;基本都会用到。 它主要有以下一些常用的方法。 1、GetKey(KeyCode key)&#xff0c;检测按键是否被按下&#xff1b; 2、GetKeyDown(KeyCode key)&#x…

什么是CAS/CAS的应用/CAS的ABA问题

文章目录 CAS1. 什么是CAS2. CAS的应用2.1 实现原子类2.2 实现自旋锁 3. CAS的ABA问题3.1 什么是ABA问题3.2 ABA问题引来的BUG3.3 解决方案 CAS 1. 什么是CAS CAS: 全称Compare and swap, 字面意思:”比较并交换“. 操作: 设V为内存中的值, A为寄存器中的值(旧的预期值), B也…

无人零售已成为新兴趋势

无人零售已成为新兴趋势 在新零售浪潮中&#xff0c;必然会涌现新的商业形态&#xff0c;而无人零售则是其中典型代表之一。传统零售受制于人力和场地等限制&#xff0c;消费者体验较差&#xff0c;如长时间排队、缓慢结账、距离过远等问题。而无人零售解决方案&#xff0c;包括…

面试官:java如何实现线程间通信?

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

PyQt6 QLineEdit单行文本框控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计21条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

一起学docker系列之十docker安装tomcat实践

目录 前言1 安装tomcat的步骤步骤 1: 查找并拉取 Tomcat 镜像步骤 2: 运行 Tomcat 容器步骤 3: 管理 Tomcat 容器步骤 4: 访问 Tomcat 首页 2 解决访问首页的404访问不到的问题2.1 Tomcat 10 的默认设置问题2.2 端口映射或防火墙问题 3 推荐使用 Tomcat 8.5 版本总结 前言 当安…

2.前端--HTML标签基本概念【2023.11.25】

1.基本语法规范 HTML 标签是由尖括号包围的关键词&#xff0c;例如 <html>。HTML 标签通常是成对出现的&#xff0c;例如 和 &#xff0c;我们称为双标签。有些特殊的标签必须是单个标签&#xff08;极少情况&#xff09;&#xff0c;例如 <br />我们称为单标签。 …

【挑战业余一周拿证】一、亚马逊云科技简介 - 第 3 节 - 云计算

第 3 节 - 云计算 在深入了解亚马逊云科技的各个部分之前&#xff0c;让我们先缩小视野&#xff0c;对云进行一个合理的定义。云计算就是通过互联网按需提供 IT 资源并采用按需付费定价模式&#xff0c;下面&#xff0c;我们将进行详细说明。 按需提供表示的是亚马逊云科技会在…

2024年最新最全的Jmeter接口测试必会技能:jmeter_HTTP Cookie管理器

HTTP Cookie管理器 HTTP Cookie管理器可以像浏览器一样自动存储和发送cookie&#xff0c;以这种自 动收集的方式收集到的cookie不会在cookie manager中进行展示&#xff0c;但是运行后&#xff0c; 可以通过 查看结果树&#xff08;监听器&#xff09;可以查看到cookie信息 除…

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…

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;如果服务…

C/C++内存管理,malloc,realloc,calloc,new,delete详解!!!

1.初步了解内存中各个区间存储的数据特征 1.栈区&#xff1a;存储一些局部变量、函数参数、返回值等&#xff0c;跟函数栈振有关&#xff0c;出了作用域&#xff0c;生命周期结束。 2.堆区&#xff1a;用于动态开辟空间&#xff0c;如果不主动销毁空间&#xff0c;则程序运行结…

保护模式进阶

本系列文章只做个人学习记录使用 参考资料&#xff1a; 《操作系统真象还原》 从0到-1写一个操作系统 获取物理内存容量 计算机要想被使用&#xff0c;就必须先管理&#xff0c;我们想和物理内存打交道&#xff0c;就必须先知道物理内存有多大 linux获取内存的方法 在linux…

计算机组成原理4

1.汇编语言 2.汇编语言常见的运算指令 3.AT&T格式 和 Intel格式 4.跳转指令 5.cmp比较的底层原理 6.函数调用的机器级表示 7.CISC和RISC

公司人事管理系统

1.问题描述 一个小公司包含四类人员&#xff1a;经理&#xff0c;技术人员&#xff0c;销售人员和销售经理&#xff0c;各类人员的工资计算方法如下&#xff1a;经理&#xff1a;固定月薪&#xff08;8000&#xff09;&#xff1b;技术人员&#xff1a;月薪按技术等级&#xf…

【深度学习笔记】05 线性回归

线性回归 线性回归基于几个简单的假设&#xff1a; 首先&#xff0c;假设自变量 x \mathbf{x} x和因变量 y y y之间的关系是线性的&#xff0c; 即 y y y可以表示为 x \mathbf{x} x中元素的加权和&#xff0c;这里通常允许包含观测值的一些噪声&#xff1b; 其次&#xff0c;我…

Spring Cloud Gateway 的简单介绍和基本使用

前言 本文主要对Spring Cloud Gateway进行简单的概念介绍&#xff0c;并通过多模块编程的方式进行一个简单的实操。 文章目录 前言1 什么是网关&#xff08;概念&#xff09;2 微服务中的网关2.1 问题12.2 问题2 3 网关作用4 Spring Cloud Gateway组成5 Spring Cloud Gateway基…