线程的概念
目录
线程的概念
创建线程快速验证
物理内存管理
再谈页表
今天我们学习线程的概念
线程的概念
进程是一个指向起来的程序,进程=内核数据结构+代码和数据,线程称为指向流,执行粒度比进程要更细,是进程内部的一个执行分支,进程是承担分配系统资源的基本实体,线程是OS调度的基本单位,这是他们的区别,Linux下的线程是用进程模拟实现的,线程在进程的地址空间内运行,所以进程和线程是统一的。
一个进程的内部可以有很多个执行分支,我们之前学的进程内部只有一个执行分支,即内部只有一个线程。
既然线程是仿照这进程进行设计的,所以线程肯定也有自己单独的task_struct,然后这个内核数据结构指针的指向线程自己的执行地址空间肯定在一个进程的task_struct的代码区,所以进程的task_struct肯定大于等于线程的task_struct,当等于时,进程就变成线程了,所以我们以前学的单个进程也可以叫做线程。
线程是Linux的一个执行流,又是仿照的进程,所以线程又被统一的称为轻量级进程(LWP),Linux中没有真正意义上的线程,Linux的线程概念是用LWP进行模拟实现的。
轻量级进程(Lightweight Process, LWP)本身并不是一个数字,而是一个操作系统中的概念,指的是进程中的一个执行单元或线程。不过,在某些上下文中,LWP 可能会与一个唯一的标识符(ID)关联,这个标识符通常是一个数字,用于在系统中区分不同的 LWP。虽然这两者在表示上一样。
可以看到上面这个进程里面有很多个分支。Windows上的线程就是单独分开的,Windows 和 Linux 在线程设计上的差异主要源于它们不同的历史背景、设计哲学和系统架构目标。
创建线程快速验证
我们使用pthread_create函数创建线程。pthread_create
是 POSIX 线程(pthread)库中的一个函数,用于创建一个新的线程。它是多线程编程中非常重要的一个函数,允许程序在同一个进程中并发执行多个任务。可以循环的创建一堆的线程,注意是在同一个进程中创建的多个或者一个线程,所以根据上面的理论,这些创建的线程的pid一定是一样的,LWP的id一定是不一样的用来标记不同线程。
返回值不用管,第一个参数就是一个输出型参数,类型如上,第二个参数不用管直接传nullptr,第三个参数是创建的线程必须执行的函数(参数是void*,返回值也是void*),传的是函数指针,第4个参数是执行函数的参数,可以不使用但是不能不传。
#include<iostream>
#include<pthread.h>
#include<unistd.h>
using namespace std;
void* run(void* args)
{while (true){cout << "new thread" << endl;sleep(1);}return nullptr;
}
int main()
{cout << "我是一个进程" << getpid() << endl;pthread_t tid;pthread_create(&tid, nullptr, run, (void*)"thread-1");//主线程while (true){cout << "main thread" << getpid() << endl;sleep(1);}return 0;
}
主线程(Main Thread)是多线程程序中的一个特殊线程,它是程序启动时由操作系统自动创建的线程,负责执行 main
函数中的代码。主线程在多线程程序中扮演着核心角色,通常用于初始化资源、创建其他线程以及协调程序的整体执行流程。
我们可以吧线程当成进程来看,pthread_create创建一个线程,那相当于创建一个子线程,然后主线程创建子线程,所以main函数就是主线程是提前创建好的。
一般情况下要运行多线程程序需要自己编译的时候带-l选项自己链接线程的动态库以防找不到。
但是
-
在某些 Linux 发行版或编译器版本中,GCC 或 Clang 可能会默认链接 pthread 库,即使你没有显式指定
-lpthread
。比较新的版本都这样我的也不例外。
按结果来看,确实所有线程的pid都是一样的,
ps -aL
是一个用于查看当前系统中所有线程(包括轻量级进程,LWP)的 Linux 命令。它会列出所有进程及其关联的线程信息。我们可以使用这个选项查看我们刚刚创建的线程的id是否不一样。
可以看出不一样,真实调度的线程得看LWP的值
物理内存管理
操作系统需要管理内存,按照先描述再组织的原则,当有EIF格式的可执行程序运行时inode里面的数据和data block里面的数据都以数据块的形式存入内存,Linux中,内存管理的基本单位是4KB,所以每次存入的数据块都是4KB的,不够4KB的也存4KB,所以物理内存就是多个4KB的数据块的叠加,每个数据块又叫一个页,把物理内存按照⼀个固定的⻓度的⻚框进⾏分割,有时叫做物理⻚。每个⻚框包含⼀个物理⻚ (page)。⼀个⻚的⼤⼩等于⻚框的⼤⼩。⼤多数 32位 体系结构⽀持 4KB 的⻚,⽽ 64位 体系结 构⼀般会⽀持 8KB 的⻚。假设⼀个可⽤的物理内存有4GB 的空间。按照⼀个⻚框的⼤⼩4KB 进⾏划分, 4GB 的空间就是 4GB/4KB = 1048576 个⻚框。有这么多的物理⻚,操作系统肯定是要将其管理起来的,操作系统 需要知道哪些⻚正在被使⽤,哪些⻚空闲等等。
内核⽤ struct page 结构表⽰系统中的每个物理⻚,出于节省内存的考虑, struct page 中使 ⽤了⼤量的联合体union。
在这个结构里面有一下参数比较重要:
1. flags :⽤来存放⻚的状态。这些状态包括⻚是不是脏的,是不是被锁定在内存中等。flag的 每⼀位单独表⽰⼀种状态,所以它⾄少可以同时表⽰出32种不同的状态。这些标志定义在 中。其中⼀些⽐特位⾮常重要,如PG_locked⽤于指定⻚是否锁定, PG_uptodate⽤于表⽰⻚的数据已经从块设备读取并且没有出现错误。当flag等于1时就是表示page管理的数据块(页)未使用,当正在使用时flag = 1 << 1。
2. _mapcount :表⽰在⻚表中有多少项指向该⻚,也就是这⼀⻚被引⽤了多少次。当计数值变 为-1时,就说明当前内核并没有引⽤这⼀⻚,于是在新的分配中就可以使⽤它。
3. virtual :是⻚的虚拟地址。通常情况下,它就是⻚在虚拟内存中的地址。有些内存(即所谓 的⾼端内存)并不永久地映射到内核地址空间上。在这种情况下,这个域的值为NULL,需要的 时候,必须动态地映射这些⻚。
然后肯定有很多的page,所以物理内存里面有可以专门存放page的数组。
这样每个page就有了下标,并且每个struct page的大小是固定的,所以只需要得到mem_map的首地址然后根据下标进行运算就可以得到固定一个page的地址,这可以实现下标到物理地址的快速互相转换。并且每个page都可以映射到自己管理的数据块,数据块和page都是按照下标排好一一对应的,所以当要访问一个数据块时,只需要找到对应的page就可以映射对应的数据块,接着在查找flag标记得到对应数据块的使用状态。page管理数据块的属性inode,引用计数等等。
再谈页表
⻚表中的每⼀个表项,指向⼀个物理⻚的开始地址。在 32 位系统中,虚拟内存的最⼤空间是 4GB , 这是每⼀个⽤⼾程序都拥有的虚拟内存空间。既然需要让 4GB 的虚拟内存全部可⽤,那么⻚表中就需 要能够表⽰这所有的 4GB 空间,那么就⼀共需要 4GB/4KB = 1048576 个表项。如下图所⽰:
那如果只有一个页表作为虚拟地址向物理地址映射的中转站,那岂不是要开得很大,所以操作系统不可能只有一个页表,而是把⻚表看成普通的⽂件,对它进⾏离散分配,即对⻚表再分⻚, 由此形成多级⻚表的思想。
首先由一个装着1024个分项的页目录引出下一级的页表,这个页目录里面分出的1024个等大的空间称为页目录表项,每个页目录表项装着的又是一个1024个分项的页表,我称为(2级)页表,其实就是页表这些2级页表里面装着的是对应的物理内存的页框的起始地址(数据块的首地址)。
这样就相当于由原来的一个页表完成这么多地址的映射,转而通过那么多分页表的映射。那到底是这么由虚拟地址映射到物理地址的。
假设今天来了一个32位的虚拟地址如下,不是整个地址都映射过去的不然分级页表就没有意义了。
先拿着32位地址的前10bite位(绿色部分)来查页目录,再拿中间10个bite位(红色部分)来查页目录中的页表,就是拿着前10位去页目录查找索引对应的页表就找到了这个地址映射的页表,然后拿着中间10位去查那个可以帮忙映射的页表然后引索出对应映射的物理内存的页框的起始地址,由于bite位非0即1,所以每次查找用10个bite位那查找结果就会有1024钟情况,所以页目录和页表才会有1024个空间,所以我们利用地址的·1前20位就可以找到对应页框的起始地址,最后的后12位,是页框的某个字节的地址是一个偏移量,所以前面找到了页框的地址再结合最后12位的偏移量就可以找到某个字节的地址,就是找到起始地址后做页内偏移从而找到对应的物理地址。虚拟地址和物理地址其实没什么关系,在同一个4KB中所有的虚拟地址和物理地址都是按顺序排布的,在同一个4KB中任何一个虚拟地址或者物理地址都是可以互相转化的。那我们这么知道这个映射的页框存不存在或者状态如何呢?,我们页目录中的页表已经拿到了页框的起始地址做物理地址的映射的时候会判断的,再者我们不是已经拿到页框的起始地址的吗,页框的起始地址和对应管理它的page数组的对应下标是可以互相转化的,转化完成后得到管理其的page接着查找struct page的flag状态标识符就可以知道了呀!!!
一般一个进程虚拟地址向物理地址的映射一般不需要这么多的页表同时被创建,具体分配多少个页表取决于要映射的虚拟地址的个数。
一个虚拟地址的映射工作肯定还需要借助CPU的,当一个可执行程序要执行时,会去page数组申请一个数据块,然后将自己的数据代码什么的都导入其中,然后构建页表映射,什么什么的,直到所有的页表映射完成将自己main函数的虚拟地址放进CPU的esp寄存器,那进程调度这个可执行时怎么拿到页表结果的呢,进程里面是没有指针指向的,这个可执行程序的页表指向装在CPU内部的CR3寄存器里面,CPU里面的MMU(内存管理单元)会介个CR3指向的页表将虚拟地址转化成物理地址然后传出来,实现虚拟地址进,物理地址出。
相关文章:
线程的概念
目录 线程的概念 创建线程快速验证 物理内存管理 再谈页表 今天我们学习线程的概念 线程的概念 进程是一个指向起来的程序,进程内核数据结构代码和数据,线程称为指向流,执行粒度比进程要更细,是进程内部的一个执行分支&…...
firefly经典蓝牙和QProcess、QFileSystemWatcher记录
QProcess 默认不会启动一个 shell 来解析命令,而是直接调用操作系统的系统调用来启动外部程序。也就是通过fork一个子线程或者exec一个子进程来执行命令。 QProcess的参数模式 QProcess 需要明确指定命令的可执行文件路径或参数列表。 如果命令是一个可执行文件的路径…...
北斗设备启动流程与时长解析
北斗卫星导航系统作为我国自主研发的全球卫星导航系统,广泛应用于交通、通信、农业等多个领域。今天,我们就来详细探讨一下北斗设备的启动流程以及不同启动方式下的时长。 一、北斗设备的启动流程 北斗设备的启动流程可以分为以下几个关键步骤…...
PyTorch分布式训练中各节点如何通信
深度学习 文章目录 深度学习前言pytorch如何初始化分布式训练怎么知道要使用哪几台机器进行训练的如何根据标识进行初始化(init_method)如何获取进程的唯一标识rank如何实现数据如何分发 前言 同学们在处理分布式训练时经常会遇到以下几个疑问ÿ…...
又双叒叕Scrapy爬虫相关的面试题及详细解答
Scrapy是Python开发的一个快速、高层次的网络爬虫框架,专注于高效抓取网页并提取结构化数据。其核心设计基于异步处理机制,适合大规模数据采集任务。 文章目录 基础概念1. Scrapy框架的核心组件有哪些?架构与流程2. 描述Scrapy的工作流程核心组件详解3. 如何自定义Item Pipe…...
Docker与K8S是什么该怎么选?
用了很久的容器化,最近突然看到一个问题问: docker和K8S究竟有什么区别,到底该怎么选?我认真思考了一会,发现一时间还真说不明白,于是就研究了一段时间发布今天的博文! Docker vs Kubernetes&a…...
FPGA中串行执行方式之计数器控制
FPGA中串行执行方式之计数器控制 使用计数器控制的方式实现状态机是一种简单且直观的方法。它通过计数器的值来控制状态的变化,从而实现顺序逻辑。计数器的方式特别适合状态较少且状态转移是固定的场景。 基本原理 计数器控制的状态机 例程1:简单的顺序状态机 以下是一个…...
尝试使用tauri2+Django+React的项目
前言 使用Tauri2前端,本质是进程间的通信。并非前后端。 而想使用nw,先后端打包exe,再和前端打包成exe,并没有完成成功。 而笔者从Tauri中看到这种可能性。很有可能成功基于SeaORMMySQLTauri2ViteReact等的CRUD交互项目-CSDN博…...
用@keyframes-animation来实现动画效果
一、使用规则 keyframes 用于定义动画的关键帧。 animation属性 用于将keyframes动画用于元素上。 二、基本语法 keyframes keyframes xuanZhuan { /*xuanZhuan是动画名字,实现旋转*/0%{transform: rotate(0deg);}50%{transform: rotate(180deg);}100%{transform: rotate(…...
kernel中外部传递参数使用方法
在 Linux 内核模块开发中,module_param(rpc_tdebug, uint, 0600); 表示定义一个可通过外部传递参数进行配置的模块级变量,具体解析如下: 参数名称 rpc_tdebug 是模块参数的变量名,该变量需在代码中提前声明为静态全局变量&…...
AI赋能流域生态评估:从多源数据融合到服务价值预测的技术突破
流域生态系统服务评价是生态学与地理信息科学的交叉前沿,传统方法受限于数据碎片化与模型解释力不足。本文以随机森林-时空图卷积联合模型(RF-STGCN)为核心,结合2022年长江中游实际监测数据,详解AI技术在服务评价中…...
SZU软件工程大学生涯 2022~2026
用于个人面试前自我介绍,防止忘记或谈吐不流利。 面试官您好,我是来自深圳大学计算机与软件学院的软件工程专业的王雅贤。在校期间,我修读了程序设计基础、面向对象程序设计、数据结构、算法分析与设计、操作系统等核心课程,系统…...
如何设计一个合理的库存系统
库存管理系统是电商、供应链管理、仓储管理等核心系统之一。一个合理的库存系统需要同时满足高并发、数据一致性、实时性、扩展性等要求,以确保在各种业务场景下都能稳定运行。 本文将探讨如何设计一个合理的库存系统,包括库存模型设计、数据一致性策略…...
数据人的进阶之路:四年数仓实践与成长思考
前言 在数据仓库开发的过程中,常常会遇到很多值得思考的问题,它们不仅关乎技术的深度,也涉及业务理解、个人的成长,甚至是数据行业未来的价值。回顾过去的经历,有很多问题反复出现,甚至成为绕不开的课题&am…...
数据库原理及应用mysql版陈业斌实验一
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 实验一:数据库与数据表的定义和数据操作 1.实验数据如下 …...
Linux环境变量:深入解析与实用指南
目录 一、环境变量概述 二、环境变量的作用 三、环境变量的类型 3.1系统环境变量 3.2用户环境变量 四、环境变量的操作 4.1查看环境变量 4.2设置环境变量 4.3删除环境变量 五、环境变量的配置文件 六、环境变量的最佳实践 七、总结 环境变量是Linux系统中至关重要的…...
大数据 Spark 技术简介
Apache Spark 是一种快速、通用、可扩展的大数据处理引擎,最初由加州大学伯克利分校开发。它提供了一种高效的数据处理框架,可以处理大规模数据集,并在分布式计算集群上进行并行处理。 Apache Spark 的基本概念包括以下几个要点:…...
Go语言的基础类型
一基础数据类型 一、布尔型(Bool) 定义:表示逻辑真 / 假,仅有两个值:true 和 false内存占用:1 字节使用场景:条件判断、逻辑运算 二、数值型(Numeric) 1. 整数类型&…...
面试复习-基础网络+运维知识
一、TCP/IP模型及每层对应通信协议 1.1第一层-应用层 作用:服务及应用程序 HTTP --- 超文本传输协议--- 获取网页信息---80(TCP 80) HTTPS --- HTTP SSL(安全传输协议)/TLS ---443(TCP 443) …...
大屏设计新纪元:定制视觉盛宴
当城市天际线的巨型LED幕墙与元宇宙中的虚拟场景无缝交织,当博物馆的数字藏品在8K曲面屏上焕发新生,一个属于大屏设计的全新纪元已悄然降临。这场视觉革命不仅重构了信息传播的维度,更将“定制化体验”推向了前所未有的高度——每一寸屏幕都成…...
JavaIO流的使用和修饰器模式(直击心灵版)
系列文章目录 JavaIO流的使用和修饰器模式 文章目录 系列文章目录前言一、字节流: 1.FileInputStream(读取文件)2.FileOutputStream(写入文件) 二、字符流: 1..基础字符流:2.处理流:3.对象处理流:4.转换流: 三、修饰器…...
10-STL、位运算、常用函数库
1-STL vector vector是变长数组 //定义vector vector<int>a;//第一维长233,第二维长度动态变化 vector<int>b[233];//自定义的结构体类型也可以保存在vector中 struct res{...}; vector<rec>c;//函数 a.size();//返回vector的实际长度…...
【Ratis】Ratis Streaming概览
看了Tsz-Wo Nicholas Sze博士的一个关于Ratis的share,在share里提到了raits做的一个性能优化:客户端流。比较感兴趣,特此记录一下。如果想看原始分享的,可以搜关键词:Apache Ratis - A High Performance Raft Library 关于Ratis Stream的pdf介绍,在这个PR的附件里: [Ra…...
Python Seaborn面试题及参考答案
目录 如何用 stripplot () 绘制带随机偏移的分类散点图?如何控制 jitter 参数? swarmplot () 如何避免散点重叠?适用场景与数据量限制是什么? 使用 catplot () 绘制箱线图时,如何通过 kind 参数切换图表类型? 如何通过 hue 参数在分类图中添加第三个维度(如性别)? …...
linux下基本命令和扩展命令(安装和登录命令、文件处理命令、系统管理相关命令、网络操作命令、系统安全相关命令、其他命令)欢迎补充噢
基本命令 ls: 列出目录内容 ls:列出当前目录内容ls -l:以长格式列出(显示详细信息)ls -a:显示隐藏文件ls -lh:以易读格式显示文件大小 pwd: 显示当前工作目录 pwd:显示当前目录的绝对路径 cd:…...
K8S学习之基础四十:K8S配置altermanager发送告警到钉钉群
配置altermanager发送告警到钉钉群 创建钉钉群,设置机器人助手(必须是管理员才能设置),获取webhook webhook: https://oapi.dingtalk.com/robot/send?access_token25bed933a52d69f192347b5be4b2193bc0b257a6d9ae68d81619e3ae3d93f7c6…...
实用工具--OfficeAI 助手 v0.3.20(长期免费,2025-03-18 本地支持WPSWord联动)
软件简介 OfficeAI助手,作为Microsoft Office与WPS的得力智能插件,集文档自动生成、内容精准校对与润色、公式智能推荐等多功能于一体。它凭借强大的数据分析能力,深度融入Office/WPS办公生态,一键简化复杂流程,让办公…...
Android 关于compose的一些坑和理解
** 1.如何在 WindowManager.addView 中使用 Jetpack Compose** 一、引出问题 Android 开发中,很常见的一个场景,通过 WindowManager.addView() 添加一个 View 到屏幕上。Android 最新的视图框架 Jetpack Compose,如何应用进来。这个被添加的…...
ref setState 合成事件
ref & setState & 合成事件 受控组件的概念:数据改变视图的叫受控组件;通过dom操作改变的叫非受控。 语法:给refxxx赋一个值,然后通过this.refs.xxx就可以获取到相应dom元素,通过你这个名字存储的值就是这个do…...
调用feapder作为子程序时setting.py文件不起作用
feaper 官方文档地址: 简介及安装 - feapder官方文档|feapder-document 问题: 在最近的开发中需要调用feapder作为主程序调用的子程序时发现自动入库时无法入库,通过查看日志信息发现连接数据库时被拒绝连接了,但是我的setting.p…...
gralloc1_perform具体在干什么
gralloc1_perform 会在特定场景下通过 ioctl 调用,执行 缓存 (cache) 管理 和 内存映射 操作,确保 CPU 和 GPU 之间的数据一致性。 📌 为什么需要对 cache 进行操作? 在 Android 系统中,CPU 和 GPU 通常共享 DDR 内存…...
【Pandas】pandas Series plot.barh
Pandas2.2 Series Plotting 方法描述Series.plot([kind, ax, figsize, …])用于绘制 Series 对象的数据可视化图表Series.plot.area([x, y, stacked])用于绘制堆叠面积图(Stacked Area Plot)Series.plot.bar([x, y])用于绘制垂直条形图(Ver…...
机器学习之浅层神经网络
文章目录 一、浅层神经网络概述(一)定义(二)常见类型 二、浅层神经网络的前向传播三、浅层神经网络的反向传播四、编写浅层神经网络案例(Python NumPy 实现)代码解释 五、浅层神经网络与深度学习的区别&am…...
透析Vue的nextTick原理
nextTick 是 Vue.js 中的一个核心机制,用于在 下一次 DOM 更新周期后 执行回调函数。它的核心原理是 利用 JavaScript 的事件循环机制(Event Loop),结合微任务(Microtask)或宏任务(Macrotask&am…...
Beans模块之工厂模块注解模块@Qualifier
博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
产品更新 | 数字助决胜:华望M-Arch平台实现从体系模型到仿真推演
华望产品更新速递 功能介绍 |M-Arch体系建模软件的核心功能 ◆体系架构建模 ◆逻辑仿真 ◆与多种工具集成 ◆多专业协同建模 产品亮点 |M-Arch软件在体系作战中的作用 ◆全面构建任务和体系架构建模的能力 ◆模型化的装备体系分析方法 ◆提升作战体系架构设计与优化 前…...
IP地址结构体与字符串转换函数详解
IP地址结构体与字符串转换函数详解 在Linux C网络编程中,IP地址的二进制结构体(如struct in_addr)与字符串形式(如"192.168.1.1")之间的转换经常涉及到,与IP地址格式相关的函数包括inet_aton、i…...
debug - 安装.msi时,为所有用户安装程序
文章目录 debug - 安装.msi时,为所有用户安装程序概述笔记试试在目标.msi后面直接加参数的测试 备注备注END debug - 安装.msi时,为所有用户安装程序 概述 为了测试,装了一个test.msi. 安装时,只有安装路径的选择,没…...
基于springboot的社区团购系统(012)
摘 要 本课题是根据用户的需要以及网络的优势建立的一个社区团购系统,来满足用户团购的需求。 本社区团购系统应用Java技术,MYSQL数据库存储数据,基于Spring Boot框架开发。在网站的整个开发过程中,首先对系统进行了需求分析&…...
应用权限组列表
文章目录 使用须知位置相机麦克风通讯录日历运动数据身体传感器图片和视频音乐和音频跨应用关联设备发现和连接剪切板文件夹文件(deprecated) 使用须知 在申请目标权限前,建议开发者先阅读应用权限管控概述-权限组和子权限,了解相关概念,再合…...
4.1、网络安全模型
目录 网络安全体系概述网络安全模型-BLP模型网络安全模型-Biba模型网络安全模型 - 信息流模型信息保障模型能力成熟度模型其它安全模型网络安全原则 网络安全体系概述 网络安全体系是网络安全保证系统的最高层概念抽象,是一个体系,体系一般是一个概念&a…...
前端对接生成式AI接口(类ChatGPT)问题汇总
文章目录 前端实现对话流问题总结流式数据传输问题后台Response Headers问题大量数据分段接收问题多个流时间戳(Time)相同导致被合并的问题 中止对话问题复制问题部署上线问题(Nginx缓冲导致) 前端实现对话流问题总结 流式数据传…...
布隆过滤器(Bloom Filter)详解
布隆过滤器详解 1. 什么是布隆过滤器? 布隆过滤器(Bloom Filter)是一种高效的概率型数据结构,主要用于判断某个元素是否存在于一个集合中。它的特点是: 允许误判:可能会误判元素存在(假阳性&…...
QoS(Quality of Service)服务质量概念
一、什么是QoS? QoS(Quality of Service)即服务质量,在网络业务中可以通过保证传输的带宽、降低传输时延、降低数据丢包率以及时延抖动等措施来提高服务质量。QoS是一套用于管理和提高网络性能的工具和技术,用于流量优…...
CSS实现当鼠标悬停在一个元素上时,另一个元素的样式发生变化的效果
CSS可以实现当鼠标悬停在一个元素上时,另一个元素的样式发生变化的效果。可以通过以下几种方法来实现: 1. 使用兄弟选择器(Adjacent Sibling Selector) 如果两个元素是兄弟关系(即它们有相同的父元素)&am…...
【C++11】左值引用、右值引用、移动语义和完美转发
🦄个人主页:修修修也 🎏所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 📌左值引用和右值引用 🎏左值和左值引用 🎏右值和右值引用 📌左值引用和右值引用比较 🎏左值引用 🎏右值…...
Docker镜像迁移
目录 1.查看镜像当前配置 2.镜像迁移 1. 停止 Docker Desktop 2. 关闭 WSL 实例(若基于 WSL 2) 4. 导出原镜像数据 5.注销原实例 6. 导入数据到新路径 7. 设置 Docker Desktop 使用新路径(可选) 8. 启动 Docker Desktop …...
Compose 实践与探索十五 —— 自定义触摸
1、自定义触摸与一维滑动监测 之前我们在讲 Modifier 时讲过如下与手势检测相关的 Modifier: Modifier.clickable { } Modifier.combinedClickable { } Modifier.pointerInput {detectTapGestures { } }这里对以上内容就不再赘述了,直接去讲解更复杂的…...
第P8周:YOLOv5-C3模块实现
🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 1. 模块组成 C3 模块由 卷积层(Convolutional layers)、激活函数(Activation functions) 和 残差连接&#…...
知识蒸馏:让大模型“瘦身“而不失智慧的魔术
引言:当AI模型需要"减肥" 在人工智能领域,一个有趣的悖论正在上演:大模型的参数规模每年以10倍速度增长,而移动设备的算力却始终受限。GPT-4的1750亿参数需要价值500万美元的GPU集群运行,但现实中的智能设备…...