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

news2024/11/14 13:35:25
🍑个人主页: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.coloradmin.cn/o/2102167.html

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

相关文章

Dev C++:简单步骤下载与安装指南

1. 前言 在当今这个数字化时代,编程已成为连接创意与技术的桥梁,它不仅推动着科技的进步,也深刻地改变着我们的生活方式。对于初学者而言,选择一款合适且易于上手的集成开发环境(IDE)是学习编程旅程中的重…

Vmware虚拟机断电重启后无法正常启动报Unmount and run xfs_repair

目录 一、问题描述二、解决方法 一、问题描述 Vmware虚拟机断电重启后无法正常启动,报错信息如下: 二、解决方法 执行以下命令: umount /dev/sda5 xfs_repair -L /dev/sda5 reboot

jmeter响应断言、json断言、断言持续时间、大小断言操作

在jmeter断言当中、常用的有响应断言、json断言、断言持续时间,大小断言等 一、响应断言 Apply to:断言应用的范围,这里默认,通常发出一个请求只触发一个服务器测试字段 响应文本,response响应体内的信息响应代码&am…

awk详解

文章目录 一、概述二、工作原理三、工作流程3.1 运行模式3.2 执行流程 四、基本语法4.1 命令格式 五、实战案例5.1 开始块(BEGIN block)5.1.1print 5.2 内置变量5.3 BEGIN END 运算5.3.1 扩展生产:网卡的ip、流量5.3.2 根分区的可用量5.3.3 a…

python与pytroch相关

1.pytroch模型类 PyTorch 是一个易学且清晰明了的深度学习库。本节讲解如何查看一个模型的结构。 首先,最简单创建模型的方式如下: #导入必要的库 import torch.nn as nn myNetnn.Sequential(nn.Linear(2,10),#第一层(全连接层)&…

Leetcode236经典题目二叉树的最近公共祖先

本次为大家带来的题目是leetcode236二叉树的最近公共祖先 本道题的直观思路是自底向上进行寻找,如果存在的话那么向上返回,如何能够自底向上遍历呢?我们可以利用回溯进行处理,那么需要注意的是进行回溯的时候一定要使用后序遍历来…

Centos7安装FFmpeg详细步骤(已验证成功)

最近我们需要使用FFmpeg来合成视频功能,这就需要用到服务器必须安装FFmpeg了。 FFmpeg 是一款功能强大的跨平台命令行工具,可以处理各种音频和视频文件,包括转换视频和音频格式、剪辑、合并视频和音频、提取音频、添加字幕、添加水印、调整视…

读书学习笔记入门 # Datawhale X 李宏毅苹果书 AI夏令营

文章目录 学习目标:学习内容:Task 1 通过案例了解机器学习机器学习(Machine Learning,ML)和深度学习(Deep Learning,DL)的基本概念什么是回归(regression)什么…

【机器学习】表示学习的基本概念和方法以及编解码结构的基本概念

引言 表示学习(Representation Learning)是机器学习的一个子领域,它专注于学习数据的表示形式,即数据的高层特征或抽象概念 文章目录 引言一、表示学习1.1 表示学习的重要性1.2 表示学习的方法1.3 应用场景1.4 挑战1.5 总结 二、如…

AUTOSAR_EXP_ARAComAPI的5章笔记(2)

返回目录 5.3 Proxy Class Proxy Class从AutoSar元模型的服务接口描述中生成。 ara::com确实标准化了生成的Proxy Class的接口。一个AP产品供应商的工具链将生成一个代理实现类来精确地实现这个接口。 注意: 因为Proxy Class必须提供的接口是由ara::com定义的,所…

教你手机投屏到电视方法,用电视屏幕让家庭蛋糕制作更有趣

心血来潮,我突然想要尝试跟着手机视频制作蛋糕。当我向老妈提起这个想法时,她也表示出了浓厚的兴趣,想要一起学习如何制作蛋糕。 然而,我们很快意识到一个问题:如果我们俩都挤在狭小的厨房里,一边看手机一…

51单片机-LED点阵屏介绍

作者:Whappy 时间:2024.9.3 目的:手撕51 74HC595,原理很简单,就是通过串行输入端SER,将一个字节的数据一位一位的传送到我们的移位寄存器中,图左边第一个区域,则SERCLK就是给移位节…

[STM32]从零开始的STM32 LED教程(小白向)

一、为什么LED会作为第一个例程 大家可能已经发现了,我们大部分的STM32教程都将LED作为教程中的第一个例程。为什么呢?在我看来,之所以把LED作为教程的第一个例程,因为这个实验能够让新手直观的看到实验现象,在操作GPI…

记一次某中学系统越权漏洞

一、确定测试站点 资产的收集依旧是按照弱口令与注册进站的思路进行寻找(具体思路可参考上篇文章,含有完整的收集思路与个人信息搜集方法)。最后确定了该站点,密码依旧存在弱口令: 于是利用默认密码成功登录该站点&am…

cocotb备忘录

按位给和int int后接的值,建议在32之内。大于32位建议按位给,因为int强制类型转换有范围 第二,低位给到低位,高位给到高位 # 将src_ip和dst_ip给到phv中,TMD以后只要报错在这个范围里面,TMD直接马上用手算一遍能不能…

自闭症谱系障碍:探索这一复杂神经发育障碍的奥秘

自闭症,也被称为孤独症谱系障碍(ASD),是一种深刻影响儿童神经发育的复杂障碍。它以独特的社交交流障碍、重复刻板行为以及兴趣范围的极度狭窄为主要特征,为患者及其家庭带来了诸多挑战。 自闭症的成因至今仍是科学界探…

构建私有CA和证书

一、准备 两台虚拟机 192.168.252.148 CA 192.168.252.149 客户端 二、构建私有CA 192.168.252.148 CA 安装openssl 1.检查是否存在 rpm -qa openssl 2.安装或者更新openssl yum install openssl openssl-devel -y 查看CA相关配置 /etc/pki/tls/openssl.cnf这个文件是…

充气泵芯片|充气泵方案芯片SIC8833

充气泵的方案设计功能比较简单,四个压力模块和ADC芯片以及再加个主控芯片大约就构成了其核心功能的器件要求。ADC芯片的功能是将压力传感器所得到压力值转化为可显示的数值,在通过LED或者LCD屏展现出来,就是后面我们测量气压所得到的气压数值…

二异硬脂醇苹果酸酯行业分析:前三大厂商占有大约51.0%的市场份额

二异硬脂醇苹果酸酯(Distearyl Malate)是一种由苹果酸与硬脂醇反应生成的酯类化合物,常用于化妆品和护肤品中作为润肤剂、增稠剂和乳化剂。其特点是具有良好的保湿和滋润效果,同时能提供丝滑的质地和优越的使用感,适合…

入门篇 LeetCode算法之旅启程 - 从零开始的编程进阶之路

你是否曾经在技术面试中因为算法题而汗流浃背?是否在日常编码中感觉自己的解决问题能力有待提高? 目录 LeetCode: 你的算法训练场为什么选择LeetCode?LeetCode平台使用指南1. 注册与登录2. 探索题库3. 解题过程4. 提交与反馈5. 学习与讨论6. 追踪进度7. 参与竞赛 制定你的…