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

【Linux系统】线程:线程的优点 / 缺点 / 超线程技术 / 异常 / 用途




在这里插入图片描述



1、线程的优点


创建和删除线程代价较小


创建一个新线程的代价要比创建一个新进程小得多,删除代价也小。这种说法主要基于以下几个方面:

(1)资源共享

  • 内存空间:每个进程都有自己独立的内存空间,包括代码段、数据段和堆栈等。当创建一个新的进程时,操作系统需要分配新的内存空间,并复制父进程的内存内容(这被称为地址空间复制)。而线程是进程内的执行单元,所有同属一个进程的线程共享该进程的内存空间,因此创建线程时不需要进行地址空间的复制。

  • 系统资源:进程间不共享文件描述符、信号处理等系统资源,每个新进程都需要重新初始化这些资源。相比之下,同一进程内的多个线程可以共享文件描述符、信号处理器等资源。


(2)上下文切换

  • 创建新进程涉及到完整的上下文环境设置,包括用户态和内核态的各种数据结构的初始化。而创建线程时,由于大多数资源都是共享的,只需要建立线程控制块(TCB)以及分配栈空间等少量操作即可,因此上下文切换的成本更低。


(3)性能开销

  • 时间消耗:创建和销毁进程涉及大量的系统调用和内存操作,这通常需要更多的时间。线程由于减少了大量重复资源的分配与初始化工作,所以创建和销毁的速度更快,时间消耗更少。

  • 内存消耗:新进程需要分配单独的内存空间,导致内存占用相对较高;而新线程仅需分配栈空间(通常是几MB),因此内存消耗远小于创建新进程所需的消耗。




线程切换 vs 进程切换:线程切换代价较小


更加具体和详细的整理讲解可以看这篇博客:

【Linux系统】线程切换 vs 进程切换 :线程切换成本较低-CSDN博客


与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多。

最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。

(例如 CR3 寄存器存储页表的物理地址,线程切换不更换页表,则像 CR3 这类“共享的寄存器上下文就无需切换”)

另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲 TLB(快表)会被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题,当然还有硬件 Cache。

意思是:多线程因为同属于同一个进程,线程之间可能会使用共享的数据或代码,因此 TLB 和 Cache 的缓存对其他线程也有帮助,而进程切换就一定要切换 TLB 和Cache 了,因为代码完全变了。



线程占用的资源要比进程少很多


同一进程内的所有线程共享该进程的大部分资源,包括内存地址空间、文件描述符、数据段等。

每个线程仅需要维护自己独立的线程控制块(TCB),这其中包括了线程的栈指针、程序计数器、寄存器集合等少量信息,因此线程占用的资源较少,切换速度也更快。

而进程之间的资源占用则多得多。每个进程都有自己的地址空间、文件描述符表、页表等,这些资源都是独立且私有的。这意味着进程之间的切换和通信开销更大,因为操作系统需要为每个进程分配独立的内存空间,并确保进程间的数据隔离与保护。



能充分利用多处理器的可并行数量。

每个处理器(这里考了单核处理器的情况)可调用一个线程,在多处理器系统下,本系统就可以同时调用多个线程,实现并行处理任务



其他优点


(1)在等待慢速 I/O 操作结束的同时,程序可执行其他的计算任务。

这个比较容易理解,例如有一个进程用于读取磁盘内容,磁盘 IO 属于慢速 IO,需要磁盘 IO 时,本进程可以创建一个线程专门用于磁盘 IO,可以创建其他线程用于其他工作任务,增加并行量,提升工作效率



(2)计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现。

例如某计算密集型应用创建一个进程用于密集型计算,需要计算十万条数据,就可以创建10个线程分别计算一万条数据,在多处理器系统上,每个处理器一次调用一个线程,这样就能在多处理器系统上将计算分解到多个线程中



(3)I/O 密集型应用,为了提高性能,将 I/O 操作重叠。线程可以同时等待不同的 I/O 操作。

这种也一样,将 IO 任务分配给多个线程处理



问题:计算密集型应用,线程是否越多越好?

答:并不是,若线程过多,则问题就由计算问题,转变为调度问题,增加了其他线程的等待时间,同时线程之间的TCB切换等工作也会耗时



问题:计算密集型应用,那线程一般建议创建多少个?

答:CPU物理个数乘于核数,相当于在多个多核处理器系统上,能够将所有CPU核心都刚好运用上



理想情况:线程数 = CPU核心数

理论基础:在理想的计算密集型应用中,每个线程都应该绑定到一个独立的CPU核心上,以避免上下文切换和资源竞争。因此,线程的数量应等于系统中的物理核心数(或逻辑核心数,如果启用了超线程技术)。

公式:

单个处理器:线程数 = 物理核心数

多核处理器:线程数 = 物理核心数 × 处理器数量

超线程技术:如果启用了超线程(Hyper-Threading),则线程数 = 逻辑核心数 = 物理核心数 × 2

示例:
如果你有一个4核的处理器,且没有启用超线程,那么理论上你应该创建4个线程。
如果你有一个8核的处理器,并且启用了超线程,那么你应该创建16个线程(8核 × 2)。



问题:什么是超线程技术?


超线程技术,每个物理核心可以模拟出两个逻辑核心。理论上,你可以创建两倍于物理核心数的线程。

超线程技术(Hyper-Threading Technology, HTT) 是英特尔(Intel)开发的一种并行计算技术,旨在通过让每个物理CPU核心模拟出多个逻辑核心(通常为两个),从而提高多线程应用程序的性能。超线程技术的核心思想是利用单个物理核心中的闲置资源来同时执行多个线程,从而提高系统的整体效率。

  • 物理核心 vs. 逻辑核心
    • 物理核心:每个物理核心是一个独立的处理单元,具备自己的算术逻辑单元(ALU)、寄存器、缓存等资源。
    • 逻辑核心:在启用超线程的情况下,每个物理核心可以模拟出两个或更多的逻辑核心。操作系统会将这些逻辑核心视为独立的处理器,并可以为每个逻辑核心分配不同的线程。
  • 资源共享
    • 在超线程技术中,物理核心的某些资源(如执行单元、缓存、浮点运算单元等)是共享的,而其他资源(如寄存器、指令队列等)则是为每个逻辑核心独立分配的。
    • 这意味着,虽然每个逻辑核心可以独立执行线程,但它们仍然共享同一物理核心的大部分硬件资源。因此,超线程并不能真正增加物理核心的数量,而是通过更高效地利用现有的资源来提高性能。

这就是为什么我的笔记本电脑有8个内核,却有16个逻辑处理器的原因



拓展:多核处理器与多处理器系统


处理器等同于CPU吗?

在广义定义上,处理器是一个更为广泛的概念,指的是任何能够执行指令并处理数据的电子设备或组件。它不仅包括中央处理器(CPU),还可以指其他类型的处理器,如图形处理器(GPU,专门用于图形渲染和并行计算)、张量处理单元(TPU,专为机器学习任务设计的处理器)等。



多核处理器与CPU的关系

  • 多核处理器:指在一个物理芯片上集成了多个CPU核心。每个核心都可以独立执行程序指令,相当于一个单独的CPU。因此,可以将多核处理器视为多个CPU核心集成在一起的处理器。
  • CPU核心:每个CPU核心都是一个完整的计算单元,能够进行指令解码、执行运算以及访问内存等操作。


多核处理器和多处理器系统的区别

  • 多核处理器

    • 在一个物理芯片上集成多个独立的CPU核心。
    • 所有核心共享同一块物理芯片上的资源,例如内存控制器、总线等。
  • 多处理器系统

    • 指一台计算机中安装了两个或更多的物理处理器(CPU芯片)。这些处理器可以是单核或多核的。
    • 每个处理器(无论是单核还是多核)都有自己的缓存、内存控制器等资源,并且它们之间需要有效的通信机制来协调工作。



2、线程的缺点

  • 性能损失
    • 一个很少被外部事件阻塞的计算密集型线程往往无法与其它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
  • 健壮性降低
    • 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
  • 缺乏访问控制
    • 进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
  • 编程难度提高
    • 编写与调试一个多线程程序比单线程程序困难得多。这个主要是因为线程共享资源,容易起冲突,就需要程序员设置各种保护机制。


3、线程异常


(1)进程级别的致命信号触发

  • 当一个线程因非法操作(如访问无效内存地址)导致触发致命信号(例如SIGSEGV),这会导致整个进程终止。这是因为大多数操作系统将这类信号视为进程级别的事件,而不是单独针对产生问题的线程。因此,一旦某个线程引发这种类型的崩溃,该进程下的所有线程都会被终止。

(2)未处理的算术和内存错误导致进程崩溃

  • 如果单个线程执行了除零操作或使用了野指针,且这些行为未被捕获处理,则会引发运行时错误。在C/C++等语言中,这种情况通常会导致程序直接崩溃。如果此线程所在的进程没有设置适当的信号处理器来处理此类异常情况,那么该进程将会终止,同时其所有的线程也会随之结束。

(3)异常处理与信号机制

  • 线程作为进程的执行分支,在出现异常时首先会在其自身的上下文中尝试处理。然而,对于一些无法恢复的严重错误(比如访问非法内存地址、除零等),如果没有有效的异常处理机制,会触发相应的信号(例如SIGFPE用于算术异常,SIGSEGV用于无效内存访问)。由于这些信号默认是发送给整个进程的,而非特定线程,因此会导致整个进程终止,包括其中的所有线程。

(4)注意事项

有人说:“一个线程崩溃,其他同进程下的所有线程都会被干掉,系统会给这些线程都发相同信号。”

这句话实际上包含了几个误解点:

错误点一:一个线程崩溃,其他同进程下的所有线程都会被干掉

纠正说明:

  • 当一个线程因执行非法操作(例如访问无效内存地址或除零)导致崩溃时,并不是直接导致其他线程被“干掉”。真正发生的是该线程触发了一个致命信号(如SIGSEGV)。由于大多数操作系统将此类信号视为进程级别的事件,这意味着一旦某个线程引发了这种类型的错误,整个进程可能会因此终止。而当进程终止时,属于该进程的所有线程也会随之结束。

错误点二:系统会给这些线程都发相同信号

纠正说明:

  • 实际上,在遇到上述情况时,信号是发送给整个进程的,而不是单独发送给每个线程。在Unix/Linux等操作系统中,许多关键信号(如SIGSEGV, SIGFPE)是针对整个进程的。如果一个线程触发了这样的信号且未被捕获处理,则该信号会导致整个进程终止,而非仅仅影响到产生问题的那个线程。换句话说,没有所谓的系统直接向其他线程发送相同的信号来“干掉”它们,而是进程的终止间接导致了所有线程的结束。


(5)系统如何干掉同进程下的所有线程?

是按照线程组为单位杀死线程的。

在进程里存在线程组的概念,线程组中包含了本进程下的所有线程,而线程组的ID值为TGID。主线程(也就是第一个启动的线程)的TID等于该线程组的TGID。当某个线程触发某些异常情况导致系统发送致命信号给此进程时,在进程退出前,系统会以线程组为单位,将属于该进程的所有线程一并清除并退出。这样做确保了整个进程要么完全运行,要么彻底停止,有效地避免了由于部分线程残留可能引发的问题。



(6)有没有发送给线程的信号

确实存在可以发送给线程的信号,但这种情况与发送给进程的信号有所不同。在Unix/Linux系统中,信号通常被设计为发送给整个进程。然而,随着多线程编程的发展,也引入了对特定线程发送信号的能力。

发送给线程的信号

  • pthread_kill() 函数:在支持POSIX线程(pthreads)的系统中,可以使用pthread_kill()函数向特定的线程发送信号。这允许程序对特定线程进行更加精细的控制。例如,可以通过这种方式来中断一个长时间运行的线程而不影响整个进程。

  • 线程特定信号处理:当信号发送到特定线程时,只有目标线程会调用其注册的信号处理程序。这意味着可以在不影响其他线程的情况下单独处理某个线程中的异常情况或其他需要关注的状态变化。

综上所述,虽然大多数情况下讨论的信号都是以进程为中心的,但在多线程环境中,确实也有直接发送给特定线程的信号,并且这种机制提供了更细粒度的控制能力。



4、线程用途

  • 合理的使用多线程,能提高CPU密集型程序的执行效率
  • 合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)

相关文章:

【Linux系统】线程:线程的优点 / 缺点 / 超线程技术 / 异常 / 用途

1、线程的优点 创建和删除线程代价较小 创建一个新线程的代价要比创建一个新进程小得多,删除代价也小。这种说法主要基于以下几个方面: (1)资源共享 内存空间:每个进程都有自己独立的内存空间,包括代码段…...

HTML 复习

文章目录 路径问题标题标签段落标签换行标签列表标签<ol> 有序列表<ul> 无序标签标签嵌套 超链接标签多媒体标签<img> 图片标签<audio> 音频标签<video> 视频标签 表格标签<colspan> 跨行<rowspan> 跨列组合使用 表单标签基本表单标…...

网络爬虫学习:借助DeepSeek完善爬虫软件,增加停止任务功能

一、引言 我从24年11月份开始学习网络爬虫应用开发&#xff0c;经过2个来月的努力&#xff0c;终于完成了开发一款网络爬虫软件的学习目标。这几天对本次学习及应用开发进行一下回顾总结。前面已经发布了两篇日志&#xff1a; 网络爬虫学习&#xff1a;应用selenium从搜*狐搜…...

【数据结构】单向链表(真正的零基础)

放弃眼高手低&#xff0c;你真正投入学习&#xff0c;会因为找到一个新方法产生成就感&#xff0c;学习不仅是片面的记单词、学高数......只要是提升自己的过程&#xff0c;探索到了未知&#xff0c;就是学习。 目录 一.链表的理解 二.链表的分类&#xff08;重点理解&#xf…...

8. k8s二进制集群之Kubectl部署

创建kubectl证书请求文件生成admin证书文件复制admin证书到指定目录生成kubeconfig配置文件接下来完成kubectl配置文件的角色绑定【扩展】kubectl命令补全操作继续上一篇文章《k8s二进制集群之Kube ApiServer部署》下面介绍一下k8s中的命令行管理工具kubectl。 通过kubectl可以…...

115,【7】 攻防世界 web fileinclude

进入靶场 试着访问了几个文件&#xff0c;都没得到信息&#xff0c;f12看看源码 还真有 <?php // 检查是否开启了错误显示功能 // ini_get 函数用于获取 PHP 配置选项的值&#xff0c;这里检查 display_errors 选项是否开启 if( !ini_get(display_errors) ) {// 如果错误…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)

接上篇&#xff1a;《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》 链接 文章目录 4.安装RabbitMQ Messaging Topology Operator 裸金属环境部署RabbitMQ部署单实例部署集群 4.安装RabbitMQ Messaging Topology Operator 使用 cer…...

【MySQL】MySQL经典面试题深度解析

文章目录 一、MySQL与C的深度结合1.1 为什么C项目需要MySQL&#xff1f;1.2 典型应用场景 二、基础概念面试题精讲2.1 存储引擎对比2.2 索引原理 三、C专项面试题解析3.1 连接池实现3.2 预处理语句3.3 批量操作优化 四、高级应用面试题剖析4.1 事务隔离级别4.2 锁机制详解4.3 查…...

小程序-基础加强

前言 这一节把基础加强讲完 1. 导入需要用到的小程序项目 2. 初步安装和使用vant组件库 这里还可以扫描二维码 其中步骤四没什么用 右键选择最后一个 在开始之前&#xff0c;我们的项目根目录得有package.json 没有的话&#xff0c;我们就初始化一个 但是我们没有npm这个…...

vscode+CMake+Debug实现 及权限不足等诸多问题汇总

环境说明 有空再补充 直接贴两个json tasks.json {"version": "2.0.0","tasks": [{"label": "cmake","type": "shell","command": "cmake","args": ["../"…...

零基础Vue入门6——Vue router

本节重点&#xff1a; 路由定义路由跳转 前面几节学习的都是单页面的功能&#xff08;都在专栏里面https://blog.csdn.net/zhanggongzichu/category_12883540.html&#xff09;&#xff0c;涉及到项目研发都是有很多页面的&#xff0c;这里就需要用到路由&#xff08;vue route…...

【疑海破局】一个注解引发的线上事故

【疑海破局】一个注解引发的线上事故 1、问题背景 在不久前一个阳光明媚的上午,我的思绪正在代码中游走、双手正在键盘上飞舞。突然,公司内部通讯工具上,我被拉进了一个临时工作群,只见群中产品、运营、运维、测试等关键人员全部严阵以待,我就知道大的可能要来了。果不其…...

C语言:函数栈帧的创建和销毁

目录 1.什么是函数栈帧2.理解函数栈帧能解决什么问题3.函数栈帧的创建和销毁的过程解析3.1 什么是栈3.2 认识相关寄存器和汇编指令3.3 解析函数栈帧的创建和销毁过程3.3.1 准备环境3.3.2 函数的调用堆栈3.3.3 转到反汇编3.3.4 函数栈帧的创建和销毁 1.什么是函数栈帧 在写C语言…...

IDEA启动项目慢问题处理

IDEA启动项目慢问题处理 一、问题现象二、问题排查排查点1&#xff1a;idea内存排查点2&#xff1a;应用内存排查点3&#xff1a;shorten command lineclasspath filejar manifest 排查点4&#xff1a;jstack排查 三、问题定位 一、问题现象 多模块工程&#xff0c;启动模块为…...

Denavit-Hartenberg DH MDH坐标系

Denavit-Hartenberg坐标系及其规则详解 6轴协作机器人的MDH模型详细图_6轴mdh-CSDN博客 N轴机械臂的MDH正向建模&#xff0c;及python算法_mdh建模-CSDN博客 运动学3-----正向运动学 | 鱼香ROS 机器人学&#xff1a;MDH建模 - 哆啦美 - 博客园 机械臂学习——标准DH法和改进MDH…...

Unity 快速入门 1 - 界面操作

本项目将快速介绍 Unity 6的基本操作和功能&#xff0c;下载附件的项目&#xff0c;解压到硬盘&#xff0c;例如 D:\Unity Projects\&#xff0c; 注意整个文件路径中只有英文、空格或数字&#xff0c;不要有中文或其他特殊符合。 1. 打开Unity Hub&#xff0c;点击右上角的 O…...

美国网络司令部军事网络指挥框架战略转型与挑战分析

文章目录 前言一、框架核心内容&#xff1a;从分散到集中&#xff0c;构建标准化作战体系二、指挥体系重构&#xff1a;权责明晰与集中化管控三、风险管理创新&#xff1a;从被动防御到主动备战四、对美军网络作战的影响总结 前言 2024年9月&#xff0c;美国网络司令部发布《国…...

9-收纳的知识

[ComponentOf(typeof(xxx))]组件描述&#xff0c;表示是哪个实体的组件 [EntitySystemOf(typeof(xxx))] 系统描述 [Event(SceneType.Demo)] 定义事件&#xff0c;在指定场景的指定事件发生后触发 [ChildOf(typeof(ComputersComponent))] 标明是谁的子实体 [ResponseType(na…...

Linux 压缩打包

Linux压缩打包 文章目录 Linux压缩打包压缩的意义和原理压缩的意义压缩的原理压缩与解压缩的好处压缩打包命令.zipzip 命令用法unzip 的用法.gzgzip 的用法gunzip 的用法.bz2bzip2 的用法bunzip2 的用法.xzxz 命令用法tar04-Linux压缩打包课后习题压缩的意义和原理 压缩的意义…...

排序算法--堆排序

堆排序是一种高效的排序算法&#xff0c;适合大规模数据排序&#xff0c;尤其适用于需要实时获取最大&#xff08;或最小&#xff09;值的场景。 // 交换两个元素的值 void swap(int* a, int* b) {int temp *a;*a *b;*b temp; }// 调整堆&#xff0c;使其满足堆的性质 void …...

51c视觉~CV~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/13241694 一、CV创建自定义图像滤镜 热图滤镜 这组滤镜提供了各种不同的艺术和风格化光学图像捕捉方法。例如&#xff0c;热滤镜会将图像转换为“热图”&#xff0c;而卡通滤镜则提供生动的图像&#xff0c;这些图像看起来…...

【数据结构】(6) LinkedList 链表

一、什么是链表 1、链表与顺序表对比 不同点LinkedListArrayList物理存储上不连续连续随机访问效率O(N)O(1&#xff09;插入、删除效率O(1)O(N) 3、链表的分类 链表根据结构分类&#xff0c;可分为单向/双向、无头结点/有头节点、非循环/循环链表&#xff0c;这三组每组各取…...

使用 Axios 获取用户数据并渲染——个人信息设置

目录 1. HTML 部分&#xff08;前端页面结构&#xff09; HTML 结构解析&#xff1a; 2. JavaScript 部分&#xff08;信息渲染逻辑&#xff09; JavaScript 解析&#xff1a; 3. 完整流程 4. 总结 5. 适用场景 本文将介绍如何通过 Axios 从服务器获取用户信息&#xff0…...

【hudi】基于hive2.1.1的编译hudi-1.0.0源码

hudi版本1.0.0 需要使用较低版本的hive&#xff0c;编译hudi只需要修改下类即可&#xff1a; org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat 一、复制org.apache.hadoop.hive.common.StringInternUtils 找个hive2.3.9的源码包&#xff0c;创建包路径&#xff0c…...

物联网领域的MQTT协议,优势和应用场景

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;作为轻量级发布/订阅协议&#xff0c;凭借其低带宽消耗、低功耗与高扩展性&#xff0c;已成为物联网通信的事实标准。其核心优势包括&#xff1a;基于TCP/IP的异步通信机制、支持QoS&#xff08;服务质量&…...

MyBatis 调优指南:释放持久层性能潜力

MyBatis 作为一款优秀的持久层框架&#xff0c;以其灵活性和易用性深受开发者喜爱。然而&#xff0c;随着应用规模扩大和数据量增长&#xff0c;MyBatis 的性能问题也逐渐显现。本文将深入探讨 MyBatis 调优策略&#xff0c;帮助您释放持久层性能潜力。 一、 SQL 语句优化 避免…...

Unity扩展编辑器使用整理(一)

准备工作 在Unity工程中新建Editor文件夹存放编辑器脚本&#xff0c; Unity中其他的特殊文件夹可以参考官方文档链接&#xff0c;如下&#xff1a; Unity - 手册&#xff1a;保留文件夹名称参考 (unity3d.com) 一、菜单栏扩展 1.增加顶部菜单栏选项 使用MenuItem&#xff…...

注册中心不知选哪个?Zookeeper、Eureka、Nacos、Consul和Etcd 5种全方位剖析对比

本文给大家讲解 5 种常用的注册中心&#xff0c;对比其流程和原理&#xff0c;无论是面试还是技术选型&#xff0c;都非常有帮助。 对于注册中心&#xff0c;在写这篇文章前&#xff0c;我其实只对 ETCD 有比较深入的了解&#xff0c;但是对于 Zookeeper 和其他的注册中心了解甚…...

Windows下怎么安装FFFmpeg呢?

在Windows下使用Open-webui报错&#xff0c;说Couldnt find ffmpeg or avconv,解决open-webui报错Couldn‘t find ffmpeg or avconv-CSDN博客于是尝试解决问题&#xff0c;那么Windows下怎么安装FFFmpeg呢&#xff1f; 尝试了两种方法。 第一种方法pip安装&#xff08;失败&…...

CSS 基础:层叠、优先级与继承

CSS 基础&#xff1a;层叠、优先级与继承 一、层叠&#xff08;Cascade&#xff09;示例&#xff1a;层叠的顺序 二、优先级&#xff08;Specificity&#xff09;优先级规则示例&#xff1a;优先级的比较 三、继承&#xff08;Inheritance&#xff09;哪些属性会被继承&#xf…...

《翻转组件库之发布》

背景 继《翻转组件库之打包》_杨晓风-linda的博客-CSDN博客之后&#xff0c;组件库已经可以正常构建&#xff0c;那如何像elementUI等组件库那样&#xff0c;用npm安装&#xff0c;按照既定的用法使用即可呢&#xff1f;本篇便为你揭晓 资料相关 1、npm官方文档&#xff1a;…...

Spring Boot + Spring AI快速体验

Spring AI快速体验 1 什么是Spring AI 主要功能 2 快速开始 2.1 版本说明2.2 配置文件2.3 pom依赖 2.3.1 spring maven仓库2.3.2 核心依赖 2.4 定义ChatClient2.5 启动类2.6 测试 3 参考链接 1 什么是Spring AI Spring AI是Spring的一个子项目&#xff0c;是Spring专门面向于…...

windows linux常用基础命令

windows基础命令 cd …/ &#xff08;访问D盘 直接D: 进入目录cd…\baidudu) color 2 改变颜色 dir 浏览当前目录中有什么内容 例如 dir windows可以浏览windows中有什么文件 cls 清屏 cd windows 可以跳转到c盘目录的下面 cd…/可以返回到上一级目录 ./当前目录 cd \ 直…...

ZooKeeper单节点详细部署流程

ZooKeeper单节点详细部署流程 文章目录 ZooKeeper单节点详细部署流程 一.下载稳定版本**ZooKeeper**二进制安装包二.安装并启动**ZooKeeper**1.安装**ZooKeeper**2.配置并启动**ZooKeeper** ZooKeeper 版本与 JDK 兼容性3.检查启动状态4.配置环境变量 三.可视化工具管理**Zooke…...

【AI日记】25.02.06

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛&#xff1a;Backpack Prediction Challenge 读书 书名&#xff1a;理解公司&#xff1a;产权、激励与治理作者&#xff1a;张维迎下图感想&#xff1a;哲学家、思想家比如卢梭…...

税费学习之:附加税费

好的&#xff01;我将从 **税收本质、历史沿革、用途逻辑、企业影响** 四个维度综合分析&#xff0c;用项目管理中的实际场景说明为什么需要缴纳附加税费。 --- ### **一、附加税费的本质与构成** #### **1. 定义** 附加税费是 **以增值税、消费税为基数征收的附加税**&…...

数据库开发常识(10.6)——SQL性能判断标准及索引误区(1)

10.6. 数据库开发常识 作为一名专业数据库开发人员,不但需要掌握数据库开发相关的语法和功能实现,还要掌握专业数据库开发的常识。这样,才能在保量完成工作任务的同时,也保质的完成工作任务,避免了为应用的日后维护埋下性能和稳定性方面的隐患。可遗憾的是,现实中,很大…...

网络原理一>数据链路层协议->以太网协议

目录 以太网协议的结构&#xff1a;类型&#xff1a;ARP请求应答报文&#xff1a;CRC&#xff1a;MTU: 为什么需要mac地址&#xff1a;mac地址和IP地址的区别&#xff1a; 以太网协议的结构&#xff1a; 以太网是数据链路层和物理层的主要协议 源IP&#xff0c;目的IP就不多说…...

Android 约束布局ConstraintLayout整体链式打包居中显示

Android 用约束布局ConstraintLayout实现将多个控件视作一个整体居中显示&#xff0c;使用 app:layout_constraintHorizontal_chainStyle"packed"实现 chain 除了链条方向有横向和竖向区分外&#xff0c; chain链条上的模式有 3种 spread - 元素将被展开&#…...

云计算行业分析

云计算作为数字经济的核心基础设施&#xff0c;未来十年将持续重塑全球科技格局&#xff0c;并渗透到几乎所有行业的数字化转型中。 一、云计算的发展潜力 1. 技术融合驱动爆发式创新 AI与云计算的深度耦合 - **智能云服务**&#xff1a;云厂商将提供预训练模型、自动化ML工…...

深入浅出DeepSeek LLM 以长远主义拓展开源语言模型

深入浅出地讲解DeepSeek LLM 以长远主义拓展开源语言模型 &#x1f31f; 1. 什么是 DeepSeek LLM&#xff1f; 大家想象一下&#xff0c;你在游戏里要打造一个超级英雄角色&#xff0c;选择最强的装备、技能点和升级策略。那么&#xff0c;DeepSeek LLM 就是 AI 界的“超级英雄…...

用Python获取股票数据并实现未来收盘价的预测

获取数据 先用下面这段代码获取上证指数的历史数据&#xff0c;得到的csv文件数据&#xff0c;为后面训练模型用的 import akshare as ak import pandas as pd# 获取上证指数历史数据 df ak.stock_zh_index_daily(symbol"sh000001")# 将数据保存到本地CSV文件 df.…...

[openwrt]openwrt slaac only模式下部分终端无法获取到IPv6 DNS

问题描述 OpenWrt 中,如果启用了 RA 单播(ra_unicast),但部分终端无法获取到 DNS 信息 问题分析 RA 单播的局限性 并非所有终端都完全支持通过单播接收 RA 消息。部分终端可能无法正确解析单播 RA 中的 RDNSS(Recursive DNS Server)选项,从而导致无法获取 DNS 信息。终…...

【redis】数据类型之list

Redis的List数据类型是一个双向链表&#xff0c;支持在链表的头部&#xff08;left&#xff09;和尾部&#xff08;right&#xff09;进行元素的插入&#xff08;push&#xff09;和弹出&#xff08;pop&#xff09;操作。这使得List既可以用作栈&#xff08;stack&#xff09;…...

电脑连接wifi但是浏览器打开不了网页,使用手机热点能正常使用

电脑连接wifi但是浏览器打开不了网页&#xff0c;使用手机热点能正常使用 打开控制面板 打开网络和Internet&#xff08;查看网络状态和任务&#xff09; 点击更改适配器设置 双击WLAN 点击属性并双击打开Internet 协议版本4&#xff08;TCP/IPv4&#xff09; 将自动…...

el-table中的某个字段最多显示两行,超出部分显示“...详情”,怎么办

文章目录 背景需求需求分析 解决方案在线体验灵感来源我的实现方案 总结 背景 需求 比如&#xff0c;有如下一个表格&#xff0c;请你实现它&#xff1a; 要求&#xff1a; 最多显示两行超出部分显示为&#xff1a;“…详情”点击详情&#xff0c;展开全部内容 说明&#x…...

Vue el-input密码输入框 按住显示密码,松开显示*;阻止浏览器密码回填,自写密码输入框;校验输入非汉字内容;文本框聚焦到内容末尾;

输入框功能集合 <template><div style"padding: 10px"><!-- 密码输入框 --><el-input:type"inputType"v-model"password"placeholder"请输入密码"auto-complete"new-password"id"pwd"style…...

尚硅谷课程【笔记】——大数据之Shell【一】

课程视频&#xff1a;【【尚硅谷】Shell脚本从入门到实战】 一、Shell概述 为什么要学习Shell&#xff1f; 1&#xff09;需要看懂运维人员的Shell程序 2&#xff09;偶尔编写一些简单的Shell程序来管理集群、提高开发效率 什么是Shell&#xff1f; 1&#xff09;Shell是一…...

4年测试|20-30K|金山办公|大模型测开3轮面经

一面时间&#xff1a;面试时长一小时左右 二面时间&#xff1a;面试时长基本满一小时 HR面时间&#xff1a;面试流程上全部结束了&#xff0c;内容如下&#xff1a; 前言&#xff1a; 岗位&#xff1a;自己想投递base珠海&#xff0c;金山办公的HR捞了下。why choose Zhuha…...

【负载均衡式在线OJ】实现负载均衡

目录 管理服务器 增加负载 && 减少负载 重置负载 && 获得负载 负载均衡 添加配置信息 什么是负载均衡 如何实现&#xff1f; 管理服务器 增加负载 && 减少负载 客户端访问一次服务器&#xff0c;负载就加1。客户端结束访问服务器&#xff0c;…...