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

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

什么是线程?

• 在一个程序里的一个执行路线就叫做线程(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.rhkb.cn/news/404604.html

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

相关文章

基于SpringBoot的Java个人博客系统的设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

原生HTML5、CSS、JavaScript实现简易网易云音乐播放

1.效果图 2.源码 1.index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网易云音乐</title><link rel"stylesheet" href"../CSS/index.css"> </head>…

最小路径和[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个包含非负整数的m x n网格grid&#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a;grid [[…

新智元 | 百万在线,大圣归来!《黑神话:悟空》石破天惊,RTX 4090D飞越花果山

本文来源公众号“新智元”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;百万在线&#xff0c;大圣归来&#xff01;《黑神话&#xff1a;悟空》石破天惊&#xff0c;RTX 4090D飞越花果山 【新智元导读】等待四年&#xff0c;《黑…

Java常用集合(List、Map)类型相关问题整理

一、背景 针对Java基础集合的部分&#xff0c;对一些常见的问题进行整理&#xff0c;方便后续能够随时复习 二、问题与回答 &#xff08;1&#xff09;Java集合类ArrayList初始化时数组的默认长度是多少&#xff1f; 答&#xff1a;在new ArrayList() 这段代码执行完后&a…

软件测试基础入门

一、基础概念 什么是软件&#xff1a;控制计算机硬件的工具&#xff0c;操作系统软件、应用软件 软件基本组成&#xff1a;客户端、服务器、数据库 软件产生过程&#xff1a;需求构思--> 需求文档 -->UI/UE -- >产品研发 -->产品测试 -- >部署上线 什么是软…

web实现drag拖拽布局

这种拖拽布局功能其实在电脑操作系统或者桌面应用里面是经常使用的基础功能&#xff0c;只是有时候在进行web开发的时候&#xff0c;对这个功能需求量不够明显&#xff0c;但却是很好用&#xff0c;也很实用。能够让用户自己拖拽布局&#xff0c;方便查看某个区域更多内容&…

关于#vscode#的问题:把软件卸载不会再出现蓝屏

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

ViT篇外:NVIDIA Llama-3.1-Minitron 4B

相关阅读&#xff1a; ViT&#xff1a;3 Compact Architecture MobileLLM&#xff1a;“苗条”的模型比较好&#xff01; 大家也许会很好奇为什么在ViT章节插入了NVIDIA Llama-3.1-Minitron 4B&#xff0c;ViT因为应用场景的特殊性所以都寄希望于高效率的模型&#xff0c;因…

搭建内网开发环境(二)|Nexus安装及使用

引言 上一篇教程中按照了 docker 作为容器化工具&#xff0c;在本篇教程中将使用 docker-compose 安装 nexus。 搭建内网开发环境&#xff08;一&#xff09;&#xff5c;基于docker快速部署开发环境 什么是 Nexus Nexus是一个强大的仓库管理器&#xff0c;主要用于搭建和管…

【论文阅读】SegNeXt:重新思考卷积注意力设计

《SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation》 原文&#xff1a;https://github.com/Visual-Attention-Network/SegNeXt/blob/main/resources/paper.pdf 源码&#xff1a;https://github.com/Visual-Attention-Network/SegNeXt 1、简介 …

Apache Doris 中Compaction问题分析和典型案例

说明 此文档主要说明一些常见compaction问题的排查思路和临时处理手段。这些问题包括 Compaction socre高Compaction失败compaction占用资源多Compaction core 如果问题紧急&#xff0c;可联系社区同学处理 如果阅读中有问题&#xff0c;可以反馈给社区同学。 1 compaction …

微服务实战系列之玩转Docker(十一)

前言 在云原生的世界&#xff0c;经过十多年的进化&#xff0c;Docker已经形成了较完备的“后勤”保障服务和建立了荣辱与共的“密友圈”。用一句话可以概括&#xff1a;“Docker走遍天下&#xff0c;Swarm功不可没”。 因此&#xff0c;我们需尽可能做到对Swarm有充分的认识…

大数据-85 Spark 集群 RDD创建 RDD-Action Key-Value RDD详解 RDD的文件输入输出

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09; HDFS&#xff08;已更完&#xff09; MapReduce&#xff08;已更完&…

【联想电脑】:使用拓展坞后转接HDMI,无法识别显示屏

项目场景&#xff1a; 作为一个嵌入式软件开发者&#xff0c;有两个外接屏幕&#xff0c;不足为奇。 但是在今天的使用电脑过程中&#xff0c;出现了接了一个拓展坞上面有HDMI接口&#xff0c;但是HDMI接口接上外接显示屏的时候电脑无法识别到&#xff0c;导致只有电脑直连的HD…

家用小型洗衣机哪款好用?精选内衣洗衣机多维度测评盘点

对于很多都市生活的小伙伴来说&#xff0c;有一台小巧玲珑、功能齐全的内衣洗衣机则成了我们的救星。它不仅方便快捷&#xff0c;还能保持衣物清洁和卫生。然而&#xff0c;市面上的内衣洗衣机品牌五花八门。哪一个最好用、质量又靠谱呢&#xff1f;为了给大家提供更准确的选购…

【FPGA数字信号处理】- 数字信号处理如何入门?

​数字信号处理&#xff08;Digital Signal Processing&#xff0c;简称DSP&#xff09;是一种利用计算机或专用数字硬件对信号进行处理的技术&#xff0c;在通信、音频、视频、雷达等领域发挥着越来越重要的作用&#xff0c;也是FPGA主要应用领域之一。 本文将详细介绍数字信…

YOLOv5改进 | 融合改进 | C3融合ContextGuided增强分割效果

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 改…

模糊控制——创建与添加自定义的隶属函数

关键字&#xff1a;模糊控制&#xff1b;隶属函数&#xff1b;Matlab。 系列文章目录 模糊控制——&#xff08;一&#xff09;理论基础 模糊控制——&#xff08;二&#xff09;设计流程 模糊控制——&#xff08;三&#xff09;模糊洗衣机 模糊控制——&#xff08;四&#…

SQL— DDL语句学习【后端 9】

SQL— DDL语句学习 在数据管理的广阔领域中&#xff0c;SQL&#xff08;Structured Query Language&#xff09;作为操作关系型数据库的编程语言&#xff0c;扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准&#xff0c;还为我们提供了强大的工具来管理、查…