当前位置: 首页 > news >正文

Linux第十二讲:线程概念与控制

Linux第十二讲:线程概念与控制

  • 1.什么是线程 -- 感性理解线程
  • 2.什么是线程 -- 理性理解线程
    • 2.1什么是页表
      • 2.1.1页框
      • 2.1.2页表
      • 2.1.3什么是线程
      • 2.1.4两级页表的地址转换
      • 2.1.5缺页异常
      • 2.1.6线程的优点
      • 2.1.7线程的缺点
  • 3.Linux进程 VS 线程
  • 4.Linux线程控制
    • 4.1创建线程
    • 4.2LWP -- 轻量级进程
    • 4.3pthread库
    • 4.4线程等待
    • 4.5线程终止
    • 4.6多线程的创建
    • 4.7线程ID
    • 4.8通过源码深入理解线程
    • 4.9线程栈
  • 5.线程的封装
    • 5.1传入对象的仿函数实现
  • 6.线性局部存储
    • 6.1线程命名

1.什么是线程 – 感性理解线程

在这里插入图片描述

2.什么是线程 – 理性理解线程

要理解线程,我们首先来了解一下页表

2.1什么是页表

2.1.1页框

在这里插入图片描述

2.1.2页表

页表的本质是一个结构体,一个进程一个页目录表,指向多个页表,页表里面记录了页表项和页内偏移(前20位和后12位),当需要访问物理地址时,需要先拿到虚拟地址,访问页表,实现虚拟地址到物理地址的转化,一个进程中,需要多次访问页表操作,而进行转换的过程,是通过MMU来完成的
二级页表,页目录中有1024个unsigned int类型数据保存地址,每个页表中也是1024个unsigned int类型数据保存地址
在这里插入图片描述
所以说,当我们拿到虚拟地址之后,假如虚拟地址为32位,那么通过前20位可以找到对应的页框,也就是拿到虚拟页号,每个页框是4KB,那么通过页框号*4KB + 页内偏移(低12位),就可以找到内存中的页框的物理地址了,通过内存物理地址,可以计算出磁盘中的地址(磁道等内容),就可以进行操作了

2.1.3什么是线程

在这里插入图片描述

2.1.4两级页表的地址转换

在这里插入图片描述

2.1.5缺页异常

在这里插入图片描述

2.1.6线程的优点

在这里插入图片描述

2.1.7线程的缺点

在这里插入图片描述

3.Linux进程 VS 线程

在这里插入图片描述

4.Linux线程控制

4.1创建线程

在这里插入图片描述

4.2LWP – 轻量级进程

在这里插入图片描述

4.3pthread库

在这里插入图片描述
所以说,任何一门语言,只要是在Linux环境下运行,提供的创建线程的方法的底层都是对Linux提供的创建轻量级进程的方法,也就是pthread库的封装:
在这里插入图片描述

4.4线程等待

线程创建好之后,新进程要被主进程等待,否则就会出现类似僵尸进程的问题,会导致内存泄漏
在这里插入图片描述
在这里插入图片描述
然而,线程的返回值并不可以只是int类型的,可以是多种类型的:
在这里插入图片描述

4.5线程终止

在这里插入图片描述

4.6多线程的创建

之前所学的都是单线程的创建,下面我们来看一下多线程的创建:
在这里插入图片描述

4.7线程ID

在这里插入图片描述
那么线程ID到底是什么呢?:
在这里插入图片描述
在这里插入图片描述

4.8通过源码深入理解线程

在这里插入图片描述

4.9线程栈

Linux下,将线程和进程都统一到了task_struct(名称相同,但是不同的方法创建,创建出的task_struct中的内容不同), 但是对待线程和进程的stack还是有区别的:

1.对于进程来说,通过fork进行创建时,实际上是复制父进程的stack空间地址,然后写时拷贝与动态增长,如果扩充超过上限报段溢出错误。进程栈是唯一可以访问未映射页而不一定发生段错误 – 超出扩容上线才报
2.对于主进程的子线程而言,栈不是向下生长的,而是提前就固定好的,一旦用尽就会报错。在使用pthread_create时,会调用mmap调用为线程分配栈空间。
在这里插入图片描述

线程有自己独立的栈空间,但是同一进程的不同线程,仍然可以访问到不是自己的栈空间,需要注意。

5.线程的封装

假如我们想通过这种方式,直接实现线程的创建、分离、暂停、回收操作,该如何进行封装呢?:
在这里插入图片描述
其实很简单,只需要在类中掉哦应那个函数接口即可:
在这里插入图片描述
但是这里有一个问题:
在这里插入图片描述
pthread_create接口中的传参和函数调用该怎么实现呢?:
在这里插入图片描述

5.1传入对象的仿函数实现

如果我们想让传入的参数是类,该怎么实现:
在这里插入图片描述

6.线性局部存储

还有一个小点我们要了解以下,那就是线性局部存储
在这里插入图片描述

6.1线程命名

在这里插入图片描述

http://www.dtcms.com/a/315698.html

相关文章:

  • 前端保持和服务器时间同步的方法【使用vue3举例】
  • Qt 音频播放全攻略:常用函数、实战示例与资源获取
  • 升级 Elasticsearch 到新的 AWS Java SDK
  • 基于LDA主题的网络舆情与情感分析——以云南某景区话题为例
  • 8.5 CSS3多列布局
  • 继承知识总结
  • 【AI】提示词与自然语言处理:从NLP视角看提示词的作用机制
  • 【Lua】题目小练8
  • TrackVLA——开放世界下的四足具身视觉跟踪EVT(智能跟随):集目标识别与轨迹规划为一体的VLA,不怕高动态与遮挡
  • JavaWeb02——基础标签及样式(黑马视频笔记)
  • 扩展欧拉定理以及练习题
  • 嵌入式 - 数据结构:循环链表和内核链表
  • 【Unity笔记】Unity TextMeshPro 字体显示为方块的终极解决方案(含中文、特殊字符支持)
  • 如何查看PCI卡的VID,DID,SVID,SSID编号
  • Google AI 发布 MLE-STAR:一款能够自动执行各种 AI 任务的先进机器学习工程代理
  • cf.训练
  • Prometheus 监控平台部署 (云原生环境)
  • Docker Compose管理新范式:可视化控制台结合cpolar提升容器编排效率?
  • 从零开始学网页开发:HTML、CSS和JavaScript的基础知识
  • C++ 多线程(三)
  • 嵌入式学习的第四十三天-ds18b20 数字温度传感器
  • 如何在nuxtjs项目中使用vuex?
  • duxapp中主题系统是如何实现动态切换的
  • Redis 基础(一)
  • 数字图像处理(冈萨雷斯)第三版:第四章——频率域滤波(学前了解知识)——主要内容和重点
  • 【运维基础】Linux 系统启动原理
  • 增量:增量处理
  • 游戏行业DDoS攻防实战指南
  • ApplicationContext的实现类有哪些?
  • 「PromptPilot 大模型智能提示词平台」—— PromptPilot × 豆包大模型 1.6:客户投诉邮件高效回复智能提示词解决方案