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

Linux操作系统之进程(二):进程状态

目录

前言

一、补充知识点

1、并行与并发

2、时间片

3、 等待的本质

4、挂起

二. 进程的基本状态

三、代码演示

1、R与S

 2、T

3、Z

 四、孤儿进程

总结:


前言

在操作系统中,进程是程序执行的基本单位。每个进程都有自己的状态,这些状态反映了进程在系统中的当前活动情况。理解进程状态对于系统编程、性能调优和问题排查至关重要。今天,我们将深入探讨Linux进程的各种状态,并结合实际例子分析它们的行为。

一、补充知识点

在上文中我们介绍了进程的属性与进程的创建(详细查看上文链接),在了解我们本篇文章的主题——进程状态之前,我们需要给大家先补充几个知识点概念:

1、并行与并发

单核CPU执行进程代码不是把进程代码执行完毕才开始执行下一个,而是给每一个进程预分配一个时间片,基于时间片进行调度轮转(单CPU下),这通常被称为并发。

所谓并发,就是多个进程在一个CPU下采用的进程切换的方式,在一段时间之内让多个进程都得以推进。

那么所谓并行呢?就是多个进程在多个CPU下分别同时进行运行,这称之为并行。

CPU切换和运行的速度非常快,站在我们对应的这个CPU看来呢,当前这一个物理CPU它切换了多个进程,但是因为它切换和运行的速度非常快,所以用户根本就感知不到,

所以这也就解释为什么我们平时的死循环把不会程序卡死的原因,CPU会直接在操作系统的指导下,他会按照时间片来进行我们对应的轮转和调度。

2、时间片

Linux /Windows民用级别的操作系统为分时操作系统

就是我们整个操作系统它在帮你去执行任务时,是会给每一个任务给他分配上对应的一个时间片的,比如说是10毫秒或者是1毫秒。把时间片分好之后,每一个进程在CPU上去运行时,他把自己的时间片耗尽了,他就必须得从CPU上去剥离下来,剥离下来之后再把另一个任务再放上去。这就叫做分时操作系统。没有优先级的谁高谁低,特点:调度任务追求公平,这保证了保证用户操作的及时响应。

实时操作系统通常用于VxWorks、FreeRTOS、QNX(工业/嵌入式领域),主要特点是确定性调度,任务优先级严格分级,高优先级任务可抢占低优先级任务,支持硬实时(Hard Real-Time)和软实时(Soft Real-Time)

  • 硬实时:必须在绝对截止时间内完成(如航天控制系统)

  • 软实时:允许偶尔超时(如视频流处理)

3、 等待的本质

 等待的本质:当进程需要访问外部设备(如键盘、磁盘、网络)时,若设备未就绪,CPU 不会持续轮询等待,而是将该进程移出运行队列,挂入设备的等待队列

操作系统是怎么管理硬件的呢?也是:先描述,再组织

每个硬件设备(如键盘、磁盘)在内核中对应一个 struct device 结构体,包含:

struct device 
{unsigned int id;          // 设备唯一标识enum device_status status;// 设备状态(就绪/忙碌/错误)struct list_head wait_queue; // 等待该设备的进程队列// 其他驱动相关字段...
};

当进程需等待设备时,其 PCB 会被链入设备的 wait_queue(等待队列),直至设备触发中断通知就绪。

 阻塞和运行本质上都是在等待。,只是一个在硬件的等待队列中等待,一个在CPU的运行队列中等待

当从键盘中输入数据后,操作系统会得到信息,随后又将该PCB连入运行队列。

本质上就是把一个PCB一会放在运行队列里,一会放在设备等待队列里,来回的去调用。

4、挂起

内存不足时,操作系统将非活跃进程的代码和数据换出到磁盘(Swap 分区),仅保留 PCB 在内存,这就叫做挂起。

特点是用时间换空间:换入/换出操作增加延迟,但缓解内存压力。

在挂起后,进程变为进程变为阻塞挂起状态,挂起通常是在Swap分区里进行的。在云服务器中通常会禁掉Swap分区,这是为了防止频繁的进行换入与换出操作导致性能骤降。

二. 进程的基本状态

在Struct device中有一个status属性,这个通常记录了当前进程的状态。

我们经常在一些教科书上看见以下图片:

这样的图片肯定是无法让大家清楚的明白什么是进程的状态。 

在Linux中,进程的状态通常可以通过 ps 或 top 命令查看,常见的有:

  • R(Running) 并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏

    队列⾥。
  • S(Sleeping):可中断睡眠(意味着进程在等待事件完成,如I/O)。

  • D(Uninterruptible Sleep):不可中断睡眠(通常涉及硬件操作)。

  • T(Stopped):进程被暂停,可以通过发送 SIGSTOP 信号(如 kill -19给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运⾏。

  • Z(Zombie):僵尸进程(已终止但未被父进程回收)。

  • X(Dead):进程已完全终止(这个状态只是⼀个返回状态,你不会在任务列表⾥看到这个状态。)。

此外,还有一些特殊状态(以下并非全部):

  • t(Tracing stop):进程被调试器暂停(如 gdb 断点)。

  • <(高优先级) 和 N(低优先级):调度优先级相关。

我们通常可以在终端中输入 ps ajx或ps aux来查看:

a:显示⼀个终端所有的进程,包括其他⽤⼾的进程。
x:显示没有控制终端的进程,例如后台运⾏的守护进程。
j:显示进程归属的进程组ID、会话ID、父进程ID,以及与作业控制相关的信息
u:以用户为中心的格式显示进程信息,提供进程的详细信息,如用户、CPU和内存使用情况等

三、代码演示

我们用以下代码与指令操作给大家演示一下进程各种状态的查看:

1、R与S

在当前路径中我们有以下文件:

code.cpp:

#include<stdio.h>
#include<unistd.h>int main()
{int cnt=0;while(1){printf("hello world, cnt: %d,my pid : %d\n",cnt++ ,getpid());}return 0;
}

Makefile:

# 定义编译器和编译选项
CXX = g++
CXXFLAGS = -Wall -std=c++11# 定义目标文件和可执行文件名
TARGET = code
SRC = code.cpp# 默认目标
all: $(TARGET)# 直接生成可执行文件(不生成.o文件)
$(TARGET): $(SRC)$(CXX) $(CXXFLAGS) -o $@ $<# 清理生成的文件
clean:rm -f $(TARGET)# 运行程序
run: $(TARGET)./$(TARGET).PHONY: all clean run

首先我们调用make生成可执行文件code(exe),随后输入

./code

运行code可执行文件:

随后在另外一个终端中输入

watch -n 1 '(ps ajx | head -n 1; ps ajx | grep -w "./code" | grep -v grep)'

 查看进程状态:

 这里有两个code进程,第一个进程是bash创建的进程组,用于管理我们在前台运行的code程序,我们不用管它,通过pid 3825121我们可以知道第二个code就是我们运行的程序,可以看见,code的进程状态(就是STAT这一栏),一直在R与S中变换(+号表示 前台进程组,受终端控制,如Ctrl+C能终止它),这是为什么呢?

进程状态切换是由 CPU时间片调度 和 I/O等待 共同作用的结果:

  • R+(Running):进程正在CPU上执行,或位于运行队列等待调度。

  • S+(Sleeping):进程因等待I/O(如printf到终端)被移出运行队列。

我们的code.cpp中有着printf这个函数,这会涉及到IO的相关操作,printf不是直接输出到屏幕,而是写入 标准输出缓冲区,最终通过 终端设备(如/dev/pts/0)显示。又因为终端I/O速度远慢于CPU,因此每次printf都可能触发进程阻塞(进入S状态)。

R → S:当进程调用阻塞式I/O(如printfscanf)。

S → R:当I/O操作完成(如终端准备好接收输出)。

 2、T

依旧是原来几个文件,我们继续运行code:

我们在创建一个终端,输入kill -19 +【对应进程PID】

 此时我们透过之前的查看进程状态的终端可以发现,code进程已经变为了T状态:

 若我们此时在输入kill -18:

 又会发现:

程序又开始跑起来了,与之前不同的是,没有了+号,这是因为被中断后又继续后,进程默认变为了后台进程,此时在进程运行的终端上,输入strl c是不会终止进程的,这个时候就只能通过kill -9来杀死进程:

3、Z

 在讲僵尸状态之前,我们先想一下,一个进程为什么会被创建出来呢?

一个进程会被创建出来是为了完成用户的某个任务,那么操作系统怎么知道这个任务是否完成成功了呢?

我们以前写代码,比如做题,可以通过打印信息来了解,如果打印信息无关呢?

我们更改code.cpp代码如下:

#include<stdio.h>
#include<unistd.h>// int main()
// {
//     int cnt=0;
//     while(1)
//     {
//         printf("hello world, cnt: %d,my pid : %d\n",cnt++ ,getpid());
//     }
//     return 0;
// }int main()
{int cnt=0;for(int i=0;i<10;i++){cnt++;}return 0;
}

code不再是一个无限循环代码,重新输入make生成可执行code文件并运行:

 可以看见,如果没有打印信息,我们是无法知道任务完成成功了吗?

请大家在终端上输入:echo $?

 我们再把code.cpp中main函数的返回值设定为11呢?

return 11;

再运行:

我们发现,这次打印出的数又变成11了。细心的同学可能就有所猜测了。

没错,我们每个程序的main函数最后都会有一个return 返回值,当我们重新正常运行结束后,会执行return语句,这个返回的数,就会被父进程接受,告诉父进程,该进程执行任务是否成功。 

我们规定,返回0为执行任务成功,返回非0为失败。

进程退出时:

1、代码不会执行了,首先可以立即释放的就是进程对应的程序信息数据

2、进程退出要有退出信息,保存在自己的task_struct内部

3、管理该进程的task_struct必须被OS维护起来,方便用户未来进行获取进程退出的信息

那么这个跟Z僵尸状态有什么关联呢?大家不要着急,我们把code.cpp更改如下:

#include<stdio.h>
#include<unistd.h>// int main()
// {
//     int cnt=0;
//     while(1)
//     {
//         printf("hello world, cnt: %d,my pid : %d\n",cnt++ ,getpid());
//     }
//     return 0;
// }// int main()
// {
//     int cnt=0;
//     for(int i=0;i<10;i++)
//     {
//         cnt++;
//     }
//     return 11;
// }int main()
{pid_t id =fork();if(id==0){//子进程int n=10;while(n--){printf("i am child, pid: %d, ppid: %d\n",getpid(),getppid());sleep(1);}}else {//父进程while(1){   printf("i am parent, pid:%d\n",getpid());sleep(1);}}return 0;
}

 运行并输入

watch -n 1 '(ps ajx | head -n 1; ps ajx | grep -w "code" | grep -v grep)'

查看状态:

我们可以看见,在子进程未执行完毕时, 二者都是出现S+或者R+的状态,但是当我们子进程执行完毕后,可是父进程没执行完毕,就会出现僵尸状态:

僵尸状态的进程:如果没有人管我,我就会一直僵尸,task_struct会一直消耗内存→造成内存泄漏。

后面我们会讲到:一般需要父进程读取子进程信息,子进程才会自动退出。(调用waitpid),我们这里的代码没有调用waitpid,而是一直在循环,就不会去读取子进程的退出信息,导致子进程一直处于僵尸状态。

语言层面的内存泄漏的问题,如果在常驻的进程中出现,影响比较大:比如杀毒软件。

 四、孤儿进程

刚刚的僵尸进程是子进程退出了,父进程还在。但如果是父进程死掉了,子进程还在呢?

更改code代码如下:
 

#include<stdio.h>
#include<unistd.h>int main()
{pid_t id =fork();if(id==0){//子进程while(1){printf("i am child, pid: %d, ppid: %d\n",getpid(),getppid());sleep(1);}}else {//父进程while(1){   printf("i am parent, pid:%d\n",getpid());sleep(1);}}return 0;
}

我们在第三个终端(用来输入其他指令kill时所使用的终端),输入kill指令杀死父进程:

我们可以发现:

此时的子进程3868637的父进程已经变为1了。

那么这个1进程是什么呢?

输入指令:

ps -fp 1

这个失去原本父进程的子进程,就被称为孤儿进程。如果父进程先退出了,子进程还在:子进程成为孤儿进程,会被系统领养(一般是systemd,我这台云服务器是属于例外) 。

总结:

本文着重介绍了进程的几个状态,并通过各种代码事例带大家见识了一下状态,并为各位介绍了什么是孤儿进程。这就是本篇博客进程状态的主要内容,希望对各位有所帮助。有疑问可以在评论区提出!!!

相关文章:

Linux操作系统之进程(二):进程状态

目录 前言 一、补充知识点 1、并行与并发 2、时间片 3、 等待的本质 4、挂起 二. 进程的基本状态 三、代码演示 1、R与S 2、T 3、Z 四、孤儿进程 总结&#xff1a; 前言 在操作系统中&#xff0c;进程是程序执行的基本单位。每个进程都有自己的状态&#xff0c;这些…...

web.py使用时报错AttributeError: No template named image_window

在使用python的web.py框架做前后端时遇到问题。 问题代码主要如下&#xff0c;当加上main(iamge_name)这行代码后就会报错。报错信息包含两个&#xff1a;第一是找不到image_window模板&#xff1b;第二是gbk无法解码... class ImageWindow:def GET(self, image_name):main(i…...

2025年度消费新潜力白皮书470+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p42178 过去一年&#xff0c;消费市场在政策驱动与技术迭代中呈现结构性变革。社零总额达487,895亿元&#xff0c;实物商品网零额占比27%&#xff0c;线上渠道成为增长引擎。本报告从食品饮料、美妆护肤、家电数码、服饰户外四大核心领…...

全平台开源电子书阅读器推荐,支持多端同步+AI朗读!支持epub/mobi/azw3/pdf常见电子书格式!

Readest是一款好用的免费阅读工具&#xff0c;界面干净不花哨&#xff0c;特别适合喜欢专心读书的朋友。这个软件是经典阅读软件Foliate的全新升级版本&#xff0c;用最新技术开发&#xff0c;能在手机、电脑&#xff08;包括苹果和Windows系统&#xff09;以及网页上顺畅使用。…...

创建Workforce

创建你的Workforce 3.3.1 简单实践 1. 创建 Workforce 实例 想要使用 Workforce&#xff0c;首先需要创建一个 Workforce 实例。下面是最简单的示例&#xff1a; from camel.agents import ChatAgent from camel.models import ModelFactory from camel.types import Model…...

关于光谱相机的灵敏度

一、‌灵敏度的核心定义‌ ‌光谱灵敏度&#xff08;单色灵敏度&#xff09;‌ 描述光谱相机对单色辐射光的响应能力&#xff0c;即探测器对特定波长入射光的输出信号强度与入射光功率的比值。 例如&#xff0c;若在680nm波长下的光谱灵敏度较高&#xff0c;则表示该相机对此…...

【Redis】二、Redis常用数据类型命令学习

目录 一、String 1. SET、GET&#xff1a;设置与读取键值对&#xff1a; 2. DEL&#xff1a;删除键 3. INCR、DECR&#xff1a;自增 / 自减&#xff08;常用于计数器&#xff09; 4. APPEND&#xff1a;内容追加 5. EXPIRE&#xff1a;设置过期时间 / 查看剩余时间&#x…...

HarmonyOS基础组件:Button三种类型的使用

简介 HarmonyOS在明年将正式不再兼容Android原生功能&#xff0c;这意味着对于客户端的小伙伴不得不开始学习HarmonyOS开发语言。本篇文章主要介绍鸿蒙中的Button使用。 HarmonyOS中的Button相较于Android原生来说&#xff0c;功能比较丰富&#xff0c;扩展性高&#xff0c;减…...

RT_Thread——快速入门

文章目录 一、RT-Thread 目录结构二、核心文件三、移植时涉及的文件3.1 CPU 部分3.2 BSP 部分 四、内存管理五、启动流程及main函数5.1 启动流程5.2 关键函数速览5.3 main 函数示例 六、数据类型和编程规范6.1 数据类型6.2 函数名6.3 结构体定义6.4 注释规范 七、使用模拟器运行…...

Java 参数值传递机制

一个很经典的问题: java的方法入参 是值传递还是地址传递&#xff1f; 答案是&#xff1a;值传递。 今天排查一个生产问题&#xff0c;数据库链接资源没有关闭。 大致代码逻辑如下&#xff1a; try{Preparestatement ps null;String sql "select * from tableA wher…...

Redis 的 key 的过期策略是怎么实现的

在 Redis 中&#xff0c;有一个 expire 命令&#xff0c;用来设置某个 key 的过期时间&#xff0c;当超过这个时间后&#xff0c;这个 key 就被删除了&#xff0c;我们也就获取不到了&#xff0c;但是 Redis 是如何做到对于每一个设置了过期时间的 key 都能按时删除的呢&#x…...

ROG NUC 2025 :狂暴而冷静的小猛兽

在今年1 月的 CES 展会上&#xff0c;华硕首次披露了ROG NUC 2025&#xff0c;就以突破性紧凑设计桌面级超强性能配置&#xff0c;引发全球科技媒体和游戏爱好者的热议。蛰伏数月&#xff0c;蓄力进化&#xff01; 华硕自承接英特尔NUC产品线以来&#xff0c;就一直致力于重塑迷…...

origin绘图之【如何将多条重叠、高度重叠的点线图、折线图分开】

在使用 Origin 进行数据可视化时&#xff0c;尤其是在绘制多组数据的折线图或点线图时&#xff0c;我们经常会遇到这样的问题&#xff1a;多条曲线重叠严重&#xff0c;难以区分&#xff0c;导致图形信息密集、可读性差&#xff0c;影响图表的传达效果。 那么&#xff0c;我们该…...

2025第一届轩辕杯--Crypto--WriteUp

2025第一届轩辕杯–Crypto–WriteUp Crypto easyrsa task e 65537 n 1000000000000000000000000000156000000000000000000000000005643 c 418535905348643941073541505434424306523376401168593325605206exp from Crypto.Util.number import inverse, long_to_bytese …...

人工智能范式:技术革命下的认知重构

当生成式AI能够自主创作内容、设计解决方案甚至编写程序时&#xff0c;我们正在见证的不仅是工具革新&#xff0c;更是一场认知范式的根本转变。人工智能范式正在重塑人类理解世界、解决问题和创造价值的基本方式——这种转变将重新定义未来十年的职业逻辑与知识体系。 一、范…...

python训练营打卡第30天

模块和库的导入 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 一、导入官方库 1.标准导入&#xff1a;导入整个库 import mathprint(&quo…...

第29天-python实现mysql数据增删改查

想用Python和Tkinter实现一个MySQL数据库的增删改查应用。首先,我需要确定用户的需求是什么。他们可能想要一个图形界面,方便操作数据库,而不需要直接写SQL语句。用户可能对Python和Tkinter有一定了解,但对如何整合数据库操作可能不太熟悉。 首先,我应该考虑如何设计界面。…...

2025.05.21华为暑期实习机考真题解析第三题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. GPU资源租赁优化 问题描述 A先生是一家云计算服务商的资源调度负责人,负责管理公司的GPU资源租赁业务。公司拥有多个高性能GPU核心,并按时间段出租给不同客户使用。每个客户有…...

Datawhale 5月llm-universe 第4次笔记

第四章 构建RAG应用 envs 在 Conda 中&#xff0c;envs 目录是用来存放虚拟环境的地方。 也就是说&#xff0c;你在运行&#xff1a; onda create -n llm-universe python3.10 时&#xff0c;Conda 就会在这个路径下创建一个新的文件夹&#xff1a; makefile D:\Users\…...

滑窗问题实验LC2653(一次遍历维持窗口元素保持排序)

在只有一次遍历&#xff08;即滑窗每向右移动一步只处理新增元素和删除旧元素&#xff09;的前提下&#xff0c;要维持当前窗口内元素的全局“可排序”结构 问题背景&#xff1a;LeetCode 2653 - 滑动子数组的美丽值 题目要求在大小为 k 的滑动窗口中&#xff0c;找到第 x 小…...

PHP学习笔记(八)

返回值 值通过可选参数的返回语句返回 return的使用 函数不能返回多个值&#xff0c;但可以通过返回一个数组来得到类似的效果 函数返回一个引用&#xff0c;必须在函数声明和指派返回值给一个变量时都使用引用运算符&&#xff1a; 可变函数 PHP支持可变函数的概念。意味…...

【react18】在styled-components中引入图片报错

在styled-components项目中&#xff0c;遇到背景图片显示不出来的问题。图片的确是引入正确&#xff0c;但是webpack解析路径是有问题的 效果展示 以下这两种写法都不行&#xff0c;无法生效 export const HeaderNavLeft styled.h1width: 176px;height: 69px;background: ur…...

693SJBH基于.NET的题库管理系统

计算机与信息学院 本科毕业论文&#xff08;设计&#xff09;开题报告 论文中文题目 基于asp.net的题库管理系统设计与实现 论文英文题目 Asp.net based database management system design and Implementation 学生姓名 专业班级 XXXXXX专业08 班 ⒈选题的背景和意…...

centos系统redis-dump安装

1. ​Ruby 环境​ Redis-dump 是一个 Ruby 工具&#xff0c;需先安装 Ruby 和 RubyGems。 安装依赖​&#xff1a; sudo yum install -y curl gpg2 gcc-c patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf aut…...

如何利用 Conda 安装 Pytorch 教程 ?

如何利用 Conda 安装 Pytorch 教程 &#xff1f; 总共分为六步走&#xff1a; &#xff08;1&#xff09;第一步&#xff1a;验证conda 环境是否安装好&#xff1f; 1) conda -V2) conda --version&#xff08;2&#xff09;第二步&#xff1a;查看现有环境 conda env list…...

FPGA降低功耗研究

FPGA降低功耗研究 首先要明白一点&#xff1a;我们的核心目标是在维持性能的前提下&#xff0c;通过工艺、架构、设计方法学和系统级策略的协同优化&#xff0c;降低动态功耗、静态功耗和短路功耗。 本篇文章则是聚焦于 FPGA 设计阶段 的功耗优化&#xff0c;主要从 RTL 代码设…...

软考 系统架构设计师系列知识点之杂项集萃(67)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;66&#xff09; 第108题 RISC&#xff08;精简指令系统计算机&#xff09;的特点不包括&#xff08;&#xff09;。 A. 指令长度固定&#xff0c;指令种类尽量少 B. 寻址方式尽量丰富&#xff…...

第十节第三部分:常见API:传统时间:Date日期类、SimpleDateFormat

Date日期类常用方法 时间格式常用符号 Date日期类总结 为什么用SimpleDateFormat SimpleDateFormat常见方法 SimpleDateFormat解析字符串时间成为日期对象 SimpleDateFormat总结 代码&#xff1a; 代码一&#xff1a;Date日期类 package com.itheima.Time;import java.util.D…...

Python学习Day1:安装

Python的安装 1.安装python 打开python的官网&#xff0c;我们下载3.6.8版本Python Release Python 3.6.8 | Python.org 根据自己的电脑来下载对应的python版本 如图所示&#xff1a; 我已经下载完成&#xff0c;就是这样&#xff0c; 安装页面的第一排是自动安装&#xf…...

Java安全-Servlet内存马

内存马简介 内存马是指将恶意代码注入到内存中&#xff0c;达到无文件落地的效果&#xff0c;使得被攻击方难以察觉。由于是无文件的形式&#xff0c;可以绕过部分基于文件检测的杀软。而 Servlet 内存马是基于 Java Servlet 技术&#xff0c;动态将恶意代码注入到 Tomcat 内存…...

Mariadb cpu 93% 问题

最近项目遇到cpu平均使用率93% 一、登录数据库服务查看具体情况 可以看到服务器负载很高&#xff0c;&#xff0c;mariadb CPU使用已达到接近380.4% &#xff08;因为是8核&#xff0c;所以会有超过100%的情况&#xff09;。如下图&#xff1a; 二、排查是否有耗时较长sql 在…...

LeetCode222_完全二叉树的结点个数

LeetCode222_完全二叉树的结点个数 标签&#xff1a;#位运算 #树 #二分查找 #二叉树Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签&#xff1a;#位运算 #树 #二分查找 #二叉树 Ⅰ. 题目 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&…...

linux 查看java的安装路径

一、验证Java安装状态 java -version正常安装会显示版本信息&#xff1a; openjdk version "1.8.0_65" OpenJDK Runtime Environment (build 1.8.0_65-b17) OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)二、检查环境变量配置 若已配置JAVA_HOME&#…...

day32 python解释性库PDPbox

目录 一、初识PDPbox官方文档 二、准备鸢尾花数据集和训练模型 三、使用PDPbox进行解释性分析 1. 导入类并实例化对象 2. 调用plot方法绘制图形 3. 探索返回值的意义 四、总结与感悟 作为一名正在学习机器学习的学生&#xff0c;今天要学习一个非常有趣的库——PDPbox&am…...

LVLM-AFAH论文精读

Basic Information 标题&#xff1a;Your Large Vision-Language Model Only Needs A Few Attention Heads For Visual Grounding作者&#xff1a;Seil Kang&#xff0c; Jinyeong Kim&#xff0c; Junhyeok Kim&#xff0c; Seong Jae Hwang机构&#xff1a;Yonsei Universit…...

蓝桥杯3503 更小的数

问题描述 小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串&#xff0c;下标从 0 到 n−1&#xff0c;你可以将其视作是一个具有 n 位的十进制数字 num&#xff0c;小蓝可以从 num 中选出一段连续的子串并将子串进行反转&#xff0c;最多反转一次。 小蓝想要将选出的子…...

5.21本日总结

一、英语 复习list4list26 二、数学 学完14讲&#xff0c;1000题13讲写完 三、408 学习计网5.3剩余内容 四、总结 高数本月结束知识点学习&#xff0c;15讲知识点与14讲的题目同步进行。408剩余两本书要加快学习进度。 五、明日计划 英语&#xff1a;复习lsit5list25 …...

【25软考网工】第七章(3) UOS Linux防火墙配置和Web应用服务配置

博客主页&#xff1a;christine-rr-CSDN博客 ​​​专栏主页&#xff1a;软考中级网络工程师笔记 ​​​​ 大家好&#xff0c;我是christine-rr !目前《软考中级网络工程师》专栏已经更新三十多篇文章了&#xff0c;每篇笔记都包含详细的知识点&#xff0c;希望能帮助到你&am…...

Python数据分析基础

Python数据分析入门 介绍 在这个教程中&#xff0c;我们将学习如何使用Python来进行基本的数据分析。 安装必要的库 为了开始&#xff0c;你需要安装以下Python库&#xff1a; NumPyPandasMatplotlib 示例代码 import numpy as np import pandas as pd import matplotli…...

spring cloud config更新配置

在开发微服务时&#xff0c;往往需要有开发环境、测试环境和生产环境&#xff0c;手动修改配置环境是一件很麻烦的事情&#xff0c;因此&#xff0c;这里使用spring cloud config管理配置环境。要使用spring cloud config&#xff0c;需要先在GitHub搭建一个仓库。 一、仓库搭…...

小米汽车二期工厂下月将竣工,产能提升助力市场拓展

在新能源汽车市场竞争日益激烈的当下&#xff0c;小米汽车传来重要进展消息。据多方信息显示&#xff0c;小米汽车二期工厂下月即将竣工&#xff0c;这一关键节点的到来&#xff0c;有望为小米汽车的产能提升与市场布局带来重大突破。​ 小米汽车二期工厂位于北京亦庄&#xff…...

【单片机】如何产生负电压?

以下是对知乎文章《单片机中常用的负电压是这样产生的&#xff01;》的解析与总结&#xff0c;结合电路原理、应用场景及讨论要点展开&#xff1a; 一、负电压产生的核心原理 负电压本质是相对于参考地&#xff08;GND&#xff09;的电势差为负值&#xff0c;需通过电源或储能…...

Mcu_Bsdiff_Upgrade

系统架构 概述 MCU BSDiff 升级系统通过使用二进制差分技术&#xff0c;提供了一种在资源受限的微控制器上进行高效固件更新的机制。系统不传输和存储完整的固件映像&#xff0c;而是只处理固件版本之间的差异&#xff0c;从而显著缩小更新包并降低带宽要求。 该架构遵循一个…...

阿里云ecs 8核 16G 内存 装有redis6 分配了3G内存,和2个tomcat 每个tomcat 4G 服务器反应迟钝,如何确认不是redis的问题

我们经常用redis 但遇到tomcat timeout的时候&#xff0c;如何确认不是redis的问题。 不能因为这个再去搞个redis 压力测试。有没有更省劲的方法来确认不是redis的问题 以下是针对 阿里云 ECS&#xff08;8核16G&#xff0c;Redis 6分配3G内存&#xff0c;2个Tomcat各分配4G&a…...

机器学习-KNN算法

1.机器学习概述&#xff08;全部流程&#xff09; 获取数据&#xff1a;from sklearn.datasets import load_wine 数据处理(数据集划分、标准化):from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler 特征工程:from s…...

【数据结构 · 初阶】- 快速排序

目录 一. Hoare 版本 1. 单趟 2. 整体 3. 时间复杂度 4. 优化&#xff08;抢救一下&#xff09; 4.1 随机选 key 4.2 三数取中 二. 挖坑法 格式优化 三. 前后指针&#xff08;最好&#xff09; 四. 小区间优化 五. 改非递归 快速排序是 Hoare 提出的一种基于二叉树…...

HTTPS和HTTP区别

客户端向服务器发送HTTPS请求。服务器响应并发送其数字证书。客户端通过证书的公钥验证数字签名的有效性&#xff0c;如果有效&#xff0c;客户端生成一个随机的对称密钥。客户端使用公钥对这个对称密钥进行加密&#xff0c;然后将加密后的密钥发送给服务器。服务器使用自己的私…...

自动驾驶中的预测控制算法:用 Python 让无人车更智能

自动驾驶中的预测控制算法:用 Python 让无人车更智能 自动驾驶技术近年来取得了令人惊叹的进步,AI 与边缘计算的结合让车辆能够实时感知环境、规划路径并执行驾驶决策。其中,预测控制(Model Predictive Control,MPC) 作为一种先进的控制算法,凭借其对未来驾驶行为的优化…...

分享一些实用的网址

第一个&#xff1a;视频转化为动图 网址&#xff1a;https://www.freeconvert.com/zh/convert/mp4-to-gif 当然还有很多其他的功能&#xff0c;可以按需选择使用。 第二个&#xff1a;ASCII字符串到16进制在线转换工具 网址 &#xff1a;https://coding.tools/cn/ascii-to-…...

打开小程序提示请求失败(小程序页面空白)

1、小程序代码是商城后台下载的还是自己编译的 &#xff08;1&#xff09;要是商城后台下载的&#xff0c;检查设置里面的域名是不是https的 &#xff08;2&#xff09;要是自己编译的&#xff0c;检查app.js里面的接口域名是不是https的&#xff0c;填了以后有没有保存 注&a…...