[linux#39][线程] 详解线程的概念

news2024/9/23 11:15:40

线程:是进程内的一个执行分支。线程的执行粒度比进程要细

什么是线程?

• 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程 是“一个进程内部的控制序列”

• 一切进程至少都有一个执行线程

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

• 在 Linux 系统中,在 CPU 眼中,看到的 PCB 都要比传统的进程更加轻量化

• 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给 每个执行流,就形成了线程执行流

1. Linux 中线程该如何理解

地址空间是进程访问的资源窗口,下图当中的绿色部分就是线程

Linux 实现方案:

  1. 在 LInux 中,线程在进程“内部”执行,线程在进程的地址空间内运行(为什么?任何执行流要执行,都要有资源!地址空间是进程的资源窗口)
  2. 线程的执行粒度比进程要细?线程执行进程代码的一部分

CPU 是否知道执行的是进程还是线程?不关心,CPU 只有调度执行流的概念


2. 重新定义线程 和 进程

  • 什么叫做线程?我们认为,线程是操作系统调度的基本单位

V1 时:进程==内核数据结构(PCB)+代码和数据

进阶版图:三块(PCB + 地址空间 +页表)

  • 重新理解进程?内核观点:进程是承担分配系统资源的基本实体

进程掰一块空间给线程,线程是我进程内部的执行流资源!

如何理解我们以前的进程??

操作系统以进程为单位,给我们分享资源,理解为我们当前的进程内部,只有一个执行流~(进程的特殊情况)

进程中还存在对 线程先描述在组织 的队列,进程中套线程,太复杂啦(例如某 windows)

Linux 设计者直接让线程复用进程数据结构和管理算法(多的不调度就行), 维护成本大大降低,非常卓越!

struct task_struct--模拟线程,Linux 没有真正意义上的线程,是指没有为它创建真正的 pcb, 而是用“进程的内核数据结构”模拟的线程,进程是那三块,最左边的都叫执行流

CPU 中

线程<= 执行流<=进程 Linux 中的执行流,轻量级进程

例如:家庭等同于进程,每一个成员的任务叫做线程


3. 重谈地址空间--第四讲

深入理解页表

虚拟地址是如何转化为物理地址的?以 32 位虚拟地址为例

虚拟地址是多少位的?32 位,将地址进行了拆分

  • 32=10+10+12 页表是拆开分级作用
  • 虚拟地址,查一级,查二级,找到页框

  • 二级页表大部分情况的使用是不全的,用不完的大富翁~
  • 任何一个进程都必须要有页目录,二级页表可以残缺

⭕如果MMU发现请求的虚拟页面不在物理内存中,则触发缺页中断(页面加载到内存)。操作系统内核响应这个中断,将所需的页面从磁盘或其他存储设备加载到物理内存中,并更新相应的页面表条目。

  • 例如:起始地址 +虚拟地址的最后 12 位(即页框中的偏移量)=物理地址
  • 任何一个类型取地址,都只有一个地址,多字节就取开辟空间的第一个字节的地址

虽然努力轻量化了进程,但创建一个进程任然是一个很”重“的工作

寻址:起始地址+类型 =起始地址+偏移量(X86 的特点)

CR2:记录引起缺页中断或者异常的地址

如何理解资源分配给每个执行流?

线程目前分配资源,本质就是分配地址空间范围

怎么让每个线程执行不同的代码?代码有地址,代码的地址是虚拟地址

4.Linux 线程周边概念

线程 VS 进程 切换

线程比进程要更轻量化为什么?(整个生命周期)

  1. 创建和释放更加轻量化(生死)
  2. 切换更加轻量化(运行),对应的页表,地址空间都不需要切换

调度线程那还要调度进程吗?

线程的执行本质上就是进程在执行,线程是进程的一个分支,线程在执行,线程内的切换不需要重新 cache 数据

线程完成之后要实现进程的切换,就需要 cache 缓存数据的切换

  • 对于时间片在处理。主线程记录

线程的优点

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

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

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

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

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

• 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现

• I/O 密集型应用,为了提高性能,将 I/O 操作重叠。线程可以同时等待不同的 I/O 操作。

线程的缺点

• 性能损失

  • ○ 一个很少被外部事件阻塞的计算密集型线程往往无法与其它线程共享同一 个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大 的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的 资源不变。

• 健壮性降低

  • ○ 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配 上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大 的,换句话说线程之间是缺乏保护的。

缺乏访问控制

  • ○ 进程是访问控制的基本粒度,在一个线程中调用某些 OS 函数会对整个进 程造成影响。

• 编程难度提高

  • ○ 编写与调试一个多线程程序比单线程程序困难得多

线程异常

单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃

• 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机 制,终止进程,进程终止,该进程内的所有线程也就随即退出

线程用途

• 合理的使用多线程,能提高 CPU 密集型程序的执行效率

• 合理的使用多线程,能提高 IO 密集型程序的用户体验(例如视频可以边下边看)


2. Linux 进程 VS 线程

进程和线程

• 进程是资源分配的基本单位

• 线程是调度的基本单位

• 线程共享进程数据,但也拥有自己的一部分数据:

  • ○ 线程 ID
  • 一组寄存器 (独立的上下文)
  • 栈 (执行流不会错乱)
  • ○ errno
  • ○ 信号屏蔽字
  • ○ 调度优先级

线程上下文和栈确保了独立性

进程的多个线程共享

同一地址空间,因此 Text Segment、Data Segment 都是共享的,如果定义一个函数,在 各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线 程还共享以下进程资源和环境:

• 文件描述符表

• 每种信号的处理方式(SIG_ IGN、SIG_ DFL 或者自定义的信号处理函数)

• 当前工作目录

• 用户 id 和组 id

小测试

#include <iostream>
#include <pthread.h>
#include <unistd.h>

void *threadRun(void* args)
{
    while(1)
    {
        std::cout << "new thread: " << getpid() << std::endl;
        sleep(1);
    }
    return nullptr;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadRun, nullptr);


    while(1)
    {
        std::cout << "main thread: " << getpid() << std::endl;
        sleep(1);
    }
}

打印分析:

  • 同一 pid
  • 两个函数同时进行

本篇文章主要讲解了理论,下篇文章将进行实操~

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

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

相关文章

使用Virtio Driver实现一个计算阶乘的小程序——QEMU平台

目录 一、概述 二、代码部分 1、Virtio 前端 (1) User Space (2) Kernel Space 2、Virtio 后端 三、运行 QEMU Version&#xff1a;qemu-7.2.0 Linux Version&#xff1a;linux-5.4.239 一、概述 本篇文章的主要内容是使用Virtio前后端数据传输的机制实现一个计算阶乘的…

基于vue框架的爱喵星人服务平台设计与实现80sgi(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,猫食分类,猫粮信息,养护知识,流浪猫信息,申请领养,志愿者招募,申请加入,猫咪品种,团队活动 开题报告内容 基于Vue框架的爱喵星人服务平台设计与实现 开题报告 一、研究背景与意义 1.1 研究背景 随着社会的快速发展和人们生活水…

使用 onBeforeRouteUpdate 组合式函数提升应用的用户体验

title: 使用 onBeforeRouteUpdate 组合式函数提升应用的用户体验 date: 2024/8/15 updated: 2024/8/15 author: cmdragon excerpt: 摘要&#xff1a;本文介绍如何在Nuxt 3开发中使用onBeforeRouteUpdate组合式函数来提升应用用户体验。通过在组件中注册路由更新守卫&#xf…

Markdown导出为 Excel文件 Vue3

直接复制到单文件内即可使用 需要用到的插件 xlsx 0.17.5marked 14.0.0file-saver 2.0.5vue 3.4.29 直接SFC单文件内使用 <script setup> import {reactive} from vue; import xlsx from xlsx; import {marked} from marked; import {saveAs} from file-saver;const…

鸿蒙(API 12 Beta3版)【元数据(C/C++)】媒体相机开发指导

元数据&#xff08;Metadata&#xff09;是对相机返回的图像信息数据的描述和上下文&#xff0c;针对图像信息&#xff0c;提供的更详细的数据&#xff0c;如照片或视频中&#xff0c;识别人像的取景框坐标等信息。 Metadata主要是通过一个TAG&#xff08;Key&#xff09;&…

Linux基础知识学习(三)

3. Vim 编辑器 1> 定义 im 通过一些插件可以实现和IDE一样的功能&#xff01; vi 是老式的字处理器。 Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 键盘图为&#xff1a; ps &#xff1…

JMeter——设置全局变量和非全局变量

在用JMeter写接口case&#xff0c;遇到一种情况&#xff0c;接口1查看列表接口&#xff0c;接口2查看详情接口&#xff0c;接口2需要传入接口1列表的第一条数据的id。 如果这个id后续改变较多&#xff0c;可以使用非全局变量的设置方法&#xff1b; 如果这个id在整个case都比较…

vs2019使用setup打包exe学习记录

仅记录一下自己的学习过程&#xff0c;如果有问题&#xff0c;请多指正&#xff01; 开头注意&#xff1a;在打包之前一定要确保自己的工程是正常运行的&#xff0c;以及相关环境变量的配置是正确的&#xff0c;我后面就因为QT的环境变量问题报错。 我使用vs2019的QT项目写了…

本庄村果园预售系统的设计与实现bootpf

TOC springboot441本庄村果园预售系统的设计与实现bootpf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思…

代码随想录算法训练营 | 动态规划 part06

322. 零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是…

【人工智能】Python融合机器学习、深度学习和微服务的创新之路

1. &#x1f680; 引言1.1 &#x1f680; 人工智能的现状与发展趋势1.2 &#x1f4dc; 机器学习、深度学习和神经网络的基本概念1.3 &#x1f3c6; 微服务架构在人工智能中的作用 2. &#x1f50d; 机器学习的演变与创新2.1 &#x1f31f; 机器学习的历史回顾2.2 &#x1f9e0;…

3个常用zip压缩包文件打来密码删除方法

ZIP压缩包作为一种广泛使用的文件压缩格式&#xff0c;常常用于节省存储空间或便于文件传输。一般情况下为保护文件数据的安全我们会给zip压缩文件设置密码安全保护&#xff0c;但如果后续不需要密码保护了&#xff0c;如何删除密码呢&#xff1f;下面小编给大家介绍三种常用的…

ubuntu22.04安装QQ

QQ官方网址&#xff1a;QQ-轻松做自己 选择【Linux】 接下来根据架构的版本&#xff0c;选择相应的安装包。 可使用 uname -a 指令来查看架构的版本&#xff0c;如下指令所示&#xff0c; wjjwjj-MS-7D31:~/桌面$ uname -a Linux wjj-MS-7D31 6.5.0-45-generic #45~22.04.1-U…

项目申报管理系统pf

TOC springboot375项目申报管理系统pf 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff…

[C++游戏开发] 超大地图多人在线扫雷

[C游戏开发] 超大地图多人在线扫雷 前言游戏截图注册方法游戏功能介绍操作方法介绍游戏特性介绍1.颜色标识2.生存方法 使用的技术核心代码尾声***如果你不介意的话&#xff0c;你应该点个赞&#xff0c;然后收藏&#xff0c;然后关注对不对。*** 前言 唉&#xff0c;写文章要什…

【秋招笔试题】合并最小值 DP

题面 解法&#xff1a;与leetcode321不一样的是&#xff0c;那个是最大值&#xff0c;这个是最小值&#xff0c;且需要处理0首位问题。那道题是Hard题中的Hard&#xff0c;无论是思维量还是代码量都是顶级&#xff0c;这道题难度并不弱于那道。 观察到数据量为500级别&#x…

DVWA-IDS 特殊版本测试

起因 浏览DVWA历史更新记录发现有版本带有IDS插件&#xff0c;可以用于平时没有相关设备等场景演示用&#xff0c;所以开启本次测试。 下载 官方最新版本是移除了IDS插件&#xff0c;原因是“从不使用”&#xff0c;所以需要下载移除该插件之前的版本。 https://github.com/…

【vue教程】六. Vue 的状态管理

目录 往期列表本章涵盖知识点回顾Vuex 的基本概念什么是 Vuex&#xff1f;为什么需要 Vuex&#xff1f; Vuex 的核心概念stategettersmutationsactionsmodules Vuex 的安装和基本使用安装 Vuex创建 store在 Vue 应用中使用 store在组件中访问和修改状态 Vuex 的模块化模块化的好…

PWN练习---Stack_2

目录 srop源码分析exp putsorsys源码分析exp ret2csu_1源码分析exp traveler源码分析exp srop 题源&#xff1a;[NewStarCTF 2023 公开赛道]srop 考点&#xff1a;SROP 栈迁移 源码 首先从bss段利用 syscall 调用 write 读出数据信息&#xff0c;然后调用 syscall-read向栈中…

回归预测|基于鲸鱼优化支持向量机结合Adaboost集成的数据回归预测Matlab程序 多特征输入单输出 效果非常不错!WOA-SVM-Adaboost

回归预测|基于鲸鱼优化支持向量机结合Adaboost集成的数据回归预测Matlab程序 多特征输入单输出 效果非常不错&#xff01;WOA-SVM-Adaboost 文章目录 前言回归预测|基于鲸鱼优化支持向量机结合Adaboost集成的数据回归预测Matlab程序 多特征输入单输出 效果非常不错&#xff01;…