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

Linux-线程概念

1. 线程概念

        线程:轻量级进程,在进程内部执行,是OS调度的基本单位;进程内部线程共用同一个地址空间,同一个页表,以及内存中的代码和数据,这些资源对于线程来说都是共享的资源 

        进程:在用户视角下,内核数据结构+该进程对应的代码和数据;在内核的视角下,承担分配系统资源的基本实体

        其实在之前没有了解线程之前的进程,就是一个只有一个主线程的进程

        现在又该如何理解线程和进程之间的关系呢?

         线程和进程之间就像家庭成员和家庭之间的概念,家庭是由所有家庭成员共同组成的,在这个社会中可能有三口之家,五口之家

        我们在社会中被描述为一个整体,比如户口本就是按家庭发放的,房屋是按家庭建造的,社会资源按家庭分配的,例如疫情期间买菜

        家庭成员和家庭之间的关系就是一荣俱荣,一损俱损的关系(线程异常时会触发信号机制,终止进程,内核所有线程都会退出

        我们在家庭中扮演不同的角色,也在使用不同的资源,家庭负责分配这些资源,其中有大部分资源是家庭成员之间共享的,比如卫生间,客厅,但总有一个房间是给你住的,作为你的私人空间

        家庭资源:空间,数据

        私人空间:后面会说

         在Linux中,没有专门为线程管理,创建新的数据结构,而是沿用了进程的task_struct,用它来模拟线程,线程和进程有很多共性,为此Linux下的所有版本都安装了pthread系统库,为了提供用户使用的接口

        库底层调用了clone系统接口,所以系统提供一部分,库提供一部分,就组成了Linux下的线程

        所以使用线程库的时候,需要包含头文件<pthread.h>,编译时需要-lpthread

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

线程独有:

  • 线程ID
  • 一组寄存器(上下文)
  • 独立栈结构
  • errno变量在线程内部
  • 信号屏蔽字(block)
  • 调度优先级

线程共有:

  • 文件描述符表
  • 信号处理方式
  • 当前工作目录
  • 用户id和组id(权限)

        线程独立的栈结构(保存临时数据)和上下文数据,体现了线程的动态属性

线程如何实现独立的栈结构:

        线程库提供了线程创建接口,它会在地址空间的共享区中创建对应线程的栈结构,其实在上面系统接口中就有所体现clone中有一个参数child_stack的指针,栈地址,栈的组成应该是系统提供的

        通过clone系统接口的第一个参数函数指针,其实如何让线程执行自己代码,其实就是执行函数代码

2. 线程vs进程

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

        线程是CPU调度的基本单位

        线程切换的成本更低

        因为线程间共享地址空间和页表,这些不需要切换

        其次,CPU内部有L1~L3 的 cache 高速缓存(对内存的代码和数据根据局部性原理,预读到CPU内部,进而提高效率)也不用切换

3. 线程的优缺点

优点:

  • 创建,切换,占用资源都比进程小
  • 能充分利用多处理器可并行的数量
  • 在等待慢速IO操作结束的同时,程序可以执行其他任务
  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中
  • IO密集型应用,为了提高性能,将IO操作重叠,可以同时等待不同的IO

缺点:

        缺乏访问控制(后续会学互斥,同步,信号量来解决这一问题)

完。

相关文章:

Linux-线程概念

1. 线程概念 线程&#xff1a;轻量级进程&#xff0c;在进程内部执行&#xff0c;是OS调度的基本单位&#xff1b;进程内部线程共用同一个地址空间&#xff0c;同一个页表&#xff0c;以及内存中的代码和数据&#xff0c;这些资源对于线程来说都是共享的资源 进程&#xff1a;…...

js的桶排序

桶排序&#xff08;Bucket Sort&#xff09;是一种分布式排序算法&#xff0c;它将元素分散到一系列桶中&#xff0c;然后对每个桶中的元素进行排序&#xff0c;并将所有的桶合并起来得到最终的排序结果。桶排序适用于输入的元素均匀分布在一个范围内的情况&#xff0c;它的时间…...

解决ubuntu无法上网问题

发现是网络配置成了Manual手动模式&#xff0c;现在都改成自动分配DHCP模式 打开后&#xff0c;尝试上网还是不行&#xff0c;ifconfig查看ip地址还是老地址&#xff0c;怀疑更改没生效&#xff0c;于是重启试试。 重启后&#xff0c;ip地址变了&#xff0c;可以打开网页了 …...

使用nvm管理多版本node.js

使用nvm&#xff08;Node Version Manager&#xff09;安装Node.js是一个非常方便的方法&#xff0c;因为它允许你在同一台机器上管理多个Node.js版本。以下是使用nvm安装Node.js的基本步骤&#xff1a; Linux 安装nvm 根据你的操作系统&#xff0c;安装命令可能会有所不同。以…...

推导 模型矩阵的逆转置矩阵求运动物体的法向量

一个物体表面的法向量如何随着物体的坐标变换而改变&#xff0c;取决于变换的类型。使用逆转置矩阵&#xff0c;可以安全地解决该问题&#xff0c;而无须陷入过度复杂的计算中。 法向量变化规律 平移变换不会改变法向量&#xff0c;因为平移不会改变物体的方向。 旋转变换会改…...

定时任务的几种实现方式

定时任务实现的几种方式&#xff1a; 1、JDK自带 &#xff08;1&#xff09;Timer&#xff1a;这是java自带的java.util.Timer类&#xff0c;这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行&#xff0c;但不能在指定时间运行。…...

docker部署springboot+Vue项目

项目介绍&#xff1a;后台springboot项目&#xff0c;该项目环境mysql、redis 。前台Vue&#xff1a;使用nginx反向代理 方法一&#xff1a;docker run 手动逐个启动容器 1.docker配置nginx代理 将vue项目打包上传到服务器上。创建文件夹存储数据卷&#xff0c;html存放打包…...

Llama3-Tutorial(Llama 3 超级课堂)-- 笔记

第1节—Llama 3 本地 Web Demo 部署 端口转发 vscode里面设置端口转发 https://a-aide-20240416-b4c2755-160476.intern-ai.org.cn/proxy/8501/ ssh -CNg -L 8501:127.0.0.1:8501 rootssh.intern-ai.org.cn -p 43681参考 https://github.com/SmartFlowAI/Llama3-Tutorial/b…...

【备战软考(嵌入式系统设计师)】12 - 嵌入式系统总线接口

我们嵌入式系统的总线接口可以分为两类&#xff0c;一类是并行接口&#xff0c;另一类是串行接口。 并行通信就是用多个数据线&#xff0c;每条数据线表示一个位来进行传输数据&#xff0c;串行接口就是一根数据线可以来一位一位地传递数据。 从上图也可以看出&#xff0c;并行…...

【一刷《剑指Offer》】面试题 18:树的子结构

力扣对应题目链接&#xff1a;LCR 143. 子结构判断 - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;树的子结构_牛客题霸_牛客网 (nowcoder.com) 核心考点&#xff1a;二叉树理解&#xff0c;二叉树遍历。 一、《剑指Offer》对应内容 二、分析问题 二叉…...

17 M-LAG 配置思路

16 华三数据中心最流行的技术 M-LAG-CSDN博客 M-LAG 配置思路 什么是M-LAG&#xff1f;为什么需要M-LAG&#xff1f; - 华为 (huawei.com) 1 配置 M-LAG 的固定的MAC地址 [SW-MLAG]m-lag system-mac 2-2-2 2 配置M-LAG 的系统标识符系统范围1到2 [SW-MLAG]m-lag system-nu…...

深入探索CSS3 appearance 属性:解锁原生控件的定制秘密

CSS3 的 appearance 属性&#xff0c;作为一个强大的工具&#xff0c;让我们得以细致入微地控制元素的外观&#xff0c;特别是对于那些具有平台特定样式的表单元素&#xff0c;如按钮、输入框等。本文不仅会深入解析 appearance 属性的基本工作原理和使用场景&#xff0c;还将通…...

C# 集合(五) —— Dictionary类

总目录 C# 语法总目录 集合五 Dictionary 1. Dictionary 1. Dictionary 字典是键值对集合&#xff0c;通过键值对来查找 Dictionary和Hashtable的区别是Dictionary可以用泛型&#xff0c;而HashTable不能用泛型 OrderedDictionary 是按照添加元素时的顺序的字典&#xff0c;是…...

Java 函数式接口BiConsumer

BiConsumer是一个函数式接口&#xff0c;代表一个接受两个输入参数且不返回任何内容的操作符 import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer;public class BatchOperate<T> {private int batchSize3000;private List<T&…...

SWERC 2022-2023 - Online Mirror H. Beppa and SwerChat (双指针)

Beppa and SwerChat 题面翻译 B和她的怪胎朋友在某个社交软件上的聊天群聊天。 这个聊天群有包括B在内的n名成员&#xff0c;每个成员都有自己从1-n的独特id。 最近使用这个聊天群的成员将会在列表最上方&#xff0c;接下来较次使用聊天软件的成员将会在列表第二名&#xff0…...

四川汇昌联信:拼多多运营属于什么行业?

拼多多运营属于什么行业?这个问题看似简单&#xff0c;实则涉及到了电商行业的深层次理解。拼多多运营&#xff0c;顾名思义&#xff0c;就是在拼多多这个电商平台上进行商品销售、推广、客户服务等一系列活动。那么&#xff0c;这个行业具体包含哪些内容呢?下面就从四个不同…...

C++11 特性

总结 语法糖: 关键字: auto、decltype。nullptr。override、final。constexpr。语法: 基于范围的 for 循环。function 函数对象。 lambda 产生函数对象。bind 产生函数对象。目的:写代码更便捷、更严谨,让编译器做更多的事情。STL 容器: array。forward_list。unordered_…...

二、使用插件一键安装HybridCLR

预告 本专栏将介绍如何使用这个支持热更的AR开发插件&#xff0c;快速地开发AR应用。 专栏&#xff1a; Unity开发AR系列 插件简介 通过热更技术实现动态地加载AR场景&#xff0c;简化了AR开发流程&#xff0c;让用户可更多地关注Unity场景内容的制作。 热更方案 基于Hybri…...

【江科大STM32学习笔记】新建工程

1.建立工程文件夹&#xff0c;Keil中新建工程&#xff0c;选择型号 2.工程文件夹里建立Start、Library、User等文件夹&#xff0c;复制固件库里面的文件到工程文件夹 为添加工程文件准备&#xff0c;建文件夹是因为文件比较多需要分类管理&#xff0c;需要用到的文件一定要复…...

C++小程序:同一路由器下两台计算机简单通信(1/2)——服务器端

同一路由器下两台电脑如何进行通信呢&#xff1f;这里通过小程序实例的方式介绍SOCKET结构体以及相关函数的使用。计算机通信是在服务器端与客户端之间进行&#xff0c;这里先介绍服务器端程序。 我这里编辑编译软件是VS2022&#xff0c;使用C空项目进行编程。在介绍程序…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...