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不需要重新切换

时间片也要被内部的线程瓜分,时间片也是资源

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸   

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

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

相关文章

前端本地调试云效上Vue项目的构建产物

一、问题背景 前两天前端小伙伴&#xff0c;在云效上构建了一个前端项目&#xff0c;构建结果显示成功&#xff0c;访问后发现Console控制台报错&#xff1a;ReferenceError: defineComponent is not defined 在此之前的版本&#xff0c;构建和访问并没有此异常&#xff0c;而…

【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)

&#x1f50d; 目的 使用动态属性&#xff0c;并在保持类型安全的同时实现非类型化语言的灵活性。 &#x1f50d; 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全&#xff0c;并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…

运维别卷系列 - 云原生监控平台 之 00.prometheus 监控汇总

以下是 运维别卷系列 - 云原生监控平台 相关的详细文章链接&#xff0c;相应的内容&#xff0c;也只是用来做入门使用的 运维别卷系列 - 云原生监控平台 之 01.prometheus 入门和部署运维别卷系列 - 云原生监控平台 之 02.prometheus exporter 实践运维别卷系列 - 云原生监控平…

eMMC和SD模式速率介绍

概述 在实际项目开发中我们常见的问题是有人会问,“当前项目eMMC、SD所使用模式是什么? 速率是多少?”。这些和eMMC、SD的协议中要求的,要符合协议。接下来整理几张图来介绍。 eMMC 模式介绍 一般情况下我们项目中都是会支持到HS400 8bit 1.8V,最大时钟频率为200MHZ,通…

会议邀请函:Prometheus开源无人机平台-无人机追踪无人车代码实战|第四届中国智能汽车创新大会

扫描上方海报二维码&#xff0c;参与报名 阿木实验室&#xff1a;为机器人研发提供开源软硬件工具和课程服务&#xff0c;让研发更高效&#xff01; 技术发展的日新月异&#xff0c;阿木实验室将紧跟技术的脚步&#xff0c;不断把机器人行业最新的技术和硬件推荐给大家。如果你…

【C语言】5.C语言函数(1)

文章目录 1.函数的概念2.库函数2.1 标准库和头文件2.2 库函数的使⽤⽅法2.2.1 学习和使用2.2.2 头⽂件包含2.2.3库函数文档的一般格式 3.⾃定义函数3.1 函数的语法形式 4.形参和实参4.1 实参4.2 形参4.3 实参和形参的关系 5.return 语句6.数组做函数参数 1.函数的概念 函数也称…

C#【进阶】委托和事件

委托和事件 文章目录 1、委托1、委托概念2、基本语法3、定义自定义委托4、使用自定义委托5、委托变量可以存储多个函数6、系统定义好的委托思考 怪物死亡数据更新 2、事件1、事件概念2、事件的使用3、为什么有事件思考 热水器 3、匿名函数1、匿名函数概念2、基本语法3、使用4、…

iLogtail 社区开源之夏活动来了!

作者&#xff1a;玄飏 在这个充满活力的夏日&#xff0c;随着阳光一同灿烂的是开源精神的光辉与创新的火花。iLogtail 社区高兴地宣布&#xff0c;我们正式加入开源之夏 2024 的行列&#xff0c;诚邀每一位怀揣梦想与激情的学生开发者&#xff0c;共同开启一场探索技术前沿、贡…

机器学习入门介绍

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

sklearn机器学习编程练习大全(一)

sklearn机器学习编程练习大全 第1题 计算DataFrame每列的缺失值比例第2题 填充缺失值第3题 使用常量填充缺失值第4题 使用最频繁出现的值填充缺失值第5题 过滤掉存在空值的行第6题 使用常量填充字符串列第7题 数值离散化第8题 虚拟编码第9题 提取元素的个数第10题 特征提取--是…

基于springboot+vue+Mysql的大学生社团活动平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

图文成片剪辑软件,分享3个专业的工具!

在数字化时代&#xff0c;图文成片剪辑软件成为了我们创作与表达的重要工具。无论是想要制作一段引人入胜的短视频&#xff0c;还是打造一幅精美的图文海报&#xff0c;这些软件都能助你一臂之力。那么&#xff0c;图文成片剪辑软件的方法有哪些&#xff1f;又有哪些值得一试的…

PHP开发中的不安全反序列化

序列化是开发语言中将某个对象转换为一串字节流的过程&#xff0c;转换后的字节流可以方便存储在数据库中&#xff0c;也可以方便在网络中进行传输。而反序列化则是将数据库取出的字节流或从网络上接收到的字节流反向转换为对象的过程。概念虽如此&#xff0c;但不同的开发语言…

ASP.NET在线二手交易系统的设计与实现

摘 要 随着当今社会信息技术的进步&#xff0c;基于互联网的各种应用日益受到了人们的重视&#xff0c;二手商品的重新利用也逐渐被人们关注&#xff0c;二手交易系统就在这种形势下产生了&#xff0c;它利用网络&#xff0c;改变了人们的购物方式。 本文是基于现代二手交易…

AC/DC电源模块的故障诊断与维修技巧

BOSHIDA AC/DC电源模块的故障诊断与维修技巧 AC/DC电源模块是一种常用的电力转换设备&#xff0c;用于将交流电转换为直流电供给电子设备。然而&#xff0c;由于使用环境和操作不当等原因&#xff0c;电源模块可能会出现故障。本文将介绍AC/DC电源模块的故障诊断与维修技巧。…

什么?你设计接口什么都不考虑?

如果让你设计一个接口&#xff0c;你会考虑哪些问题&#xff1f; 1.接口参数校验 接口的入参和返回值都需要进行校验。 入参是否不能为空&#xff0c;入参的长度限制是多少&#xff0c;入参的格式限制&#xff0c;如邮箱格式限制 返回值是否为空&#xff0c;如果为空的时候是…

VC++6.0自定义实现日志记录到文件及界面显示

1&#xff0c;实现日志记录到文件&#xff0c;支持日志文件大小限制&#xff0c;节省空间 void CController::LogWriteRecord(CString strText,CString strFileName) {CStdioFile csFile;try{BOOL bRet csFile.Open(strFileName,CFile::modeCreate|CFile::modeNoTruncate|CFi…

不相交集合的数据结构

一、不相交集合的操作 不相交集合的数据结构维护了一组不相交动态集的集合 &#xff0c;用集合中的某个成员作为代表标识集合。 集合在没有修改的情况下每次访问代表得到的答案是相同的&#xff0c;此外在其它一些应用中&#xff0c;可能按照规定选择集合的代表&#xff0c;例如…

【CSS基础】

4.CSS基础 4.1css的介绍 层叠样式表(英文全称:Cascading Style Sheets),是一种对web文档添加样式的简单机制&#xff0c;属于表现层的布局语言.4.2css基础语法 CSS语法由两部分组成&#xff1a;选择符、声明。 声明包括&#xff1a;属性和属性值选择符 {属性: 属性值 ;属性:…

docker 配置文件使用经验,后续持续增加

1. 容器中如何访问主机服务 在docker容器、docker compose 中如何访问主机服务呢&#xff1f; docker容器 20.10.0 版本在 linux 新增 host.docker.internal 支持&#xff1a; docker run -it --add-hosthost.docker.internal:host-gateway alpine cat /etc/hosts 127.0.0.…