【lesson52】 线程概念

文章目录

  • 线程学习前的了解知识
  • 理解线程

线程学习前的了解知识

线程在进程内部执行,是OS调度的基本单位
OS可以做到让进程对进程地址空间进行资源的细粒度划分
在这里插入图片描述
比如malloc一块内存空间,我们拿到的一般都是起始位置,但是最终位置我们一般都不知道。
进程内部有struct vm_area_struct结构体。
在这里插入图片描述
vm管理虚拟地址空间的起始地址和末尾地址。而struct vm_area_struct也要用链表结构管理起来。
在这里插入图片描述
我们知道虚拟地址的映射是通过页表的,那么如何从虚拟内存映射到物理内存
在这里插入图片描述
1.exe就是一个文件
2.我们的可执行程序本来就是按照地址空间方式进行编译的。
3.可执行程序,其实按照区域也已经划分了以4KB为单位。

在这里插入图片描述
物理内存有4GB,划分为4KB的个数
在这里插入图片描述

OS要不要管理100W+个4KB空间呢?当然要,先描述再组织

在这里插入图片描述
我们如何判断某4KB空间有没有被使用?我们只要看flag标记位即可。

物理内存被划分为4KB,而I/O的基本单位也是4KB
页表映射过程:
首先虚拟内存是映射到,磁盘的可执行程序的位置。
在这里插入图片描述
而可执行程序被加载到物理内存后,就有了物理内存的地址。
然后断开磁盘的地址,将物理内存的地址填入映射表中。
在这里插入图片描述
这个过程也叫缺页中断这个过程用户是零感知的,也就是对用户透明。

我们知道页表是映射地址的,那么页表如何映射?
假设在32的平台下,虚拟内存有232次方个地址。我们简单计算一下页表的大小。
在这里插入图片描述
我们看到一行就需要9字节,而有232行,那么所需的空间都超了4GB,而页表也是属于物理内存的所以根本不可能存的下。
那么OS是怎么做的呢?
OS将页表分为一级页表二级页表,一个地址有32个比特位,一级页表存前10个bit位二级页表存中间10个bit位最后12页bit位表示页内偏移,212刚好是4KB
在这里插入图片描述

理解线程

什么是线程

  • 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”
  • 一切进程至少都有一个执行线程
  • 线程在进程内部运行,本质是在进程地址空间内运行
  • 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化
  • 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流

通过一定的技术手段,将当前进程的“资源”,以一定的方式划分给不同的task_struct。
在这里插入图片描述
多个进程(task_struct)指向同一个mm_struct—>这里每一个task_struct,都可以称之为线程---->Linux特有的实现线程的方案。
线程是在进程内部执行的(线程在进程放入地址空间内运行),是OS调度的基本单位。(CPU其实并不关心,执行流是进程还是线程,只关心task_struct
在这里插入图片描述
所以什么是进程呢?
1.从资源角度
用户视角:
内核数据结构+该进程对应的代码和数据
内核视角:
进程:承担分配系统资源的基本实体。
进程是直接向OS要资源的,而线程是向进程要资源的。

2.如何理解曾今我们所写的代码?
以前:内部只有一个执行流的进程
现在:内部具有多个执行流的进程---->task_struct就是进程内部的一个执行流

在CPU视角:CPU不怎么关系当前是进程还是线程的概念,只认task_struct。—>和之前的概念也不冲突---->CPU调度的基本单位“线程”

在Linux下 进程PCB <= 其它OS内的 进程PCB!----->所以Linux下的进程统一称为轻量级进程

所以Linux没有真正意义上的线程结构,Linux是用进程PCB(task_struct)模拟的线程!---->Linux并不能直接给我们提供线程相关的接口,只能提供轻量级进程接口---->但是使用者要使用线程的话还要理解什么是轻量级进程,很麻烦---->所以Linux也考虑了使用者的难处,所以在用户层实现了一套用户层多线程方案,以库的方案提供给用户进行使用。
Linux的pthread线程库是Linux提供的原生线程库

线程的优点

  1. 创建一个新线程的代价要比创建一个新进程小得多
  2. 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多 线程占用的资源要比进程少很多
  3. 能充分利用多处理器的可并行数量
  4. 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  5. 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
  6. I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

线程的缺点

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

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

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

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

线程异常

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

线程用途

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

Linux进程VS线程

  • 进程和线程
    进程是资源分配的基本单位
    线程是调度的基本单位
    线程共享进程数据,但也拥有自己的一部分数据:
    – 线程ID
    – 一组寄存器
    – 栈
    – errno
    – 信号屏蔽字
    – 调度优先级

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

  • 文件描述符表
  • 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
  • 当前工作目录
  • 用户id和组id

在这里插入图片描述

见一见线程
在这里插入图片描述
在这里插入图片描述
参数解释:
thread:输出型参数返回线程id
attr:
在这里插入图片描述
start_routine:函数指针,线程要执行的回调函数
arg:回调函数的参数
代码:
在这里插入图片描述

运行结果:
在这里插入图片描述
我们看到确实2个线程是同一个pid
那么我们如何查看线程呢?
打开连个窗口,一个窗口运行代码,一个窗口观察线程
窗口2:运行代码
在这里插入图片描述
窗口一查看进程和线程
先查看进程:
在这里插入图片描述
看到确实只有一个进程
再查看线程:
在这里插入图片描述
我们看到确实有两个线程。

ps -aL: 查看轻量级进程
LWP:轻量级进程ID
CPU调度时看的是LWP.

kill -9 进程id,进程被kill线程也被kill
演示:
在这里插入图片描述

创建多个线程:
代码:

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

void *threadRoutine(void *arg)
{
    char* name = (char*)arg;
    while (true)
    {
        std::cout << name << " pid:" << getpid() << "\n" << std::endl;
        sleep(1);
    }

    return nullptr;
}
int main()
{
    pthread_t tid[5];
    char name[64];
    for (int i = 0; i < 5; i++)
    {
        snprintf(name, sizeof(name), "%s %d", "thread", i + 1);
        pthread_create(tid + i, nullptr, threadRoutine, (void*)name);
        sleep(1);
    }

    while (true)
    {
        std::cout << "main thread pid:" << getpid() << std::endl;
        sleep(3);
    }
    return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

CPU线程进行切换的成本低,为什么?
地址空间和页表不需要切换,因为都共用一个进程的地址空间和页表,CPU内部有L1~L3寄存器cache,对内存的代码和数据根据局部性原理,预读进CPU内部!

如果进程切换,cache就立即失效的话,新过来的进程只能重新缓存

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

揭秘产品迭代计划制定:从0到1打造完美迭代策略

产品迭代计划是产品团队确保他们能够交付满足客户需求的产品以及实现其业务目标的重要工具。开发一个成功的产品迭代计划需要仔细考虑产品的目标、客户需求、市场趋势和可用资源。以下是帮助您创建产品迭代计划的一些步骤&#xff1a;建立产品目标、收集客户反馈、分析市场趋势…

【项目】高并发内存池

高并发内存池 【项目】高并发内存池项目介绍这个项目做的是什么&#xff1f; 内存池相关知识池化技术内存池malloc 定长内存池的实现高并发内存池整体框架设计ThreadCache对齐规则封装FreeList类封装thread cache类TLS无锁访问 CenctralCache整体设计页号规定span结构SpanList结…

Decian 12.x基于LNMP安装phpIPAM(IP管理系统)

phpipam是一个开源Web IP地址管理应用程序&#xff08;IPAM&#xff09;。其目标是提供轻便&#xff0c;且有用的IP地址管理系统。它是基于PHP的应用程序&#xff0c;具有MySQL数据库后端&#xff0c;使用jQuery库&#xff0c;ajax和HTML5 / CSS3功能。 在Debian 12中&…

Nginx实战:安装搭建

目录 前言 一、yum安装 二、编译安装 1.下载安装包 2.解压 3.生成makefile文件 4.编译 5.安装执行 6.执行命令软连接 7.Nginx命令 前言 nginx的安装有两种方式&#xff1a; 1、yum安装&#xff1a;安装快速&#xff0c;但是无法在安装的时候带上想要的第三方包 2、…

机械革命混合模式和独显直连互相切换

原文&#xff1a;https://blog.iyatt.com/?p13773 默认状态是混合输出&#xff0c;在任务管理器中可以看到两个 GPU&#xff0c;分别是核显和独显 从混合模式切换到独显直连可以通过机械革命电竞控制台&#xff08;重装过系统的需要去官网下载安装驱动&#xff09; 打开后…

Bitcoin Bridge:治愈还是诅咒?

1. 引言 主要参考&#xff1a; Bitcoin Bridges: Cure or Curse? 2. 为何需关注Bitcoin bridge&#xff1f; 当前的Bitcoin bridge&#xff0c;其所谓bridge&#xff0c;实际是deposit&#xff1a; 在其它链上的BTC情况为&#xff1a; 尽管当前约有43.7万枚BTC在其它链上…

《UE5_C++多人TPS完整教程》学习笔记6 ——《P7 在线会话控制(Online Sessions)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P7 在线会话控制&#xff08;Online Sessions&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

【Jmeter】JDK及Jmeter的安装部署及简单配置

JDK的安装和环境变量配置 对于Linux、Mac和Windows系统&#xff0c;JDK的安装和环境变量配置方法略有不同。以下是针对这三种系统的详细步骤&#xff1a; 对于Linux系统&#xff1a; 下载适合Linux系统的JDK安装包&#xff0c;可以选择32位或64位的版本。 将JDK的安装包放置…

《UE5_C++多人TPS完整教程》学习笔记3 ——《P4 测试多人游戏(Testing Mutiplayer)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P4 测试多人游戏&#xff08;Testing Mutiplayer&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译…

三、yolov8训练结果查看和模型预测

训练结果查看 1、在模型训练结束后&#xff0c;如下图所示&#xff0c;找到该文件夹。 2、然后找到weights文件夹中的best.pt文件&#xff0c;这就是该数据训练后的模型。 模型预测 1、在assets文件夹下创建FPC-2文件夹&#xff0c;放入一些同类FPC预测结果。 2、和训练…

中小学信息学奥赛CSP-J认证 CCF非专业级别软件能力认证-入门组初赛模拟题第一套(阅读程序题)

CCF认证CSP-J入门组模拟测试题 二、阅读程序题 (程序输入不超过数组或字符串定义的范围&#xff1b;除特殊说明外&#xff0c;判断题 1.5分&#xff0c;选择题3分&#xff0c;共计40分) 第一题 1 #include<iostream> 2 using namespace std; 3 int a,b,c; 4 int main…

【Linux】学习-进程信号

进程信号 信号入门 生活角度的信号 你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,你该怎么处理快递。也就是你能“识别快递”,也就是你意识里是知道如果这时候快递员送来了你的包裹,你知道该如何处理这些包裹当快递员到了你…

2.13 数组练习

1、选择题 1.1、若有定义语句&#xff1a;int a[3][6]; &#xff0c;按在内存中的存放顺序&#xff0c;a 数组的第10个元素是 B A&#xff09;a[0][4] B) a[1][3] C)a[0][3] D)a[1][4] 解析&#xff1a;二维数组在内存中是以行优先的方式存放的。这意味着首先填充第一行的…

读十堂极简人工智能课笔记01_人工智能简史

1. 2400年前 1.1. 希腊罗德岛 1.1.1. 是个神奇的岛屿&#xff0c;以机械发明著称&#xff0c;包括真人大小的、大理石制成的自动机 1.1.2. 早在罗马帝国诞生之前&#xff0c;公元前400多年的希腊就有这样的机器人技术&#xff0c;似乎不可思议 2. 公元前970到前931年 2.1.…

LeetCode:83和82.删除排序链表中的重复元素I,II

这两题算是链表的基础题&#xff0c;就遍历删除没啥特点&#xff0c; 83甚至不需要考虑第一个结点的特殊情况&#xff0c;属实是名副其实的easy了 LeetCode&#xff1a;21.合并两个有序链表之第一次的特殊情况-CSDN博客 83. 删除排序链表中的重复元素 - 力扣&#xff08;Lee…

controller-manager学习三部曲之三:deployment的controller启动分析

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 《controller-manager学习三部曲》完整链接 通过脚本文件寻找程序入口源码学习deployment的controller启动分析 本篇概览 本文是《controller-manager学习三…

【C++初阶】第三站:类和对象(中) -- 类的6个默认成员函数

目录 前言 类的6个默认成员函数 构造函数 概念 特性 析构函数 概念 特性 拷贝构造函数 概念 特征 赋值运算符重载 运算符重载 赋值运算符重载 const成员 const修饰类成员函数 取地址及const取地址操作符重载 本章总结&#xff1a; 前言 有时候我们写好了一个栈&#xff0c;头脑…

C#中implicit和explicit

理解: 使用等号代替构造函数调用的效果以类似重载操作符的形式定义用于类型转换的函数前者类型转换时候直接写等号赋值语法,后者要额外加目标类型的强制转换stirng str -> object o -> int a 可以 int a (int)(str as object)转换通过编译,但没有转换逻辑所以运行会报错…

《UE5_C++多人TPS完整教程》学习笔记14 ——《P15 创建我们自己的子系统(Creating Our Own Subsystem)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P15 创建我们自己的子系统&#xff08;Creating Our Own Subsystem&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&…

G85银昆高速宝鸡天台山隧道群荣获交通运输部科技示范工程,北京恒星科通隧道无线通信与广播系统应用于该项目

2023年9月12日&#xff0c;全国交通运输科技示范工程现场推进会在河南省平顶山市召开&#xff0c;会上为全国已通过验收的10项科技示范工程进行了授牌&#xff0c;其中由陕西交控集团负责实施的“秦岭天台山超长隧道群安全绿色科技示范工程”名列其中。 【授牌仪式现场】 据了解…