Linux中进程的属性:状态
一、通用OS进程中的各种状态与相关概念
1.1通用进程中的状态
CPU执行进程代码,不是把进程执行完才开始执行下一个,而是给每个进程预分配一个“时间片”, CPU基于时间片进行轮转调度(每个CPU分别进行)
其中发涉及到的几个进程的状态在不同操作系统中各不相同,但可以把他们归类为图中几种:
①创建/就绪/运行状态(对于一个进程来说往往没有明显区别)
②阻塞状态
③中止状态
1.2并行与并发的概念
CPU的功能十分强大,即使有多个进程,也可以在CPU数量仅有几个的情况下,通过并行和并发来执行
①并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内让多个进程同时推进
②并行:多个进程在多个CPU下分别,同时进行
1.3时间片的概念与分时操作系统,实时操作系统
时间片是应用于分时操作系统当中的,分时操作系统的特点是:
①给每一个任务分别分配一个时间片
②调度任务尽量公平的分配(即时间片尽量贴近)
类似于Linux和Windows这种民用级别操作系统,都采用分时操作系统
与之相对的是实时操作系统:
如汽车上的操作系统,在播放音乐和紧急刹车这两个任务间,紧急刹车必须要是最高优先级,不能再尽量公平了
1.4运行状态
1.4.1分时操作系统的大致原理
首先操作系统在启动电脑时就会加载到内存中
每个CPU都会对应一个runqueue队列的对象,对象中存有PCB的头节点(这里以Linux中的task_struct为例),在不考虑优先级问题时,遵循FIFO算法
1.4.2FIFO算法的具体实现
当一个新的进程进入的时候,会形成一个task_struct,之后链入到runqueue对象的task_struct* head中
CPU在调用时,每次把head直接指向的task_struct对象拿出来,让head指向它的next,它本身进入CPU中进行运行,运行时间片结束后链入到最后一个task_struct的下一个
1.4.3什么时候进程是运行状态
通过FIFO算法说明:当对应进程在运行队列当中,该进程的状态就叫运行状态
可以理解为已经准备好了,可以随时被CPU调度
1.5阻塞状态
1.5.1操作系统对于底层硬件的管理:device链表
OS要管理底层硬件,依旧是遵循“先描述,后组织”的原则,在OS内部创建一个名为device的结构体对象,用来表示每个硬件的情况
在内存中,各个device像带头链表一样连接起来,其属性中的 type标识了是何种硬件,status则表示当前硬件是否正常工作,如此一来,再间隔一层驱动层就可以对硬件进行直接管理
1.5.2什么时候进程处于阻塞状态
当一个进程task_struct的代码中出现了scanf()等需要从键盘或其他硬件读取数据的语句,CPU会停止运行,并且不会把它链入runqueue队列中,取而代之的是链入device的一个成员变量task_struct* wait_queue下(根据1.5.1中图示device的第四个成员变量)
如果有多个需要读取的进程,会按照队列继续向下链入
这些在硬件的wait_queue队列中等待的进程,称之为阻塞状态
1.5.3阻塞状态回归运行状态的过程
在OS接收到如键盘等硬件输入的信息后,就会把这一进程的阻塞状态改为运行状态,并且将其从waitqueue头删,链入到runqueue队列中
在该进程再次进入CPU中时,就已经获取了键盘的写入数据,并继续接下来的程序
运行和阻塞的本质:让不同进程处在不同的队列中
1.5.4阻塞(又名等待)的本质是什么
连入目标外部设备,CPU不调度
1.6挂起状态
1.6.1出现的契机
处于阻塞状态的进程不会被CPU调度,但是他的代码和数据还留在内存中占用空间;
此时如果内存空间严重不足,那就可以考虑暂时将这一部分代码和数据移到硬盘中管辖,需要使用时再调回来
1.6.2意义
在内存资源严重不足的时候,给操作系统一些空间,本质上是用时间换空间(因为换入换出的本质是IO,速度很慢,实际应用时不多见)
1.6.3阻塞挂起状态
所谓挂起状态,就是在磁盘中一块称为“swap分区”的位置,把内存中的代码和数据换出到磁盘的相应位置,换出后,因为一定是在阻塞状态下才有机会进入挂起状态,此时进程的状态称为“阻塞挂起状态”
回归运行:
当硬件中获取到数据,OS会先把状态改为运行,再从内存中换出代码和数据,然后再连入运行队列
二、Linux中进程的状态
2.1底层中状态定义的方式与各类状态
在Linux中,是用task_struct中的属性int status
通过一个类似于#define的方式将整形定义为为各类状态
R(running):0
S(sleeping):1
D(disk sleep):2
T(stopped):4
t(tracing stop):8
X(dead):16
Z(zombie):32
①R
就是普通的运行状态
②S
是sleeping的缩写,为阻塞等待状态(可中断睡眠;又称浅睡眠,可以被kill杀进程)
③D
是disk sleeping磁盘睡眠的缩写,为阻塞等待状态的一种(不可中断睡眠;又称深睡眠)
④T
是stopping的缩写,也属于阻塞
⑤t
是tracing stop追踪暂停的缩写,当进程被追踪的时候(如gdb中断点停下,进程状态为t)也属于阻塞
⑥X
是dead的缩写,死亡状态
⑦Z
是zombie的缩写,僵尸状态
2.2D状态
disk sleeping,即磁盘睡眠
因为磁盘负责存取数据,这很重要,所以操作系统中的进程在磁盘当中等待的状态比较特殊,它的出现是因为要向磁盘当中写入数据是做IO操作,需要花很多时间
而且这段时间进程不能出任何问题,否则会造成数据的丢失,所以单独设置了一个深睡眠防止被杀进程
注:D状态大多的情况下是瞬时的状态,不会被查到;因为如果查到,那么大概率是磁盘出现了一些问题,如老化,空间不足等。
2.3S状态与S+状态的区别
他们的区别主要在是否是后台进程上:一般一个可执行程序启动后默认都是前台程序,状态对应S+;后台进程则对应状态S
实例:
假如运行起来一个可执行程序mycode
我们可以通过
./+[可执行程序] &
来启动后台进程
效果
查询结果:
后台进程的特点是什么?
无法被ctrl+C杀进程,只能通过kill -9来结束程序
前台进程:
后台进程:
用kill -9杀进程后:
2.4T状态的主动设置与取消以及其影响
T状态的设置有两种方式:
①当进程做了非法但是不致命的操作,被OS暂停
②可以利用kill的选项指定一个进程进入T状态
第19号选项SIGSTOP,可以使用第18号选项SIGCONT将进程继续
用法:
kill -19 +[PID]
2.4补:主动设置T状态后取消会影响到进程的前后台属性
主动设置T状态后再继续,会自动将前台程序切换到后台
2.5X状态与进程死亡
2.5.1进程退出时的返回信息
要了解进程退出时的返回顺序,那么必须要明确:进程为什么会被创建
进程被创建是为了完成用户的任务
既如此,在进程退出时,我们必须要明确任务是否被完成,那么该怎么做呢?
实际上,我们通过进程的执行结果,告知父进程/OS任务的完成情况
那么我们该如何查看进程的执行结果呢?
可以通过指令
echo $?
查看最近程序退出时的退出信息(例如ll之后运行,就会展示ll指令是否成功)
注:程序正常完成任务返回0,其余情况返回非0
2.5.1补:“程序正常完成任务返回0,其余情况返回非0”这种说法的实例
我们在写main函数的时候,会在最后一行写上return 0; 其实这一个返回值就是返回给OS进程的执行结果,返回0就是程序正常执行完毕
如果我们刻意main函数写返回10,$?结果也会变为10
2.6死亡状态X与僵尸状态Z
2.6.1通过现实例子理解二者对于进程结束的影响
正如在苹果从树上掉下腐烂后,我们研究它落地时间最后扔掉它的过程
苹果在树上成熟,它落地后腐烂,直到我们发现并对它进行检测研究结束,它的腐烂时间这一数据就被记录了下来,最后他才会被扔掉
这个过程类比就是:
在树上生长就相当于进程在运行
从树上落下相当于运行结束
结束后被我们发现并研究出腐烂时间,类比于“维持退出信息,方便父进程/操作系统来进行查询”
从掉下到研究完毕,即从进程结束到维持完退出信息,称之为僵尸状态
扔掉后,即进程死亡状态
2.6.2进程退出时发生的事情
进程=内核数据结构(task_struct)+代码和数据
①进程退出时,代码就不会再被执行了,首先可以立即释放的就是程序代码和数据
②进程退出时需要有退出信息,这些信息就保存在自己的task_struct中
③虽然退出,但它的task_struct依旧要被OS维护起来,方便用户未来获取进程退出信息
2.6.3退出信息的存储位置:task_struct中
task_struct中存储内容之一就是“进程退出信息”,对应的形式是int类型,名为exit_code
以及一些其他的信息
2.6.4进程创建/释放时,内核数据结构和代码数据出现的先后顺序
进程创建:先创建内核数据结构task_struct(没加载代码数据之前称为新建状态),再创建代码和数据
进程释放:先释放代码和数据,此时称之为僵尸状态,task_struct暂时被维护起来
2.6.5结合例子观察僵尸状态(死亡状态为瞬时状态,无法观察)及系统层面的内存泄漏
首先需要一个代码:可以展示父子进程同时进行,且子进程进行十次以后停止,但父进程一直运行
4 int main()5 {6 printf("父进程开始执行;我的PID:%d,我的PPID:%d\n",getpid(),getppid());7 8 pid_t pi=fork();9 if(pi==0)10 {11 int cnt=10;12 while(cnt > 0)13 {14 printf("我是子进程,我的PID:%d,我的PPID:%d,当前cnt:%d\n",getpid(),getppid(),cnt);15 sleep(1);16 cnt--;17 } 18 }19 else {20 while(1)21 {22 printf("我是父进程,我的PID:%d,我的PPID:%d\n",getpid(),getppid()); 23 sleep(1);24 25 }26 }27 28 29 return 0;30 }
我们编辑出一个名为“status”的可执行程序
为了可以实时监控进程的状态,我们需要使用“循环执行指令”的方式(暂不展开讲述循环方法)
while :;do ps axj |head -1;ps axj | grep status;sleep 1;done
执行结果:
在刚开始执行./status程序时,进程的状态一直是“S+”
在子进程循环十次以后,状态发生了改变,成为了“Z+”
从这个结果我们可以看出:子进程执行完了以后,程序进入僵尸状态;这个状态是为了维护自己的task_struct,方便未来父进程读取退出状态(父进程不读,子进程PCB不退),对于此时的子进程来说,OS和父进程都不会直接回收他
其中“defunct”意为“失效的”,即表示进程已经开始退出
系统层面的内存泄漏:
在例子中,如果没有人管子进程,他会一直处于僵尸状态,而task_struct是一个不小的对象,他一直在消耗内存,这就是内存泄漏(系统层面)
解决:
一般需要父进程主动读取子进程退出信息,子进程就会自动退出
2.6补:我们malloc/new出来的空间会随着进程结束而自动释放吗(语言层面内存泄漏)
会的,malloc/new出来的空间属于“代码和数据”中的“数据”这部分,进程退出,代码和数据自动释放
所以内存泄漏(语言层面)主要怕一直不退的常驻进程,这样new出来的空间一直不还
2.7孤儿进程
2.7.1对比2.6.5中的例子,理解孤儿进程的出现
父在子退会出现僵尸进程,而父退子在就会出现孤儿进程
修改例子中的代码:
4 int main()5 {6 printf("父进程开始执行;我的PID:%d,我的PPID:%d\n",getpid(),getppid());7 8 pid_t pi=fork();9 if(pi==0)10 {11 int cnt=10;12 while(cnt > 0)13 {14 printf("我是子进程,我的PID:%d,我的PPID:%d,当前cnt:%d\n",getpid(),getppid(),cnt);15 sleep(1);16 17 }18 }19 else {20 int cnt=10;21 while(cnt > 0)22 { 23 printf("我是父进程,我的PID:%d,我的PPID:%d,当前cnt:%d\n",getpid(),getppid(),cnt);24 sleep(1);25 cnt--;26 }27 }28 29 30 return 0;31 }
我们让父进程只执行10次,而子进程无限循环
效果:
我么不难发现:子进程的PPID变为了1,那么这里的1究竟是什么呢?
2.7.2利用top可以快速查看当前所以进程,寻找PID为1的是谁
从中可以读出:PID为1对应的是“systemd”,即内存中加载的操作系统
父进程退出后,子进程会被“系统”(部分OS下名为initd)自动领养
2.7.3孤儿进程的影响:转到后台
被“领养”的子进程会自动装到后台去运行,它不能被ctrl+c杀进程,需要kill -9来进行中止
相关文章:
Linux中进程的属性:状态
一、通用OS进程中的各种状态与相关概念 1.1通用进程中的状态 CPU执行进程代码,不是把进程执行完才开始执行下一个,而是给每个进程预分配一个“时间片”, CPU基于时间片进行轮转调度(每个CPU分别进行) 其中发涉及到的…...
软件架构师常用的软件工具有哪些
软件架构师的工作离不开多种工具的支撑,主要包括 建模与设计工具、文档与协作平台、代码质量与静态分析工具、性能与监控工具、DevOps 工具链、架构可视化与管理平台 等。其中,建模与设计工具 是架构师最核心的武器,能够帮助其从业务抽象到技…...
rl中,GRPO损失函数详解。
文章目录 **一、GRPO损失函数的设计背景****二、代码逐行解析****三、关键组件详解****1. 对数概率与KL散度计算****2. 优势值与策略梯度****3. 掩码与平均损失****四、训练动态与调参建议**在TRL(Transformer Reinforcement Learning)库中,GRPO(Group Relative Policy Opt…...
奇安信春招面试题
奇安信面试真题,以下是5道具有代表性的经典技术面试题及其解析,覆盖网络安全、渗透测试、安全架构设计等核心领域。 《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.…...
MineWorld,微软研究院开源的实时交互式世界模型
MineWorld是什么 MineWorld是微软研究院开发并开源的一个基于《我的世界》(Minecraft)的实时互动世界模型。该模型采用了视觉-动作自回归Transformer架构,将游戏场景和玩家动作转化为离散的token ID,并通过下一个token的预测进行…...
Nginx RTMP配置存储位置
window: 支持本地磁盘和远程网络位置 配置文件如下 worker_processes 1;events {worker_connections 1024; }#RTMP服务 rtmp {server { listen 1935; #监听端口chunk_size 4096; #数据传输块大小application my_live { # 创建rtmp应用hlslive on; # 当路径匹…...
JVM理解(通俗易懂)
虽然网上有很多关于JVM的教程,但是都天花乱坠,很多都是一上来就JVM内存模型、JVM双亲委派等等,(可能我比较菜看不懂)。于是我自己决定写一篇能看懂的文章~如果有看不懂我就自己百度,大家有什么疑问也可以评论区交流~ 欢迎指点我的Error~ JVM概念 JVM大家都知道,就Ja…...
python三维矩阵的维度
matrix_3x3x3 np.array([[[ 8.35, 16.72, 17.46],[16.72, 33.49, 34.97],[17.46, 34.97, 36.51]],[[16.72, 33.49, 34.97],[33.49, 67.09, 70.05],[34.97, 70.05, 73.13]],[[17.46, 34.97, 36.51],[34.97, 70.05, 73.13],[36.51, 73.13, 76.35]] ]) 例如这样的三维矩阵&#…...
HarmonyOS 是 Android 套壳嘛?
文章目录 HarmonyOS 是 Android 套壳吗?技术视角的深度解析一、核心结论二、技术对比:从底层到应用层1. 内核与基础架构2. 应用开发与运行机制3. 生态与应用场景 三、常见误解的澄清误解 1:“HarmonyOS 使用 Android 应用,所以是套…...
【Java面试笔记:基础】10.如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
1. 保证集合线程安全的方式 传统同步容器:如 Hashtable 和 Vector,通过在方法上加 synchronized 关键字实现线程安全,但性能较低。同步包装器:通过 Collections.synchronizedMap 等方法将普通集合包装成线程安全的集合,但仍然使用粗粒度的锁,性能不佳。List<String>…...
【Amazing晶焱科技高速 CAN Bus 传输与 TVS/ESD/EOS 保护,将是车用电子的生死关键无标题】
台北国际车用电子展是亚洲地区重量级的车用电子科技盛会,聚焦于 ADAS、电动车动力系统、智慧座舱、人机界面、车联网等领域。各大车厂与 Tier 1 供应链无不摩拳擦掌,推出最新技术与创新解决方案。 而今年,“智慧座舱” 无疑将成为全场焦点&am…...
电控---DMP库
一、DMP库的本质与核心定位 DMP库是为Invensense(现TDK)系列传感器(如MPU6050、MPU9250等)内置的数字运动处理器(DMP)硬件模块提供的软件接口层。其核心目标是: 抽象硬件操作:将复…...
YOLO数据处理
YOLO(You Only Look Once)的数据处理流程是为了解决目标检测领域的核心挑战,核心目标是为模型训练和推理提供高效、规范化的数据输入。其设计方法系统性地解决了以下关键问题,并对应发展了成熟的技术方案: 一、解决的问…...
Linux实现网络计数器
1.TcpServer.hpp文件 类TcpServer的私有成员变量有端口号,指向类Socket对象的指针,布尔值表示是否运行,以及回调函数,ioservice_t是表示参数为指向Socket对象的指针和InetAddr对象的函数,TcpServer类的构造函数接收端…...
数据分析:用Excel做周报
目录 1.初始模板 编辑 2.填充数据 2.1 日期以及表头 2.2 数据验证 2.3 计算数据填充 2.3.1 灵活计算 2.3.2 单独计算 2.3.3 总计 2.4 数据格式 2.5 周累计 2.6 周环比 2.7 业务进度 3 美化 1.初始模板 2.填充数据 2.1 日期以及表头 结果指标有以下这些&#…...
初阶数据结构--排序算法(全解析!!!)
排序 1. 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些些关键字的大小,递增或递减的排列起来的操作。 2. 常见的排序算法 3. 实现常见的排序算法 以下排序算法均是以排升序为示例。 3.1 插入排序 基本思想:…...
SpringCloud 微服务复习笔记
文章目录 微服务概述单体架构微服务架构 微服务拆分微服务拆分原则拆分实战第一步:创建一个新工程第二步:创建对应模块第三步:引入依赖第四步:被配置文件拷贝过来第五步:把对应的东西全部拷过来第六步:创建…...
加油站小程序实战教程14会员充值页面搭建
目录 1 原型2 搭建充值金额选择功能3 搭建金额输入4 搭建支付方式5 充值按钮最终的效果 上一篇我们介绍了充值规则的后台功能,有了基础的规则,在会员充值页面就可以显示具体的充值规则。本篇我们介绍一下会员充值的开发过程。 1 原型 充值页面我们是分为…...
内卷的中国智驾,合资品牌如何弯道超车?
作者 |德新 编辑 |王博 上海车展前夕,一汽丰田举办重磅车型bZ5的技术发布会,脱口秀演员庞博透露了这款车型的一大重要特性,其搭载来自Momenta的智能辅助驾驶系统行驶里程已经超过20亿公里。 携手中国科技公司提高车型智能化的属性ÿ…...
【go】go run-gcflags常用参数归纳,go逃逸分析执行语句,go返回局部变量指针是安全的
go官方参考文档: https://pkg.go.dev/cmd/compile 基本语法 go run 命令用来编译并运行Go程序,-gcflags 后面可以跟一系列的编译选项,多个选项之间用空格分隔。基本语法如下: go run -gcflags "<flags>" main.…...
数据库11(触发器)
触发器有三种类型,包括删除触发器,更新触发器,添加触发器 触发器的作用是:当某个表发生某个操作时,自动触发触发器,进行触发器规定的操作 触发器语句 create trigger tname --创建触发器 on aa --创建在表…...
十大物联网平台-物联网十大品牌
物联网十大品牌及平台解析 物联网(IoT)作为当下极具影响力的技术,正逐步渗透至社会各领域,为人们生活与社会发展带来诸多便利与变革。如今,众多企业投身于物联网行业,致力于推动其发展。以下是对物联网相关…...
心智模式VS系统思考
很多人常说,“改变自己,从改变思维开始。”但事实上,打破一个人的心智模式,远比想象中要困难得多。我们的思维方式、行为习惯,甚至是对世界的认知,往往是多年积累下来的产物。那些曾经的经历、长期的学习与…...
QT 打包安装程序【windeployqt.exe】报错c000007d原因:Conda巨坑
一、命令行执行命令 E:\Project\GNCGC\Bin\Win32\Vc22\RS422地检>E:\SoftWare\Qt\5.14.2\msvc2017\bin\windeployqt.exe CGC170.exe二、安装了Conda的朋友,巨坑 无语,E:\SoftWare\Qt\5.14.2\msvc2017\bin\windeployqt.exe 优先把Conda环境关联的Qt动…...
Vue3祖先后代组件数据双向同步实现方法
在 Vue3 中实现祖先后代组件的双向数据同步,可以通过组合式 API 的 provide/inject 配合响应式数据实现。以下是两种常见实现方案: 方案一:共享响应式对象 方法 html <!-- 祖先组件 --> <script setup> import { ref, provide…...
OpenBayes 一周速览|EasyControl 高效控制 DiT 架构,助力吉卜力风图像一键生成;TripoSG 单图秒变高保真 3D 模型
公共资源速递 10 个教程: * 一键部署 R1-OneVision * UNO:通用定制化图像生成 * TripoSG:单图秒变高保真 3D * 使用 VASP 进行机器学习力场训练 * InfiniteYou 高保真图像生成 Demo * VenusFactory 蛋白质工程设计平台 * Qwen2.5-0mni…...
服务器-conda下载速度慢-国内源
文章目录 前言一、解决问题:使用国内conda镜像下载(差)二、解决问题:使用pip下载(优)总结 前言 conda频道中有无效频道导致下载失败 一、解决问题:使用国内conda镜像下载(差) 步骤 1ÿ…...
python的pip download命令-2
当然可以,下面我详细解释一下 pip download 的作用、用法和技术原理。 🧠 一句话总结: pip download 是 pip 提供的一个命令,用来下载 Python 包及其依赖项的安装文件,但不会安装。 🔍 和 pip install 的区别: 命令作用是否安装是否联网典型用途pip install安装指定包…...
【Java设计模式及实践学习-第4章节-结构型模式】
第4章节-结构型模式 笔记记录 1. 适配器模式2. 代理模式3. 装饰器模式4. 桥接模式5. 组合模式6. 外观模式7. 享元模式8. 总结 1. 适配器模式 2. 代理模式 3. 装饰器模式 4. 桥接模式 5. 组合模式 6. 外观模式 7. 享元模式 Java语言中的String字符串就使用了享元模式&…...
python:mido 提取 midi文件中某一音轨的音乐数据
pip install mido 使用 mido库可以方便地处理 MIDI 文件,提取其中音轨的音乐数据。 1.下面的程序会读取指定的 MIDI 文件,并提取指定编号音轨的音乐数据,主要包括音符事件等信息。 编写 mido_extract.py 如下 # -*- coding: utf-8 -*- &…...
将输入帧上下文打包到下一个帧的预测模型中用于视频生成
Paper Title: Packing Input Frame Context in Next-Frame Prediction Models for Video Generation 论文发布于2025年4月17日 Abstract部分 在这篇论文中,FramePack是一种新提出的网络结构,旨在解决视频生成中的两个主要问题:遗忘和漂移。 具体来说,遗忘指的是在生成视…...
第六章:Multi-Backend Configuration
Chapter 6: Multi-Backend Configuration 从交响乐团到变形金刚:如何让代理适应不同环境? 在上一章任务工作流编排,我们学会了如何像指挥家一样协调任务。但就像变形金刚能切换不同形态应对环境变化一样,你的AI代理也需要能灵活切…...
tomcat远程Debug
tomcat远程Debug -- /bin目录下 catalina.bat文件下加一行 SET CATALINA_OPTS-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:transportdt_socket,servery,suspendn,address8088idea端配置如下...
Vue3:component(组件:uniapp版本)
目录 一、基本概述二、基本使用三、插槽 一、基本概述 在项目的开发过程中,页面上井场会出现一些通用的内容,例如头部的导航栏,如果我们每一个页面都去写一遍,那实在是太繁琐了,所以,我们使用组件来解决这…...
rust编程学习(三):8大容器类型
1简介 rust标准库std::collections也提供了像C STL库中的容器,分为4种通用的容器,8种类型,如下表所示。 线性容器类型: 名称简介Vec<T>内存空间连续,可变长度的数组,类似于C中Vector<T>容器…...
前端中阻止事件冒泡的几种方法
在 JavaScript 前端开发中,阻止事件冒泡是处理 DOM 事件时的常见需求。以下是几种阻止事件冒泡的方法: 1. 使用 event.stopPropagation() 这是最常用的阻止事件冒泡的方法。 element.addEventListener(click, function(event) {event.stopPropagation…...
ShenNiusModularity项目源码学习(20:ShenNius.Admin.Mvc项目分析-5)
ShenNiusModularity项目的系统管理模块主要用于配置系统的用户、角色、权限、基础数据等信息,上篇文章中学习的日志列表页面相对独立,而后面几个页面之间存在依赖关系,如角色页面依赖菜单页面定义菜单列表以便配置角色的权限,用户…...
前端js需要连接后端c#的wss服务
背景 前端js需要连接后端wss服务 前端:js 后端:c# - 控制台搭建wss服务器 步骤1 wss需要ssl认证,所以需要个证书,随便找一台linux的服务器(windows的话,自己安装下openssl即可),…...
MAGI-1自回归式大规模视频生成
1. 关于 MAGI-1 提出 MAGI-1——一种世界模型(world model),通过自回归方式预测一系列视频块(chunk,固定长度的连续帧片段)来生成视频。 模型被训练为在时间维度上单调递增噪声的条件下对每个块进行去噪&a…...
深入剖析TCP协议(内容一):从OSI与TCP/IP网络模型到三次握手、四次挥手、状态管理、性能优化及Linux内核源码实现的全面技术指南
文章目录 TCP网络模型OSI参考模型TCP/IP五层模型 TCP状态TIME_WAIT 连接过程TCP三次握手TCP四次挥手 TCP优化TCP三次握手优化TCP四次挥手优化TCP数据传输优化 TCP TCP是面向连接的、可靠的、基于字节流的传输层通信协议: 面向连接:一定是一对一才能连接…...
基于deepseek的模型微调
使用 DeepSeek 模型(如 DeepSeek-VL、DeepSeek-Coder、DeepSeek-LLM)进行微调,可以分为几个关键步骤,下面以 DeepSeek-LLM 为例说明,适用于 Q&A、RAG、聊天机器人等方向的应用。 一、准备工作 1. 环境依赖 建议使用 transformers + accelerate 或 LoRA 等轻量微调方…...
node.js 实战——(path模块 知识点学习)
path 模块 提供了操作路径的功能 说明path. resolve拼接规范的绝对路径path. sep获取操作系统的路径分隔符path. parse解析路径并返回对象path. basename获取路径的基础名称path. dirname获取路径的目录名path. extname获得路径的扩展名 resolve 拼接规范的绝对路径 const…...
【k8s】docker、k8s、虚拟机的区别以及使用场景
一、Docker (一)概念 Docker 是一个开源的应用容器引擎,允许开发者将应用及其依赖打包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可实现虚拟化。 (二)隔离性 Docker 的隔离…...
校园外卖服务系统的设计与实现(代码+数据库+LW)
摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,外卖信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…...
Windows上使用Python 3.10结合Appium-实现APP自动化
一、准备工作 所需条件: Windows 10/11 操作系统 Python 3.10.x(建议3.10.9) Java JDK 8 或以上(建议JDK 8u301) Node.js 14.x 或以上(建议14.21.3) Appium Server 1.22.x 或以上(建…...
【计算机视觉】CV项目实战- SiamMask 单阶段分割跟踪器
SiamMask 单阶段分割跟踪器 一、项目概述与技术原理1.1 核心技术创新1.2 性能优势 二、实战环境搭建2.1 系统要求与依赖安装2.2 项目编译与配置 三、模型推理实战3.1 快速体验Demo3.2 常见运行时错误处理 四、模型训练指南4.1 数据准备流程4.2 训练执行与监控 五、高级应用与优…...
计算机视觉基础
1. 数字图像的基本概念 像素(Pixel):图像的最小构成单元,每个像素存储亮度或颜色信息。 灰度图像:每个像素是 0(黑)~255(白) 的标量值(8位无符号整数&#x…...
系统编程_进程间通信机制_消息队列与共享内存
消息队列概述 消息有类型:每条消息都有一个类型,就像每封信都有一个标签,方便分类和查找。消息有格式:消息的内容有固定的格式,就像每封信都有固定的信纸格式。随机查询:你可以按类型读取消息,…...
一种免费的离线ocr-汉字识别率100%
一般我们手机中常用的ocr库有,Tesseract,paddle ocr,EasyOCR, ocrLite等等,这些ocr库中百度的paddle ocr效果最好,但是再好的效果也会偶尔识别错几个汉字。当我们在做自动化脚本过程中,如果识别…...
Maven 工程中的pom.xml 文件(图文)
基本信息 单工程项目【pom.xml文件】中最基本的信息。 依赖引入 可以在Maven 中央仓库查找所需依赖:【直达:https://mvnrepository.com/】。 在【dependencies】标签中添加所需依赖。 <dependency><groupId>com.baomidou</groupId&g…...