深入解析Linux轻量级进程:线程的概念、原理、优缺点及其与进程的关系与区别

🍑个人主页:Jupiter.
🚀 所属专栏:Linux从入门到进阶
欢迎大家点赞收藏评论😊

在这里插入图片描述

在这里插入图片描述

目录

    • `📚Linux线程`
      • `📕什么是线程`
            • *可以使用多进程去并发的执行一个进程的代码,那为什么要由线程呢?*
            • *线程的原理的简单介绍*
            • *Linux为什么要这么设计线程?*
      • `⚡再谈进程地址空间`(页表,虚拟地址和物理地址)
            • *多个执行流是如何进行代码划分的?*
          • `页表`
            • *虚拟到物理地址如何转换的,以及页表最终结构*
      • `🍑线程的优点 `
      • `🌳线程的缺点`
      • `🌲线程异常 `
      • `🐕线程用途 `
      • `🍒Linux进程VS线程`
      • `🚲进程和线程`


📚Linux线程

📕什么是线程

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的执行分支”,是CPU调度的基本单位。

进程是加载到内存中的程序,进程=内核数据结构+进程代码和数据
一切进程至少都有一个执行线程。

线程在进程内部运行,本质是在进程地址空间内运行

在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

一个进程的代码是由无数个函数构成,或则说是由我无数个代码块构成,每一个代码块都有对应的入口地址,这些代码块在一个进程中都是串行调用的

可以使用多进程去并发的执行一个进程的代码,那为什么要由线程呢?
  • 在Linux系统中,为了让一个进程的代码能够并行去执行,可以使用多进程,但是创建一个新的进程,会创建进程PCB,进程地址的空间,页表,文件描述符表,加载程序,构建映射等等,这个成本是很高的,总:进程创建成本是较高的(时间和空间成)。
  • 我们的目的是多执行流并发执行一个进程的代码,提高效率,那有没有可以不用使用多进程来实现这一目的呢?这就要引出Linux线程了。
线程的原理的简单介绍
  • 线程和进程类似,只不过不需要像创建进程那样创建全部的内核数据结构,线程的创建只需要创建一个task_struct,并且该task_struct指向该进程的进程地址空间。这样地址空间以及地址空间上的资源都是多个线程共享的,将进程的代码划分为多个区域,那么就可以创建多个线程去并发的执行这几个区域的代码。
    在这里插入图片描述
  • 这就可以理解线程进程内部的一个执行分支的概念了,内部:线程是在进程的地址空间中运行的,线程是CPU调度的基本单位,CPU在调度的时候,不用区分看到的task_struct是一个进程还是一个进程中的一个执行流。
Linux为什么要这么设计线程?
  • 因为如果我们要设计线程,OS也会对线程做管理,所以也得设计线程的结构体(线程控制块struct TCB)进行描述,再利用数据结构进行组织起来,并且需要自己的调度算法等等,这样设计非常复杂,并且可以发现 线程和进程 的很多字段很类似,所以,Linux的设计者认为,进程和线程都是执行流,具有极度地相似性,没必要单独设计数据结构和算法,直接使用进程模拟线程。
  • 但是Windows系统中,是对于进程和线程是分开设计的,都有自己独特的一套数据结构和算法。

在Linux中,没有实际上的线程,因为是使用进程模拟的线程,所以再Linux中,线程是叫轻量级进程

  • Linux中,所有的调度执行流都叫做:轻量级进程

如果一个进程执行的代码是一个操作系统,就是一个内核级虚拟机的技术。

⚡再谈进程地址空间(页表,虚拟地址和物理地址)

多个执行流是如何进行代码划分的?
  • 操作系统也是需要管理内存的,实际上,内存是被划分为很多个以4KB为单位的内存块,一个可执行程序,是以平坦模式进行整体编址的,不仅要编址,并且按照地址也被划分为一个一个的4KB的数据块(写入文件系统就是一个一个的4Kb数据块了,文件按系统部分讲过,这里不赘述),所以内存与磁盘进行交互数据,都是以4KB数据块为单位进行交互的。其中,内存是空间,磁盘上是内容,所谓的加载,就是将内容放在空间中,在OS系统的术语,把4KB的空间和内容叫做页框或者页帧
  • OS要对划分的4KB内存块进行管理,用struct page的结构体进行描述(如下图),其中包含一个标记为,标记该内存块的状态(是否正在被使用,是属于用户级还是内核级等等),再利用一个struct page类型的数组进行管理(大小就是该内存被划分为的4KB的内存块数目),下标就标识了一个唯一的内存块,所以对内存的管理就是对该数组的增删查改。
页表
虚拟到物理地址如何转换的,以及页表最终结构

OS会将虚拟地址看成 10 10 12个比特位为大小的子区域(如下图):
10个比特位的取值范围:0~1023
12个比特位的取值范围为0~4096(4KB)

  • 操作系统中有一张页目录,最多可以存放1024张页表(实际中不可能),页表里面存放的是页框的物理地址(内存被划分的每一个 内存块的起始地址)。

  • 其中,根据虚拟地址的前10个比特位标识在哪一个页表中,中间10个比特位标识在哪一个页框中,最后12个比特位标识在该页框(内存块)中的偏移量(页内偏移)。

  • 其中,页表后面还可以加上一些权限标志位,如内核态,用户态,读写权限等。

  • 给不同的线程划分不同的代码执行的区域,本质就是让不同的线程,各自看到页表全部的子集。

🍑线程的优点

  • 创建一个新线程的代价要比创建一个新进程小得多

  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多(面试题

  • 在CPU中会存在一个硬件,叫cache,在进行调度一个进程的时候,CPU中除了会有一组寄存器存放临时变量外,OS还会将当前执行的代码中附近的代码预先加载到cache中,所以CPU在寻址访问代码的时候,不用从内存中读取,直接在cache中读取,从而提高CPU寻址的效率。

  • 所以如果是进程间切换,不仅要保存各自的上下文数据,切换CPU中寄存器的数据等等,在cache中曾经缓存的数据全部失效了,另一个进程只能重新加载数据进cache,这个过程耗时,但是如果是线程切换,在cache中曾经缓存的数据就不需要丢弃,因为预加载的代码数据线程可能还会使用。

  • 线程占用的资源要比进程少很多

  • 能充分利用多处理器的可并行数量

  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务

🌳线程的缺点

  • 性能损失
    • 一个很少被外部事件阻塞的计算密集型线程往往无法与其它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
  • 健壮性降低
    • 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
  • 编程难度提高
    • 编写与调试一个多线程程序比单线程程序困难得多。

🌲线程异常

  • 单个线程如果出现除零野指针问题导致线程崩溃,进程也会随着崩溃。
  • 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出。

🐕线程用途

  • 合理的使用多线程,能提高CPU密集型程序的执行效率
  • 合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)

🍒Linux进程VS线程

🚲进程和线程

  • 进程是资源分配的基本单位
  • 线程是调度的基本单位
  • 线程共享进程数据,但也拥有自己的一部分数据:
    • 线程ID
    • 一组寄存器(一组线程执行的上下文数据)
    • 栈(存放执行的函数的临时变量)
    • errno
    • 信号屏蔽字
    • 调度优先级
  • 进程的多个线程共享 同一地址空间,因此Text SegmentData Segment 都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
    • 文件描述符表
    • 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
    • 当前工作目录
    • 用户id和组id

进程和线程的关系如下图:


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

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

相关文章

基于CloudflareSpeedTest项目实现git clone加速

1.网络测速 「自选优选 IP」测试 Cloudflare CDN 延迟和速度,获取最快 IP 更多内容参考项目:https://github.com/XIU2/CloudflareSpeedTest 国外很多网站都在使用 Cloudflare CDN,但分配给中国内地访客的 IP 并不友好(延迟高、丢…

Pixelmator Pro for Mac 专业图像处理软件【媲美PS的修图软件】

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试安装完成!!! 效果 一、下载软件 下载软件…

【STM32+HAL库】---- 通用定时器输入捕获PWM信号

硬件开发板:STM32G0B1RET6 软件平台:cubemaxkeilVScode1 新建cubemax工程 1.1 配置系统时钟RCC 1.2 配置定时器 1.2.1 配置输入捕获 选择通用定时器TIM2-Channel 1为输入捕获引脚,对应IO口是PA0,时钟源选择内部时钟源Internal clock,工作模…

Unity实战案例 2D小游戏HappyGlass(模拟水珠)

本案例素材和教程都来自Siki学院,十分感谢教程中的老师 本文仅作学习笔记分享交流,不作任何商业用途 预制体 在这个小案例中,水可以做成圆形但是带碰撞体,碰撞体比图形小一圈,顺便加上Trail renderer组件 材质 将碰撞…

Win11 / Win10 系统极化工具,降低游戏延迟效果明显

Win11 / Win10 系统优化工具,降低游戏延迟效果明显 Windows 系统优化就是精简系统一些功能组件、对一些系统功能进行设置等,这样可以减少不必要的硬件资源占用。 全面的系统优化功能外,据不少网友表示通过优化后 CS GO 游戏降低输入延迟效果明显。 免费…

沃飞长空联合极氪亮相2024世界动力电池大会

9月1日至2日,2024世界动力电池大会在四川宜宾举办,沃飞长空与同属吉利控股集团旗下的新时代豪华科技品牌极氪汽车一同亮相。 现场,双方携手展出了AE200电动垂直起降航空器、极氪009光辉版、极氪001,以及极氪能源、金砖电池、威睿…

开源 AI 智能名片 O2O 商城小程序在营销中的应用

摘要:本文探讨了开源 AI 智能名片 O2O 商城小程序在营销中的应用,重点分析了喜好原则、互惠互利和高度认可三个方面对小程序推广和用户忠诚度提升的重要性。通过融入这些原则,开源 AI 智能名片 O2O 商城小程序能够更好地满足用户需求&#xf…

HTML静态网页成品作业(HTML+CSS)——动漫大耳朵图图网页(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…

VUE2.0 elementUI el-input-number 数据更新,视图不更新——基础积累

今天遇到一个问题,是关于el-input-number组件的,发现数据明明已经更改了,但是页面上组件输入框中还是之前的值。 比如上方输入框中,我输入120.5,就会出现下面的诡异现象 回显此值是120.779,但是页面上输入…

协同开发工具Git

网上对于Git的使用方法介绍的很多,在日常工作中,Git是团队开发必不可少的工具之一,我想为一些刚使用Git的小伙伴们介绍一下常遇到的小问题。 1:拼写错误。这应该是每个初学者都会犯得错误,当出现这种错误还是比较好排…

供应链管理平台开发指南:从食堂采购系统源码开始

本篇文章,小编将围绕如何从食堂采购系统源码出发,构建一个完整的供应链管理平台进行详细解读,帮助开发人员掌握实现技术要点,并为企业打造高效的供应链系统提供技术参考。 一、供应链管理平台的核心功能概述 供应链管理平台的核心…

RK3568 Android 11 蓝牙BluetoothA2dpSink 获取用于生成频谱的PCM

Android 中的 A2DP Sink A2DP Sink 在 Android 系统中主要用于 接收 其他蓝牙设备(如手机、平板、电脑等)发送过来的 高质量的立体声音频。简单来说,它让你的 Android 设备可以充当一个 蓝牙音箱 或 耳机 的角色。 核心功能: 接…

中国农村政策与改革统计年报(2015-2022年)

中国农村经营管理统计年报、政策与改革统计年报(2015-2022年) 数据年限:2015-2022年,目前最新 数据格式:pdf 数据范围:全国各省市自治区(不含港澳台) 数据内容:《中国农村…

win系统安装mysql,使用mysqldump,pycharm使用mysqldump,避坑

文章目录 下载mysql的win客户端设置系统环境变量验证是否可用pycharm使用mysqldump异常问题排查 下载mysql的win客户端 官网下载地址如果下载旧版本,需自行到Archives里面找 本人使用的是mysql5.7,找到相应版本后,点击Download下载 设置系统…

多模态大模型中,融合后如何知道最终结果受哪种模态影响更大?

本篇介绍多模态大模型中如何基于最终结果分析各模态的影响。 具身智能被众多大佬看好,通往AGI的路最终肯定需要多个模态的大模型互相融合。多个模态配合好也是有可能去构建一个模拟现实的世界模型的。 最近一直在研究和尝试多模态大模型在一些VQA领域的前瞻研究和…

9、Django Admin优化查询

如果你的Admin后台中有很多计算字段,那么你需要对每个对象运行多个查询,这会使你的Admin后台变得非常慢。要解决此问题,你可以重写管理模型中的get_queryset方法使用annotate聚合函数来计算相关的字段。 以下示例为Origin模型的中ModelAdmin…

CSS总结——瀑布流布局

瀑布流布局 瀑布流布局是一种新型的布局方式,可以将大小不一的图片完整的显示在页面上,并且在杂乱的布局中保持着一定的美感,今天学习了一下如何使用瀑布流布局,总结了有以下三种方式。(瀑布流还可以使用grid布局实现…

Nginx 部署前端 Vue 项目实战指南

一、环境准备 1. 安装 Nginx 首先,需要在服务器上安装 Nginx。Nginx 是一款轻量级、高性能的 HTTP 和反向代理服务器。安装方式因操作系统而异。 Linux 系统(以 Ubuntu 为例): sudo apt-get update sudo apt-get install nginxWi…

【Android】Material Design编写更好的UI

Toolbar 对于控件ActionBar我们非常熟悉,就是我们常见的标题栏,但ActionBar只能位于活动的顶部,因此我们更建议使用Toolbar。在新建一个项目的时候都是默认显示ActionBar,我们要使用Toolbar就需要先将标题栏改为不显示 先来看看…

HMI触屏网关-VISION如何与Node-red通信

上文:HMI触屏网关-VISION如何与Modbus TCP从机通信-CSDN博客 1. Node-red启用HTTP监听 HTTP监听,用于模拟WebAPI服务端,接收WebAPI客户端GET请求。 启用HTTP监听服务,选择请求方式GET;URL自定义,本示例设…