Linux 第三十二章
🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
线程
线程的概念
linux并不存在真正意义上的线程,而是利用进程的资源模拟实现线程的
ps -aL
CPU 的局部性原理
cache:高速缓存
线程
线程的概念
线程是比进程更加轻量化的执行流/线程是在进程内部执行的一种执行流
在 Linux 中,线程是指在同一进程内并发执行的轻量级执行单元。与进程不同的是,线程共享相同的地址空间和其他资源,包括文件描述符、信号处理和状态信息。每个线程都有自己的栈,但它们共享数据段、代码段和其他内存部分。这使得线程之间的切换比进程之间的切换更加高效。
线程是CPU调度的基本单位/进程是承担系统资源的基本实体
创建一个线程,只需要创建pcb,不需要创建虚拟地址空间、页表等,多个进程pcb指向一个虚拟地址空间即可
os如果支持线程,也必须管理线程,先描述,再组织,TCB(linux中不会单独设计线程TCB,因为线程大多数东西,都是和PCB差不多,所以只需要复用即可,windows是单独设计了一套TCB)
linux并不存在真正意义上的线程,而是利用进程的资源模拟实现线程的
事例
#include<iostream> #include<pthread.h> #include<unistd.h>using namespace std;void* threadroutine(void* arg) { const char* threadname=(const char*)arg;while(true) { cout<<"I am a new thread"<<threadname<<endl; sleep(1); } }int main(){ //这里已经有进程了 pthread_t tid;pthread_create(&tid,nullptr,threadroutine,(void*)"thread 1");//主线程 while(true) { cout<<"I am main thread"<<endl; sleep(1); } return 0;}结果: [BCH@hcss-ecs-6176 2_21]$ ./testThread I am main thread I am a new threadthread 1 I am main thread I am a new threadthread 1 I am main thread I am a new threadthread 1 I am main thread I am a new threadthread 1 I am main thread I am a new threadthread 1[BCH@hcss-ecs-6176 2_21]$ while :; do ps ajx | head -1 && ps ajx | grep testThread | grep -v grep; sleep 1; done PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND6528 2570 2570 6528 pts/5 2570 Sl+ 1000 0:00 ./testThreadPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND从结果可以知道,主线程和新线程都向屏幕输出了,并且通过ps指令检测只有一个进程
ps -aL
ps -aL 命令用于显示系统中所有进程的详细信息,包括每个线程的信息。在 ps -aL 命令中,-a 选项表示显示所有用户的进程,-L 选项表示显示每个线程的信息。这样,执行该命令后会列出系统中所有进程及其相关的线程信息。
事例
[BCH@hcss-ecs-6176 2_21]$ ps -aLPID LWP TTY TIME CMD//轻量级进程 11501 11501 pts/5 00:00:00 testThread 11501 11503 pts/5 00:00:00 testThread 11780 11780 pts/1 00:00:00 ps 29191 29191 pts/2 00:00:00 top在pcb中有一个LWP字段,它和pid类似的
CPU调度的时候看的都是LWP
如果进程里面只有一个pcb,那么这个线程的pid和lwp数值是一样的
如果进程里面只有多个pcb,那么这个主线程的pid和lwp数值是一样的,其他线程的pcb和lwp是不一样的
线程间通信的成本很低,因为他们共享的是同一份资源,而进程间通信的成本就比较高
线程之间切换,不用切换cpu中所有的寄存器
进程之间切换,需要切换cpu中所有的寄存器
CPU 的局部性原理
CPU 的局部性原理是指在程序访问内存时,程序很可能会重复访问一组相邻的内存地址,而不是随机地访问各个内存地址。这种局部性原理通常分为两种类型:时间局部性和空间局部性。
1. 时间局部性(Temporal Locality)
时间局部性是指如果一个数据被访问过一次,那么在不久的将来它可能会再次被访问。这意味着程序倾向于重复使用最近访问过的数据。CPU 利用时间局部性可以减少从内存中加载数据的次数,提高程序的性能。
2. 空间局部性(Spatial Locality)
空间局部性是指如果一个数据被访问过一次,那么与该数据相邻的数据也很可能会在不久的将来被访问。这意味着程序倾向于访问连续内存地址中的数据。CPU 利用空间局部性可以通过预取缓存行等技术来提前加载相邻数据,减少访问延迟,进而提高程序的性能。
cache:高速缓存
缓存的作用是提高 CPU 的性能。CPU 访问主内存需要花费很长时间,而缓存可以存储 CPU 频繁访问的指令和数据,以便快速地响应 CPU 的访问请求。当 CPU 访问主内存时,如果所需数据已经存储在缓存中,则可以直接从缓存中获取数据,从而避免了访问主内存所需的长时间延迟。这种方式称为缓存命中(cache hit)。
线程间切换,不需要切换cache
线程切换为什么效率高
1.寄存器切换的少
2.cache不需要重新切换
时间片也要被内部的线程瓜分,时间片也是资源
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸
相关文章:
Linux 第三十二章
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…...
手机号码的正则表达式
手机号码的正则表达式会根据不同的国家/地区有所不同,因为每个国家/地区都有自己特定的手机号码格式。但是,我可以为你提供一个通用的正则表达式模板,并给出一些具体国家/地区的例子。 通用模板 一个基本的手机号码正则表达式模板可能如下所…...

机器学习入门介绍
各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 目录 三大方向机器学习产生的原因机器如何学习…...

一文说通用户故事点数是什么?
一文说通用户故事点数是什么? 第26期:一文说通用户故事点数是什么? 用户故事点数是一种采用相对估算法进行估算的一种工具,一般采用斐波那契数列表征用户故事里说的大小,采用0 1 2 3 5 8 13这样的一些数字来表征用户…...

GAME101-Lecture07学习
前言 今天主要讲shading(着色)。在讲着色前,要先讲图形中三角形出现遮挡问题的方法(深度缓存或缓冲)。 先采样再模糊错误:对信号的频谱进行翻译(在这期间会有频谱的混叠)ÿ…...

【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”
看到这句话的时候证明:此刻你我都在努力~ 加油陌生人~ 个人主页: Gu Gu Study 专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努…...
ICSE docker related research
ICSE 2024 Empirical Study of the Docker Smells Impact on the Image Size Docker 气味对镜像大小影响的实证研究 Docker 是一种广泛采用的打包和部署应用程序的工具,它利用 Dockerfile 来构建镜像。然而,创建最佳的 Dockerfile 可能具有挑战性&…...

【C++】学习笔记——多态_1
文章目录 十二、继承8. 继承和组合 十三、多态1. 多态的概念2. 多态的定义和实现虚函数重写的两个特殊情况override 和 final 3. 多态的原理1. 虚函数表 未完待续 十二、继承 8. 继承和组合 我们已经知道了什么是继承,那组合又是什么?下面这种情况就是…...

C++map容器关联式容器
Cmap 1. 关联式容器 vector、list、deque、forward_list(C11)等STL容器,其底层为线性序列的数据结构,里面存储的是元素本身,这样的容器被统称为序列式容器。而map、set是一种关联式容器,关联式容器也是用来存储数据的࿰…...
TS-抽象类和静态成员
目录 1,抽象类1,为什么需要抽象类2,抽象成员3,设计模式-模板模式 2,静态成员1,什么是静态成员2,设计模式-单例模式 1,抽象类 1,为什么需要抽象类 有时,某个…...

SharePoint 使用renderListDataAsStream方法查询list超过5000时的数据
问题: 当SharePoint List里的数据超过5000时,如果使用常用的rest api去获取数据,例如 await this.sp.web.lists.getByTitle(Document Library).rootFolder.files.select(*, listItemAllFields).expand(listItemAllFields).filter(listItemA…...

2024042001-计算机网络 - 物理层
计算机网络 - 物理层 计算机网络 - 物理层 通信方式带通调制 通信方式 根据信息在传输线上的传送方向,分为以下三种通信方式: 单工通信:单向传输半双工通信:双向交替传输全双工通信:双向同时传输 带通调制 模拟信号…...

通过java将数据导出为PDF,包扣合并单元格操作
最近项目中需要将查询出来的表格数据以PDF形式导出,并且表格的形式包含横向行与纵向列的单元格合并操作,导出的最终效果如图所示: 首先引入操作依赖 <!--导出pdf所需包--><dependency><groupId>com.itextpdf</groupId&…...
Java内存模式以及volatile关键字的使用
1.Java内存模型 (1)Java 内存模型(Java Memory Model,简称 JMM),它是一个抽象的概念,JMM是和多线程相关的,它是一组规范,描述了一组规则,定义了多线程对共享…...

每日5题Day3 - LeetCode 11 - 15
每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:11. 盛最多水的容器 - 力扣(LeetCode) class Solution {public int maxArea(int[] height) {//这道题比较特殊,因为两边是任意…...

路由器、交换机和网卡
大家使用VMware安装镜像之后,是不是都会考虑虚拟机的镜像系统怎么连上网的,它的连接方式是什么,它ip是什么? 路由器、交换机和网卡 1.路由器 一般有几个功能,第一个是网关、第二个是扩展有线网络端口、第三个是WiFi功…...

腾讯开源混元DiT文生图模型,消费级单卡可推理
节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…...
shell脚本基础(if/else结构)
命令是双向选择语句,当用户执行脚本时如果不满足if后的表达式也会执行else后的命令,所以有很好的交互性。其结构为: if expression1 then command … command else command … command fi vim ifelse_exam.sh #ifelse_exam.sh #!/bin/bashec…...

万字长文破解 AI 图片生成算法-Stable diffusion (第一篇)
想象一下:你闭上眼睛,脑海中构思一个场景,用简短的语言描述出来,然后“啪”的一声,一张栩栩如生的图片就出现在你眼前。这不再是科幻小说里才有的情节,而是Stable Diffusion——一种前沿的AI图片生成算法—…...

Linux---编辑器vim的认识与简单配置
前言 我们在自己的电脑上所用的编译软件,就拿vs2022来说,我们可以在上面写C/C语言、python、甚至java也可以在上面进行编译,这种既可以用来编辑、运行编译,又可以支持很多种语言的编译器是一种集成式开发环境,集众多于…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...