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

【Linux】进程状态、优先级、切换和调度

目录

一、传统操作系统进程状态

(一)什么是状态

(二)运行状态

(三)阻塞状态

(四)挂起状态

二、Linux进程状态

(一)进程状态

(二)查看进程状态

        (1)僵尸进程

        (2)孤儿进程

三、进程PCB如何管理链表

四、进程优先级

(一)查看系统进程

五、进程切换

(1)为什么nice值是【-20,19】

(2)为什么bitmap大小是5?


正文

一、传统操作系统进程状态

下面所讲状态虽然标题是传统操作系统进程状态,但整体也会以Linux为例进行讲解

(一)什么是状态

【结论:状态就是一个数】

学操作系统时,相信大家都见过以下图片吧!

上图,操作系统中有那么多状态,所以状态到底是什么?

举个例子:我们也有多种状态,比如:学习状态、游戏状态、吃饭状态....这些状态决定我们当下在干什么。

同理,操作系统状态也决定进程接下来要做什么工作(运行进程为运行状态...)而系统进行状态的切换是通过#define定义如宏1:运行、宏2:结束、宏3.....的整型宏值进行切换,改变宏值就在改变状态

(二)运行状态

【结论:并不是运行起来的进程才是运行状态,进程只要在CPU调度队列中就是运行状态】

根据冯诺依曼体系结构规定,操作系统资源本质就外设资源(IO密集型)和CPU资源(计算密集型),资源有限需求无限,必定存在资源竞争。

之前文章讲过:进程=PCB+代码数据

当多个进程同时申请资源运行时,其实CPU内部都有一个调度队列,把每个进程的PCB 放到调度队列中排队,随时等待CPU调度执行就叫做运行状态

(三)阻塞状态

【结论:将进程PCB连入不同队列中,对应更改其状态属性】

众所周知,操作系统是管理软硬件资源的软件,而我们除了访问软件资源外也需要访问硬件资源(麦克风、键盘、磁盘....)当进程要访问硬件资源时同样也有一个硬件等待队列。

当CPU通过调度队列执行到某个进程时,发现它的硬件资源还没准备就绪(比如键盘还未就绪)这是将原本调度队列的PCB放入到等待队列中,等硬件准备好了再放回去调度队列中设置为运行状态这一行为称为阻塞运行状态。

所以进程状态变化本质是:在不同队列进行流动,也就是对链表的增删改。

(四)挂起状态

【内存空间严重不足,将内存中进程的代码和数据置换到磁盘的行为叫挂起状态】

分为阻塞挂起状态就绪挂起状态

阻塞挂起状态:(等硬件时内存空间不足数据被置换出去)

每个进程运行时都要把PCB、代码和数据加载到内存中。当同时调用外设,外设没准备好,此时PCB到硬件等待队列中去排队,而进程的代码和数据还在内存中。内存的空间是有限的,当内存空间严重不足时,内存检测到你PCB还在排队而数据和代码在占用空间,就会通过swap out 接口将进程的数据和代码置换到磁盘中一块swap分区中,等硬件准备好了再通过swap in接口把代码数据置换回CPU中运行。

就绪挂起:在运行队列中等待运行,内存空间不足,将对应PCB的数据被置换到磁盘swap分区中

二、Linux进程状态

区分Linux进程状态和传统操作系统进程状态是因为:Linux中的进程状态和操作系统有一点点区别,比如运行状态在Linux中是用大写R表示,某些状态在Linux中有更细的划分或换了一种说法。

Linux中的状态并没有一开始看到的系统状态图中那么多:

下图是Linux源码中的状态表示:

(一)进程状态

R运⾏状态(running): 并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏
队列⾥。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这⾥的睡眠有时候也叫做可中断睡眠 )对应系统中的阻塞状态。
D磁盘休眠状态(Disk sleep): 有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个
状态的进程通常会等待IO的结束。
T停⽌状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停⽌(T)进程。这个被暂停的
进程可以通过发送 SIGCONT 信号让进程继续运⾏。
X死亡状态(dead): 这个状态只是⼀个返回状态,我们不会在任务列表⾥看到这个状态。

(二)查看进程状态

命令:ps ajx |grep 进程名

上面写了一个死循环不断打印,下面查询进程状态时看到的是S+浅度休眠状态(阻塞状态)而不是R状态?

因为频繁的打印造成的,整个进程运行需要1秒,打印则只需要1纳秒。打印要访问硬件,你死循环般的写一定会让你写进去吗?所以就处于阻塞状态,你能在屏幕上看到输出是因为输出的只是一部分而已。外设太慢了,CPU很快就阻塞住了。把printf那句屏蔽就可以看到R状态!!

S+状态:+号表示前台进程,可以被“Ctrl+C”终止

同样可以造成阻塞状态的还有scanf,这阻塞要等我们手动输入。

T状态:在代码中打断点进行调试时进程出现TT状态,也就是暂停状态


(1)僵尸进程

进程=内核数据结构(PCB)+代码数据

Z结束状态:我们调用一个函数,当这个函数运行结束后会有返回值(一般0表示任务完成,其他则异常)进程本身也是一个任务,运行结束后我们必须知道它完成得怎么样,所以当它结束状态后必有返回值。

进程执行任务本质是:父进程通过fork创建子进程执行的,一个进程运行结束不能马上释放所有资源(代码数据释放了,但进程PCB数据还保留着,PCB里面有该进程的退出码——标志进程是否正常结束,异常结束又是什么原因终止的)所以必须由父进程读取退出码信息后再由系统结束掉,因此进程结束前先进入“僵尸状态”Z,方便父进程读取,等父进程读取后才能通知系统结束,若父进程一直不读就一直处于Z状态,最后内存泄漏。

父进程有没有僵尸状态?没有!!我们是看不到的,父进程结束由bash自动回收。

(2)孤儿进程

进程要想结束必须由父进程读取子进程的PCB,有没有可能出现父进程比子进程先结束呢?

答案是:存在的!那子进程怎么办?

父进程先退出,子进程就称之为“孤儿进程” 孤儿进程被1号进程领养确保子进程能正常结束,最后由1号进程回收PCB。

1号进程就是bash!!!

三、进程PCB如何管理链表

操作系统中有多个进程就有多个task_struct(PCB—描述进程的数据结构)构成一个双链表,task_struct是如何用双链表管理起来的呢?

数据结构双链表定义一个节点,如下图struct Node,里面包含各种变量和指向下一个/前一个节点的指针,他们指向的节点类型都是struct Node,且指向每个节点的起始位置。

在Linux中就有所不同。定义的节点类型不再包含其他数据,只有两个指针;task_struct结构体直接拿节点类型创建变量,没有再单独创建next和prev指针变量。而next指针不再指向整个task_struct结构体的起始位置,而是指向下一个node成员的next。

由上图可知,我们可以知道task_struct结构体内部任意一个成员的起始地址和结构体类型,问题:1.如何得到该结构体的起始位置;2.如何访问该结构体变量内部任意一个属性?

以我们最常用的数组举例,只知道数组中的一个元素我们是如何访问到首元素的呢?其实是当前位置减去首元素到当前位置的偏移量,而数组的地址是从低到高逐渐增加,对其取地址得到的是地址中最小的字节地址,而类型则决定一次访问多少个字节,所以也就可以算出偏移量。

因此,假设我们知道struct test中一个元素c的位置,通过公式“&c - &((struct test*)0 -> c)”就能使指针指向整个结构体开头,这样知道任意一个成员的起始地址和结构体类型就可以访问任意变量。

&((struct test*)0 -> c):计算c变量在结构体中的偏移量。

Linux中链表这么管理的好处是:

(1)我们实现的双链表再与类型无关。也就是不管是不是task_struct结构体,我们可以把节点struct Node连入任何结构体中(像队列、红黑树...)

(2)当task_struct结构体中不止一个Node节点,Node节点可以既属于全局双链表,也可以同时属于其他数据结构(比如队列就可以实现两种数据结构:数组形式和链表形式),回归系统状态,也就是由于进程PCB中有多个节点,PCB可以在全局双链表中存放也可以同时在调度队列中排队,看似进程有两个PCB其实是一个!!而全局双链表中还没连入调度队列的进程PCB在Linux中称为:新建状态(就绪状态)

四、进程优先级

【进程得到某种资源的先后顺序】

操作系统的资源有限,我们的需求无限!在一对多的情况下要得到某种资源需要区分先后顺序。

优先权⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤,可以改善系统性能。 还可以把进程运⾏到指定的CPU上,这样⼀来,把不重要的进程安排到某个CPU,可以大改善系统整体性能。(优先级不等于权限

(一)查看系统进程

在linux系统中,⽤ps ‒l命令则会类似输出以下⼏个内容:

我们很容易注意到其中的几个重要信息,有下:

  • UID:代表执行者的身份
  • PID:代表这个进程的代号
  • PPID:代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI:代表这个进程可被执行的优先级,其值越小越早被执行(默认是80)
  • NI:代表这个进程的nice值

1.1 PRI and NI
PRI也是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高

那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值

PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice

这样,当nice值为负值的时候,那么该进程将会优先级值将变小,即其优先级会变高,则其越快被执行

所以,调整进程优先级,在Linux下,就是调整进程nice值

nice其取值范围是【-20,19】,一共40个级别。

1.2 PRI vs NI

需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。可以理解nice值是进程优先级的修正数据

1.3 用top命令更改已存在进程的nice

  • top
  • 进入top后按“r”->输入进程PID->输入nice值

1.3 补充概念-竞争、独立、并行、并发

独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。

并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行(在该进程的时间片内运行下一个进程)。

并发: 多个进程在⼀个CPU下采⽤进程切换的方式,在⼀段时间之内让多个进程同时推进,称之为并发。

五、进程切换

CPU上下文切换:其实际含义是任务切换, 或者CPU寄存器切换。当多任务内核决定运行另外的任务时, 它保存正在运⾏任务的当前状态, 也就是CPU寄存器中的全部内容。这些内容被保存在任务自己的堆栈中, ⼊栈工作完成后就把下⼀个将要运行的任务的当前状况从该任务的栈中重新装⼊CPU寄存器,并开始下⼀个任务的运行, 这⼀过程就是context switch。

CPU内寄存器就是一套存储空间,寄存器只有一套,属于CPU本身,但寄存器内的数据可以有很多。当前系统都是分时系统,每个进程都有自己的时间片。

当进程A暂时被切换下来时,需要进程A顺便带走并保存自己的上下文数据!!目的就是为了下次回来的时候能恢复,便能按照之前的逻辑继续向后运行。

六、进程调度

进程调度和状态、优先级有莫大关系!

以下是Linux2.6内核中完整版进程0(1)调度队列:

在接下来的图片描述中,大家看到的调度队列是我依照完整版画的简单版调度队列,只保留会用到的一些成员。


一个CPU,一个运行队列;多个CPU,多个运行队列。

在运行队列中有个queue[140]它指向一个下标从【0-139】的数组。其中【0-99】表示实时操作系统,先不用管;【100-139】这40个下标表示分时操作系统也就是我们现在用的系统。

(1)为什么nice值是【-20,19】

Linux的进程优先级本身就有范围【60,99】,这个范围刚好也是40,难道和队列中【100-139】的40个下标一样是巧合吗?肯定不是巧合!!!

之所以优先级设置范围【60,99】是因为【60+40,99+40】对应的就是【100-139】下标。nice值是【-20,19】也是因为默认进程优先级(PRI):80+(-20)+40=100,80+19+40=139,一一对应数组【100-139】下标,所以通过更改nice来改变进程优先级。

所以CPU调度直接去queue数组中遍历【100-139】下标,从上往下遍历有进程就执行进程,操作系统觉得这样太慢了于是有了bitmap[5]数组,这是一个位图(每个bit位映射到数组下标表示第几个队列,bit位内容0/1表示该队列是否为空)所以当我们要执行进程时通过位图替换遍历数组操作更高效。

(2)为什么bitmap大小是5?

1byte=32bit,数组【0-139】大小140,4*32=128<140(不够),5*32=160>140(可以)

我们可以把下图三个元素看做一个结构体struct q,这样队列中有struct q[2],分别对应图中array[0]和array[1]。而调度队列中还定义了两个指针active(活跃队列指针)和expired(过期队列指针)指向两个结构体。

所以:CPU调度时直接从active指针找整个结构体,拿到queue[140]再通过位图查找去调度进程。

新进程和时间片到了从CPU剥离下来的进程只能重新入队列,入的是过期队列!

通过nice值更改优先级的进程,本次执行按原本优先级执行,执行完后按更改后的优先级连入过期队列。(不存在饥饿问题)

一旦active没有进程了,那么swap(&activ,&expired)交换两个指针内容。那么下轮CPU调度时接着从active指针找整个结构体然后按步骤执行。


相关文章:

【Linux】进程状态、优先级、切换和调度

目录 一、传统操作系统进程状态 &#xff08;一&#xff09;什么是状态 &#xff08;二&#xff09;运行状态 &#xff08;三&#xff09;阻塞状态 &#xff08;四&#xff09;挂起状态 二、Linux进程状态 &#xff08;一&#xff09;进程状态 &#xff08;二&#xff…...

软件测试基础知识详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、黑盒测试、白盒测试、灰盒测试 1.1 黑盒测试 黑盒测试 又叫 功能测试、数据驱动测试 或 基于需求规格说明书的功能测试。该类测试注重于测试软件的功能性需…...

【WordPress博客AI内容辅助生成/优化工具箱插件下载无标题】

主要功能 AI内容生成/优化 使用AI模型生成或优化段落内容 支持撤销和模型切换 AI自动评论 智能分析文章内容生成相关评论 可配置的评论数量和随机调度 生成评论回复的概率(评论数>10时) 可能以特定概率包含表情符号 AI标签提取 从文章内容自动提取相关标签 新标签可自动生…...

js 画立方体软件开发日记2

我不懂但我大为震惊 重开几次又回去了 这说明之前的操作无效 搞了个调试当前文件 导出模块有问题&#xff0c;跑显示没事 启动太慢&#xff0c;重构吧 ----------------------------------------------- 把那些鬼相机投影代码删了就有4s了 按钮全删了&#xff0c;还是卡&…...

element plus el-table多选框跨页多选保留

一、基础多选配置 通过 type“selection” 开启多选列&#xff0c;并绑定 selection-change 事件获取选中数据 <template><el-table :data"tableData" selection-change"handleSelectionChange"><el-table-column type"selection&qu…...

智能家居“心脏“升级战:GD25Q127CSIG国产芯片如何重构家庭物联生态

在智能家居设备出货量突破10亿台的2023年&#xff0c;家庭网关正经历着前所未有的技术革新。作为连接云端与终端设备的中枢神经&#xff0c;智能网关的存储芯片选择直接决定着整个智能生态系统的运行效率。在这场技术升级浪潮中&#xff0c;兆易创新GD25Q127CSIG串行闪存芯片主…...

智能枪弹柜管理系统|智能枪弹柜管理系统LK-QDG-Q20型

是一种用于存放枪支弹药的智能化设备&#xff0c;主要应用于涉枪单位&#xff0c;以下将从其功能特点、系统组成、优势等维度展开介绍&#xff1a; 功能特点 身份识别功能&#xff1a;采用多种生物识别技术&#xff0c;如指纹识别、指静脉识别、虹膜识别、人脸识别、声纹识别等…...

bootstrap table 添加跳转到指定页的功能(仅自己可见)

Table回调方法中&#xff0c;添加input和button至Table下方&#xff08;Table页渲染结束后执行&#xff09; &#xff08;input用来输入页码&#xff0c;button执行跳转&#xff09; function ajaxRequestExtends(data){$(".page-list").append("<input idp…...

rufus+Ubuntu 18.04 镜像

参考&#xff1a;https://blog.csdn.net/Li060703/article/details/106075597 Rufus 官网&#xff1a; https://rufus.ie/zh/ 步骤 安装U盘做好后插在主板io的USB口上&#xff0c;启动阶段用F2或DEL打断进bios&#xff0c;bios里面指定从安装U盘来启动&#xff0c;里面的B…...

基于事件驱动和策略模式的差异化处理方案

一、支付成功后事件驱动 1、支付成功事件 /*** 支付成功事件** author ronshi* date 2025/5/12 14:40*/ Getter Setter public class PaymentSuccessEvent extends ApplicationEvent {private static final long serialVersionUID 1L;private ProductOrderDO productOrderDO;…...

【运维】MacOS蓝牙故障排查与修复指南

在日常使用macOS系统过程中&#xff0c;蓝牙连接问题时有发生。无论是无法连接设备、连接不稳定还是蓝牙功能完全失效&#xff0c;这些问题都会严重影响我们的工作效率。本文将分享一些实用的排查方法和修复技巧&#xff0c;帮助你解决macOS系统上的蓝牙故障。 问题症状 常见…...

linux小主机搭建自己的nas(三)docker安装nextcloud

小主机用的TF卡&#xff0c;不可能把nas的数据放在卡上&#xff0c;所以我买了个2T的移动硬盘 1.挂载移动硬盘 查找硬盘 lsblk # 或 fdisk -l 创建挂载点 sudo mkdir -p alon_ssd 查看硬盘文件系统,文件系统类型一会儿设置挂载用 sudo blkid /dev/sda1 开机自动挂载&…...

Go语言:json 作用和语法

在 Go 语言中&#xff0c;JSON 字段&#xff08;也称为 JSON Tag&#xff09;是附加在结构体字段上的元数据&#xff0c;用于控制该字段在 JSON 编码&#xff08;序列化&#xff09;和解码&#xff08;反序列化&#xff09; 时的行为。它的语法是&#xff1a; type StructName…...

mageia系统详解

Mageia 是一个由社区驱动的 Linux 发行版&#xff0c;源自 Mandriva Linux&#xff08;原 Mandrake Linux&#xff09;&#xff0c;以用户友好性和强大的系统工具著称。它继承了 Mandriva 的易用性传统&#xff0c;同时专注于稳定性和社区协作。以下从历史背景、技术架构、系统…...

六、STM32 HAL库回调机制详解:从设计原理到实战应用

STM32 HAL库回调机制详解&#xff1a;从设计原理到实战应用 一、回调机制的本质与设计目标 在STM32 HAL库中&#xff0c;回调机制是实现异步事件处理的核心设计模式。它通过弱定义函数用户重写的方式&#xff0c;将硬件事件&#xff08;如数据传输完成、定时器溢出等&#xf…...

USB传输模式

USB有四种传输模式: 控制传输, 中断传输, 同步传输, 批量传输 1. 中断传输 中断传输一般用于小批量, 非连续的传输. 对实时性要求较高. 常见的使用此传输模式的设备有: 鼠标, 键盘等. 要注意的是, 这里的 “中断” 和我们常见的中断概念有差异. Linux中的中断是设备主动发起的…...

lenis滑动插件的笔记

官网 lenis - npm 方法一&#xff1a;基础判断&#xff08;推荐&#xff09; 通过 Lenis 自带的 scroll 和 limit 属性直接判断&#xff1a; const lenis new Lenis()// 滚动事件监听 lenis.on(scroll, ({ scroll, limit }) > {const distanceToBottom limit - scroll…...

【网络安全】SQL注入

如果文章不足还请各位师傅批评指正&#xff01; 想象一下&#xff0c;你经营着一家咖啡店&#xff0c;顾客可以通过店内的点单系统下单。这个系统会根据顾客的输入&#xff0c;向后厨发送指令&#xff0c;比如“为顾客A准备一杯拿铁”。 然而&#xff0c;如果有个不怀好意的顾客…...

window server 2012安装sql server2008 r2

执行sql server2008 r2安装目录下的setup 选择运行程序而不获取帮助 然后就是让人绝望的 只能先搞这个了&#xff0c;F*微软&#xff0c;自家软件不让正常安装 打开服务器管理器->添加角色和功能->选择Web 服务&#xff08;IIS&#xff09;->添加.NET Framework3.5 然…...

uni-app学习笔记五--vue3插值表达式的使用

vue3快速上手导航&#xff1a;简介 | Vue.js 模板语法 插值表达式 最基本的数据绑定形式是文本插值&#xff0c;它使用的是“Mustache”语法 (即双大括号)&#xff1a; <span>Message: {{ msg }}</span> 双大括号标签会被替换为相应组件实例中 msg 属性的值。同…...

RuoYi 中使用 PageUtils.startPage() 实现分页查询的完整解析

文章目录 一、PageHelper 简介与基本用法使用方式如下&#xff1a; 二、Mapper 接口返回类型对分页的影响1. 返回 Page<T> 类型&#xff08;推荐&#xff09;2. 返回 List<T> 类型&#xff08;不推荐&#xff09; 三、解析RuoYi 是如何使用 PageUtils.startPage()1…...

【番外】02:Windows 编译带 DNN_CUDA 功能的 OpenCV 动态链接库

文章目录 1. 环境准备2. 兼容性说明3. 算力查询4. 编译步骤5. 网盘资料 提示&#xff1a; 如果读者因网络环境受限&#xff0c;无法正常下载与本文相关的软件安装包、压缩包&#xff0c;以及编译时的依赖文件&#xff0c;可以从文章最后提供的网盘链接下载资源。 1. 环境准备 …...

Java详解LeetCode 热题 100(14):LeetCode 56. 合并区间(Merge Intervals)详解

文章目录 1. 题目描述2. 理解题目3. 解法一&#xff1a;排序 一次遍历法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景 4. 解法二&#xff1a;双指针法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 与解法一的比较 5. 解法三&#xff1a;TreeMa…...

回答 | 图形数据库neo4j社区版可以应用小型企业嘛?

刚在知乎上看到了一个提问&#xff0c;挺有意思&#xff0c;于是乎&#xff0c;贴到这里再简聊一二。 转自知乎提问 当然可以&#xff0c;不过成本问题不容小觑。另外还有性能上的考量。 就在最近&#xff0c;米国国家航空航天局——NASA因为人力成本问题&#xff0c;摒弃了使…...

2024年北理工Python123第六章测验题整理

测验题一般不会太难&#xff0c;但是这次的题目&#xff0c;未免太多了&#xff0c;有的还很难 一、选择题 二、编程题 1-10 列表和字符串 1-10都是和列表、字符串有关的题目&#xff0c;都很简单,我直接给出代码了 1.列表排序输出 import random random.seed(int(input()…...

常用的设计模式详解

常用的设计模式详解 在后端开发中&#xff0c;设计模式是提升代码可维护性、扩展性和灵活性的关键工具。通过合理应用设计模式&#xff0c;开发者能够高效解决复杂问题并优化系统架构。本文将结合实际案例&#xff0c;深入探讨后端开发中常用的设计模式及其核心应用场景。 一、…...

OFCMS代码审计-freemaker注入sql注入xxexss文件上传

环境搭建 下载地址&#xff1a;https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip SSTI模板注入&#xff08;freemaker) FreeMarker模板注入实现远程命令执行 - Eleven_Liu - 博客园 在admin中找到这个 发现请求的是这个 找到他 <#assign value"f…...

python与nodejs哪个性能高

在一般的Web开发和高并发场景中&#xff0c;Node.js的性能通常优于Python&#xff0c;特别是在处理大量异步任务和实时应用时更具优势&#xff1b;而在数据分析、机器学习及计算密集型任务中&#xff0c;Python则表现出更高的性能优势。 Node.js以事件驱动的非阻塞I/O模型著称&…...

云平台管理部署知识点——问题+答案

1、在k8s 中定义副本数量的关键字是那个&#xff1f;处于那个模块下&#xff1f; 关键字&#xff1a;replicas 模块&#xff1a;spec下 2、在k8s中&#xff0c;有状态应用和无状态应用的区别&#xff1f;创建有状态和无状态应用分别使用哪种资源对象类型&#xff1f; &#…...

数据结构(六)——树和二叉树

一、树和二叉树的定义与存储 1.树的定义 树是一种非线性的数据结构&#xff0c;它是由n个有限结点组成有层次关系的集合 树具有以下特点&#xff1a; &#xff08;1&#xff09;每个结点具有0个或多个子结点 &#xff08;2&#xff09;每个子结点只有一个父结点 &#xff…...

基于构件的开发方法与传统开发方法的区别

在软件开发领域,基于构件的开发方法和传统开发方法有着截然不同的特点与应用效果,这些差异显著影响着项目的实施过程与最终成果。下面,我们将从多个关键维度展开对比分析。​ 一、开发模式:线性搭建与模块组装​ 传统开发方法遵循线性的、自顶向下的流程,就像搭建一座高楼…...

cursor对话关键词技巧

提示词基本结构与原则 一个好的 Cursor 提示词通常包含三个部分&#xff1a;目标说明 上下文信息 具体要求。 例如&#xff1a; 创建一个React登录组件&#xff0c;使用Tailwind CSS样式&#xff0c;需要包含邮箱验证功能和记住密码选项。 效果演示&#xff1a; 提示词的的…...

克隆虚拟机组成集群

一、克隆虚拟机 1. 准备基础虚拟机 确保基础虚拟机已安装好操作系统&#xff08;如 Ubuntu&#xff09;、Java 和 Hadoop。关闭防火墙并禁用 SELinux&#xff08;如适用&#xff09;&#xff1a; bash sudo ufw disable # Ubuntu sudo systemctl disable firewalld # CentO…...

添加购物车-02.代码开发

一.代码开发 购物车属于用户端功能&#xff0c;因此要在user下创建controller代码。 Controller层 package com.sky.controller.user;import com.sky.dto.ShoppingCartDTO; import com.sky.entity.ShoppingCart; import com.sky.result.Result; import com.sky.service.Shopp…...

2094. 找出 3 位偶数

from typing import Listclass Solution:def findEvenNumbers(self, digits: List[int]) -> List[int]:# 统计 digits 中每个数字&#xff08;0-9&#xff09;的出现次数。cnt [0] * 10for d in digits:cnt[d] 1ans []# i0 百位&#xff0c;i1 十位&#xff0c;i2 个位&a…...

外出充电不发愁,倍思便携式移动电源成出行新宠

电子设备已深度融入现代快节奏生活&#xff0c;成为出行必备。但随之而来的电量焦虑&#xff0c;却始终困扰着人们。无论是出差远行、户外探索&#xff0c;还是每日通勤&#xff0c;如何随时为设备充电&#xff0c;成了亟待解决的难题。倍思极客充伸缩数据线充电宝应运而生&…...

防火墙安全策略基础配置

拓朴图 设备基础配置 # AR1 路由器配置 [Huawei]interface GigabitEthernet0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 1.1.1.2 255.255.255.0 [Huawei]ip route-static 192.168.1.0 255.255.255.0 1.1.1.1# FW1 防火墙配置 [USG6000V1]sysname FW1 [FW1]interface Gigab…...

系统架构-通信系统架构设计

通信网络系统架构 局域网 单一机构所拥有的专用计算机网络 局域网从早期只提供二层交换功能的简单网络发展到现在&#xff0c;还提供三层路由功能的复杂网络 局域网的典型架构风格&#xff1a; 单核心架构&#xff1a;由一台核心二层或三层交换设备充当网络的核心设备&…...

2.3 定积分

一、数学定义与核心公式 核心思想&#xff1a; 定积分是通过无限细分区间、累加微小矩形面积来逼近曲边图形面积的数学工具。其本质是极限过程下的误差控制与动态平衡。 公式与符号解析&#xff1a; 表达式&#xff1a;定积分写作 ∫ₐᵇ f(x)dx&#xff0c;表示在区间 [a, …...

TCPIP详解 卷1协议 八 ICMPv4和ICMPv6 Internet控制报文协议

8.1——ICMPv4和ICMPv6 Internet控制报文协议 IP 协议本身并没有为终端系统提供直接的方法来发现那些发往目的地址失败的IP数据包。此外&#xff0c;IP 没有提供直接的方式来获取诊断信息&#xff08;例如&#xff0c;哪些路由器在沿途中被使用了或使用一种方法来估计往返时间…...

ik 分词器 设置自定义词典

进入 ES 的安装目录&#xff0c;进入 /elasticsearch-8.10.0/plugins/ik/config/ 文件夹目录&#xff0c;打开 IKAnalyzer.cfg.xml 文件进行配置。 一、添加 自定义扩展词典 扩展词&#xff1a;就是不想哪些词分开&#xff0c;让他们成为一个词&#xff0c;比如“蒙的全是对…...

RabbitMQ 工作模式

RabbitMQ 一共有 7 中工作模式&#xff0c;可以先去官网上了解一下&#xff08;一下截图均来自官网&#xff09;&#xff1a;RabbitMQ 官网 Simple P&#xff1a;生产者&#xff0c;要发送消息的程序&#xff1b;C&#xff1a;消费者&#xff0c;消息的接受者&#xff1b;hell…...

sqlmap使用入门

sqlmap加速了sql注入的发展&#xff0c;需要掌握6点&#xff0c;其一是--dbs获得数据库名称&#xff0c;其二是-D 数据库名称 --tables 获得数据库中的所有表名&#xff0c;其三是-D 数据库名 -T 表名 -C 字段1,字段2 --dump 获得数据库中的表中的字段的值&#xff0c;其四是-r…...

C++23 中的 views::stride:让范围操作更灵活

文章目录 什么是 views::stride语法与用法参数与返回值实现细节适用场景编译器支持总结 什么是 views::stride views::stride 是 C23 引入的一个范围适配器。它允许我们从一个范围中以固定步长提取元素&#xff0c;从而生成一个新的范围视图。具体来说&#xff0c;给定一个范围…...

OSI 7层模型

OSI 7层模型&#xff1a; 1、物理层&#xff08;光纤等把电脑连接起来的物理手段&#xff09; 2、数据链路层&#xff08;以太网&#xff0c;确认0和1电信号的分组方式&#xff0c;负责MAC地址&#xff0c;MAC地址用于在网络中唯一标示一个网卡&#xff0c;相当于网卡的身份证…...

向量组的维度是单个向量中元素的个数

在线性代数中&#xff0c;向量组的维数通常指的是单个向量中元素的个数&#xff0c;即每个向量的维度&#xff08;dimension&#xff09;。例如&#xff0c;一个由三维几何向量&#xff08;如 ( x , y , z ) (x, y, z) (x,y,z)&#xff09;组成的向量组&#xff0c;其维数是3&…...

VM中 ubuntu 网卡不显示

1.添加网卡配置 #sudo nano /etc/netplan/01-netcfg.yaml network:version: 2renderer: networkdethernets:ens33:dhcp4: trueens37:dhcp4: trueens38:dhcp4: true#保存后 sudo netplan apply2.查看网络状态 sudo systemctl start systemd-networkd sudo systemctl status sy…...

Scratch基础-运动模块详解

一、本次任务 二、内容详解 1&#xff09;点位坐标知识 1、什么是坐标&#xff1f; 答&#xff1a; 坐标是定位位置的数字&#xff0c;大家进教室是不是都有自己的座位&#xff1f;比如第3排第2列&#xff1f;这就像Scratch舞台的坐标&#xff0c;每个角色都有自己的‘座位号’…...

dp自动化登陆之hCaptcha 验证码

hCaptcha 是一种常见的验证码服务&#xff0c;用于区分人类用户和自动化程序。由于其基于图像识别和行为分析&#xff0c;下面介绍如何使用自动化点击验证码完成登陆。 思路&#xff1a;登陆目标网站触发验证码&#xff0c;截图并发给打码平台返回坐标&#xff0c;模拟人工点击…...

【002】renPy android端启动流程分析

接上篇分析 org.renpy.android.PythonSDLActivity#onCreate它先调用了 org.libsdl.app.SDLActivity#onCreate 源码如下&#xff1a; Override // android.app.Activity protected void onCreate(Bundle bundle0) {//1. 日志记录String s;Log.v("SDL", "Dev…...