Linux : 多线程【线程概念】

Linux : 多线程【线程概念】

  • (一)线程概念
    • 线程是什么
    • 用户层的线程
    • linux中PID与LWP的关系
  • (二) 进程地址空间页表
  • (三) 线程总结
    • 线程的优点
    • 线程的缺点
    • 线程异常
    • 线程用途

(一)线程概念

线程是什么

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

进程是资源分配的基本单位,线程是cpu执行调度的基本单位。一个进程创造不仅只有task_struck(PCB)还有页表、进程地址空间等等。而一个线程的创建只有task_struct并且沿用进程的地址空间和页表等,所以线程的创建十分轻量。

  • 一个线程都是当前进程里面的一个执行流
  • 线程在进程内部运行,本质就是线程在进程地址空间内运行,也就是说曾经这个进程申请的所有资源,几乎都是被所有线程共享的。

cpu是通过task_struct来执行调度,而一个进程中是可以有多个线程即执行流的,所以线程的执行粒度是比进程细(即线程是执行进程的一部分代码)


用户层的线程

进程和线程是如此的相似,那么究竟是如何创建线程的呢??

实际上在Linux中没有真正意义的线程,那么也就绝对没有真正意义上的线程相关的系统调用

想要用好线程就必须要对线程做管理,进程已经有一套进程的管理模式了,而描述线程的控制块和描述进程的控制块是类似的,那么再对线程做一套管理算法等等就十分繁琐,因此Linux并没有重新为线程设计数据结构,而是直接复用了进程控制块,所以我们说Linux中的所有执行流都叫做轻量级进程
(在windows系统中真正实现了线程,因此Windows操作系统系统的实现逻辑一定比Linux操作系统的实现逻辑要复杂得多。)
在这里插入图片描述

在linux操作系统没有线程的概念,但是我们用户却需要一个真正的线程的概念,所以原生线程库pthread由此诞生。原生线程库实际就是对轻量级进程的系统调用进行了封装,在用户层模拟实现了一套线程相关的接口。因此对于我们来讲,在Linux下学习线程实际上就是学习在用户层模拟实现的这一套接口,而并非操作系统的接口。


linux中PID与LWP的关系

进程是由操作系统将程序运行所需地址空间、映射关系、代码和数据打包后的资源包,而 线程/轻量级线程/执行流 则是利用资源完成任务的基本单位

  • 进程是承担系统资源分配的实体
  • 线程是 CPU 运行的基本单位

实际上 进程 = 线程 + 虚拟地址空间 + 映射关系 + 代码和数据,这才是一个完整的概念

使用 ps -aL指令查看所有的线程
在这里插入图片描述
LWP就是我们的轻量级进程也就是线程,每一个线程都有自己的LWP号,而线程组成线程组,我们用pid来描述这个线程组,也就是我们常说的一个进程的pid。

(二) 进程地址空间页表

在 32 位系统中,存在 2^32 个地址(一个内存单元大小是 1byte),意味着虚拟地址空间 的大小为 4GB。

通常将这32位分为 10、10、12

  • 第一个10: 虚拟地址中的前 10 个比特位,用于寻址 二级页表
  • 第二个10:虚拟地址中间的 10 个比特位,用于寻找 页框起始地址
  • 第三个12:虚拟地址中的后 12 个比特位,用于定位 具体地址(偏移量)
    在这里插入图片描述
  1. 选择虚拟地址的前10个比特位在页目录当中进行查找,找到对应的二级页表。
  2. 再选择虚拟地址的10个比特位在对应的页表当中进行查找,找到物理内存中对应页框的起始地址(一个页框4KB)。
  3. 最后将虚拟地址中剩下的12个比特位作为偏移量从对应页框的起始地址处向后进行偏移,找到物理内存中某一个对应的字节数据。

说明:

  • 物理内存实际是被划分成一个个4KB大小的页框的,而磁盘上的程序也是被划分成一个个4KB大小的页帧的,当内存和磁盘进行数据交换时也就是以4KB大小为单位进行加载和保存的。
  • 4KB实际上就是2的12次方个字节,也就是说一个页框中有2的12次方个字节,而访问内存的基本大小是1字节,因此一个页框中就有2的12次方个地址,于是我们就可以将剩下的12个比特位作为偏移量,从页框的起始地址处开始向后进行偏移,从而找到物理内存中某一个对应字节数据。

上面所说的所有映射过程,都是由**MMU(MemoryManagementUnit)**这个硬件完成的,该硬件是集成在CPU内的。页表是一种软件映射,MMU是一种硬件映射,所以计算机进行虚拟地址到物理地址的转化采用的是软硬件结合的方式。
注意:32位计算机下是二级页表,64位平台下用的是多级页表。

当引发异常操作时,操作系统能在 查页表 阶段就进行拦截,而不是等到真正影响到 物理内存 时才报错.
在这里插入图片描述
页表是有权限的,所以当我们在进行修改一个常量字符串的时候,虚拟地址必须经过页表映射找到对应的物理内存,但在页表开始对应的时候发现其权限是只读此时你要对其进行修改就会在MMU内部触发硬件错误,操作系统在识别到是哪一个进程导致的之后,就会给该进程发送信号对其进行终止。

(三) 线程总结

线程的优点

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

注释:

计算密集型:执行流的大部分任务,主要以计算为主。比如加密解密、大数据查找等。
IO密集型:执行流的大部分任务,主要以IO为主。比如刷磁盘、访问数据库、访问网络等。

线程的缺点

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

线程异常

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

线程用途

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

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

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

相关文章

IDEA转战TREA AI IDE : springboot+maven+vue项目配置

一、trea下载安装 Trae官方网址: https://www.trae.com.cn/ Trae官方文档:https://docs.trae.com.cn/docs/what-is-trae?_langzh w3cschool: https://www.w3cschool.cn/traedocs/ai-settings.html 安装这里省略,正常安装即可。…

Java--图书管理系统(简易版)

目录 目录 前言 🔔1.library包 1.1 Book类 1.2 BookList类 🔔2.user包 2.1User类(父类) 2.2Admin(管理员) 2.3 NormalUser(普通用户) 🔔3.Operation包 🕐3.1 IOperation接口 🕑3.2ListOperation(查看操作)…

深入浅出:Spring Boot 中 RestTemplate 的完整使用指南

在分布式系统开发中,服务间通信是常见需求。作为 Spring 框架的重要组件,RestTemplate 为开发者提供了简洁优雅的 HTTP 客户端解决方案。本文将从零开始讲解 RestTemplate 的核心用法,并附赠真实地图 API 对接案例。 一、环境准备 在 Spring…

大数据处理利器:Hadoop 入门指南

一、Hadoop 是什么?—— 分布式计算的基石 在大数据时代,处理海量数据需要强大的技术支撑,Hadoop 应运而生。Apache Hadoop 是一个开源的分布式计算框架,致力于为大规模数据集提供可靠、可扩展的分布式处理能力。其核心设计理念是…

685SJBH计量管理系统

摘 要 计量,在我国已有五千年的历史。计量的发展与社会进步联系在一起,它是人类文明的重要组成部分。它的发展经历了古典阶段、经典阶段和现代阶段。而企业的计量管理是对测量数据、测量过程和测量设备的管理。 本系统通过分析现有计量系统的业务逻辑…

从0到1构建前端监控系统:错误捕获、性能采集、用户体验全链路追踪实战指南SDK实现

目录 前言为什么要做前端监控前端监控目标稳定性用户体验业务 前端监控流程常见埋点方案代码埋点可视化埋点无痕埋点 创建项目第一步、创建monitor文件,cmd进入文件进行npm init -y 项目初始化第二步、创建src/index.js和src/index.html文件第三步、创建webpack.con…

前端浏览器判断设备类型的方法

前端浏览器判断设备类型的方法 在前端开发中,判断设备类型(如手机、平板、桌面电脑)有多种方法,以下是常用的几种方式: 1. 使用 User Agent 检测 通过 navigator.userAgent 获取用户代理字符串进行判断:…

MNIST 手写数字分类

转自我的个人博客: https://shar-pen.github.io/2025/05/04/torch-distributed-series/1.MNIST/ 基础的单卡训练 本笔记本演示了训练一个卷积神经网络(CNN)来对 MNIST 数据集中的手写数字进行分类的过程。工作流程包括: 数据准备&#xff…

数据库中的 Segment、Extent、Page、Row 详解

在关系型数据库的底层存储架构中,数据并不是随意写入磁盘,而是按照一定的结构分层管理的。理解这些存储单位对于优化数据库性能、理解 SQL 执行过程以及排查性能问题都具有重要意义。 我将从宏观到微观,依次介绍数据库存储中的四个核心概念&…

DAMA车轮图

DAMA车轮图是国际数据管理协会(DAMA International)提出的数据管理知识体系(DMBOK)的图形化表示,它以车轮(同心圆)的形式展示了数据管理的核心领域及其相互关系。以下是基于用户提供的关键词对D…

《QDebug 2025年4月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.QML单例动态创建的对象,访问外部id提示undefined 先定义一个窗口组件,打印外部的id: // MyWindow.qml import QtQuick 2.15 import QtQuick.Window 2.15Window {id: controlwidth: …

JS | 正则 · 常用正则表达式速查表

以下是前端开发中常用的正则表达式速查表,包含验证规则、用途说明与示例: 📌 常用正则表达式速查表 名称正则表达式描述 / 用途示例手机号/^1[3-9]\d{9}$/中国大陆手机号13812345678 ✅座机号/^0\d{2,3}-?\d{7,8}$/固定电话010-12345678 ✅…

系统思考:个人与团队成长

四年前,我交付的系统思考项目,今天学员的反馈依然深深触动了我。 我常常感叹,系统思考不仅仅是一场培训,更像是一场持续的“修炼”。在这条修炼之路上,最珍贵的,便是有志同道合的伙伴们一路同行&#xff0…

写屏障和读屏障的区别是什么?

写屏障(Write Barrier)与读屏障(Read Barrier)的区别 在计算机科学中,写屏障和读屏障是两种关键的内存同步机制,主要用于解决并发编程中的可见性、有序性问题,或在垃圾回收(GC&…

ssh -T git@github.com 测试失败解决方案:修改hosts文件

问题描述 通过SSH方式测试,使用该方法测试连接可能会遇到连接超时、端口占用的情况,原因是因为DNS配置及其解析的问题 ssh -T gitgithub.com我们可以详细看看建立 ssh 连接的过程中发生了什么,可以使用 ssh -v命令,-v表示 verbo…

大疆无人机搭载树莓派进行目标旋转检测

环境部署 首先是环境创建,创建虚拟环境,名字叫 pengxiang python -m venv pengxiang随后激活环境 source pengxiang/bin/activate接下来便是依赖包安装过程了: pip install onnxruntime #推理框架 pip install fastapi uvicorn[standard] #网络请求…

00 Ansible简介和安装

1. Ansible概述与基本概念 1.1. 什么是Ansible? Ansible 是一款用 Python 编写的开源 IT 自动化工具,主要用于配置管理、软件部署及高级工作流编排。它能够简化应用程序部署、系统更新等操作,并且支持自动化管理大规模的计算机系统。Ansibl…

Linxu实验五——NFS服务器

一.NFS服务器介绍 NFS服务器(Network File System)是一种基于网络的分布式文件系统协议,允许不同操作系统的主机通过网络共享文件和目录3。其核心作用在于实现跨平台的资源透明访问,例如在Linux和Unix系统之间共享静态数据&#…

『 测试 』测试基础

文章目录 1. 调试与测试的区别2. 开发过程中的需求3. 开发模型3.1 软件的生命周期3.2 瀑布模型3.2.1 瀑布模型的特点/缺点 3.3 螺旋模型3.3.1 螺旋模型的特点/缺点 3.4 增量模型与迭代模型3.5 敏捷模型3.5.1 Scrum模型3.5.2 敏捷模型中的测试 4 测试模型4.1 V模型4.2 W模型(双V…