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来查看:
三、代码演示
我们用以下代码与指令操作给大家演示一下进程各种状态的查看:
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(如printf
、scanf
)。
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 四、孤儿进程 总结: 前言 在操作系统中,进程是程序执行的基本单位。每个进程都有自己的状态,这些…...
web.py使用时报错AttributeError: No template named image_window
在使用python的web.py框架做前后端时遇到问题。 问题代码主要如下,当加上main(iamge_name)这行代码后就会报错。报错信息包含两个:第一是找不到image_window模板;第二是gbk无法解码... class ImageWindow:def GET(self, image_name):main(i…...
2025年度消费新潜力白皮书470+份汇总解读|附PDF下载
原文链接:https://tecdat.cn/?p42178 过去一年,消费市场在政策驱动与技术迭代中呈现结构性变革。社零总额达487,895亿元,实物商品网零额占比27%,线上渠道成为增长引擎。本报告从食品饮料、美妆护肤、家电数码、服饰户外四大核心领…...
全平台开源电子书阅读器推荐,支持多端同步+AI朗读!支持epub/mobi/azw3/pdf常见电子书格式!
Readest是一款好用的免费阅读工具,界面干净不花哨,特别适合喜欢专心读书的朋友。这个软件是经典阅读软件Foliate的全新升级版本,用最新技术开发,能在手机、电脑(包括苹果和Windows系统)以及网页上顺畅使用。…...
创建Workforce
创建你的Workforce 3.3.1 简单实践 1. 创建 Workforce 实例 想要使用 Workforce,首先需要创建一个 Workforce 实例。下面是最简单的示例: from camel.agents import ChatAgent from camel.models import ModelFactory from camel.types import Model…...
关于光谱相机的灵敏度
一、灵敏度的核心定义 光谱灵敏度(单色灵敏度) 描述光谱相机对单色辐射光的响应能力,即探测器对特定波长入射光的输出信号强度与入射光功率的比值。 例如,若在680nm波长下的光谱灵敏度较高,则表示该相机对此…...
【Redis】二、Redis常用数据类型命令学习
目录 一、String 1. SET、GET:设置与读取键值对: 2. DEL:删除键 3. INCR、DECR:自增 / 自减(常用于计数器) 4. APPEND:内容追加 5. EXPIRE:设置过期时间 / 查看剩余时间&#x…...
HarmonyOS基础组件:Button三种类型的使用
简介 HarmonyOS在明年将正式不再兼容Android原生功能,这意味着对于客户端的小伙伴不得不开始学习HarmonyOS开发语言。本篇文章主要介绍鸿蒙中的Button使用。 HarmonyOS中的Button相较于Android原生来说,功能比较丰富,扩展性高,减…...
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的方法入参 是值传递还是地址传递? 答案是:值传递。 今天排查一个生产问题,数据库链接资源没有关闭。 大致代码逻辑如下: try{Preparestatement ps null;String sql "select * from tableA wher…...
Redis 的 key 的过期策略是怎么实现的
在 Redis 中,有一个 expire 命令,用来设置某个 key 的过期时间,当超过这个时间后,这个 key 就被删除了,我们也就获取不到了,但是 Redis 是如何做到对于每一个设置了过期时间的 key 都能按时删除的呢&#x…...
ROG NUC 2025 :狂暴而冷静的小猛兽
在今年1 月的 CES 展会上,华硕首次披露了ROG NUC 2025,就以突破性紧凑设计桌面级超强性能配置,引发全球科技媒体和游戏爱好者的热议。蛰伏数月,蓄力进化! 华硕自承接英特尔NUC产品线以来,就一直致力于重塑迷…...
origin绘图之【如何将多条重叠、高度重叠的点线图、折线图分开】
在使用 Origin 进行数据可视化时,尤其是在绘制多组数据的折线图或点线图时,我们经常会遇到这样的问题:多条曲线重叠严重,难以区分,导致图形信息密集、可读性差,影响图表的传达效果。 那么,我们该…...
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能够自主创作内容、设计解决方案甚至编写程序时,我们正在见证的不仅是工具革新,更是一场认知范式的根本转变。人工智能范式正在重塑人类理解世界、解决问题和创造价值的基本方式——这种转变将重新定义未来十年的职业逻辑与知识体系。 一、范…...
python训练营打卡第30天
模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 一、导入官方库 1.标准导入:导入整个库 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 中,envs 目录是用来存放虚拟环境的地方。 也就是说,你在运行: onda create -n llm-universe python3.10 时,Conda 就会在这个路径下创建一个新的文件夹: makefile D:\Users\…...
滑窗问题实验LC2653(一次遍历维持窗口元素保持排序)
在只有一次遍历(即滑窗每向右移动一步只处理新增元素和删除旧元素)的前提下,要维持当前窗口内元素的全局“可排序”结构 问题背景:LeetCode 2653 - 滑动子数组的美丽值 题目要求在大小为 k 的滑动窗口中,找到第 x 小…...
PHP学习笔记(八)
返回值 值通过可选参数的返回语句返回 return的使用 函数不能返回多个值,但可以通过返回一个数组来得到类似的效果 函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&: 可变函数 PHP支持可变函数的概念。意味…...
【react18】在styled-components中引入图片报错
在styled-components项目中,遇到背景图片显示不出来的问题。图片的确是引入正确,但是webpack解析路径是有问题的 效果展示 以下这两种写法都不行,无法生效 export const HeaderNavLeft styled.h1width: 176px;height: 69px;background: ur…...
693SJBH基于.NET的题库管理系统
计算机与信息学院 本科毕业论文(设计)开题报告 论文中文题目 基于asp.net的题库管理系统设计与实现 论文英文题目 Asp.net based database management system design and Implementation 学生姓名 专业班级 XXXXXX专业08 班 ⒈选题的背景和意…...
centos系统redis-dump安装
1. Ruby 环境 Redis-dump 是一个 Ruby 工具,需先安装 Ruby 和 RubyGems。 安装依赖: 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 教程 ? 总共分为六步走: (1)第一步:验证conda 环境是否安装好? 1) conda -V2) conda --version(2)第二步:查看现有环境 conda env list…...
FPGA降低功耗研究
FPGA降低功耗研究 首先要明白一点:我们的核心目标是在维持性能的前提下,通过工艺、架构、设计方法学和系统级策略的协同优化,降低动态功耗、静态功耗和短路功耗。 本篇文章则是聚焦于 FPGA 设计阶段 的功耗优化,主要从 RTL 代码设…...
软考 系统架构设计师系列知识点之杂项集萃(67)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(66) 第108题 RISC(精简指令系统计算机)的特点不包括()。 A. 指令长度固定,指令种类尽量少 B. 寻址方式尽量丰富ÿ…...
第十节第三部分:常见API:传统时间:Date日期类、SimpleDateFormat
Date日期类常用方法 时间格式常用符号 Date日期类总结 为什么用SimpleDateFormat SimpleDateFormat常见方法 SimpleDateFormat解析字符串时间成为日期对象 SimpleDateFormat总结 代码: 代码一:Date日期类 package com.itheima.Time;import java.util.D…...
Python学习Day1:安装
Python的安装 1.安装python 打开python的官网,我们下载3.6.8版本Python Release Python 3.6.8 | Python.org 根据自己的电脑来下载对应的python版本 如图所示: 我已经下载完成,就是这样, 安装页面的第一排是自动安装…...
Java安全-Servlet内存马
内存马简介 内存马是指将恶意代码注入到内存中,达到无文件落地的效果,使得被攻击方难以察觉。由于是无文件的形式,可以绕过部分基于文件检测的杀软。而 Servlet 内存马是基于 Java Servlet 技术,动态将恶意代码注入到 Tomcat 内存…...
Mariadb cpu 93% 问题
最近项目遇到cpu平均使用率93% 一、登录数据库服务查看具体情况 可以看到服务器负载很高,,mariadb CPU使用已达到接近380.4% (因为是8核,所以会有超过100%的情况)。如下图: 二、排查是否有耗时较长sql 在…...
LeetCode222_完全二叉树的结点个数
LeetCode222_完全二叉树的结点个数 标签:#位运算 #树 #二分查找 #二叉树Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签:#位运算 #树 #二分查找 #二叉树 Ⅰ. 题目 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下&…...
linux 查看java的安装路径
一、验证Java安装状态 java -version正常安装会显示版本信息: 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. 探索返回值的意义 四、总结与感悟 作为一名正在学习机器学习的学生,今天要学习一个非常有趣的库——PDPbox&am…...
LVLM-AFAH论文精读
Basic Information 标题:Your Large Vision-Language Model Only Needs A Few Attention Heads For Visual Grounding作者:Seil Kang, Jinyeong Kim, Junhyeok Kim, Seong Jae Hwang机构:Yonsei Universit…...
蓝桥杯3503 更小的数
问题描述 小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串,下标从 0 到 n−1,你可以将其视作是一个具有 n 位的十进制数字 num,小蓝可以从 num 中选出一段连续的子串并将子串进行反转,最多反转一次。 小蓝想要将选出的子…...
5.21本日总结
一、英语 复习list4list26 二、数学 学完14讲,1000题13讲写完 三、408 学习计网5.3剩余内容 四、总结 高数本月结束知识点学习,15讲知识点与14讲的题目同步进行。408剩余两本书要加快学习进度。 五、明日计划 英语:复习lsit5list25 …...
【25软考网工】第七章(3) UOS Linux防火墙配置和Web应用服务配置
博客主页:christine-rr-CSDN博客 专栏主页:软考中级网络工程师笔记 大家好,我是christine-rr !目前《软考中级网络工程师》专栏已经更新三十多篇文章了,每篇笔记都包含详细的知识点,希望能帮助到你&am…...
Python数据分析基础
Python数据分析入门 介绍 在这个教程中,我们将学习如何使用Python来进行基本的数据分析。 安装必要的库 为了开始,你需要安装以下Python库: NumPyPandasMatplotlib 示例代码 import numpy as np import pandas as pd import matplotli…...
spring cloud config更新配置
在开发微服务时,往往需要有开发环境、测试环境和生产环境,手动修改配置环境是一件很麻烦的事情,因此,这里使用spring cloud config管理配置环境。要使用spring cloud config,需要先在GitHub搭建一个仓库。 一、仓库搭…...
小米汽车二期工厂下月将竣工,产能提升助力市场拓展
在新能源汽车市场竞争日益激烈的当下,小米汽车传来重要进展消息。据多方信息显示,小米汽车二期工厂下月即将竣工,这一关键节点的到来,有望为小米汽车的产能提升与市场布局带来重大突破。 小米汽车二期工厂位于北京亦庄ÿ…...
【单片机】如何产生负电压?
以下是对知乎文章《单片机中常用的负电压是这样产生的!》的解析与总结,结合电路原理、应用场景及讨论要点展开: 一、负电压产生的核心原理 负电压本质是相对于参考地(GND)的电势差为负值,需通过电源或储能…...
Mcu_Bsdiff_Upgrade
系统架构 概述 MCU BSDiff 升级系统通过使用二进制差分技术,提供了一种在资源受限的微控制器上进行高效固件更新的机制。系统不传输和存储完整的固件映像,而是只处理固件版本之间的差异,从而显著缩小更新包并降低带宽要求。 该架构遵循一个…...
阿里云ecs 8核 16G 内存 装有redis6 分配了3G内存,和2个tomcat 每个tomcat 4G 服务器反应迟钝,如何确认不是redis的问题
我们经常用redis 但遇到tomcat timeout的时候,如何确认不是redis的问题。 不能因为这个再去搞个redis 压力测试。有没有更省劲的方法来确认不是redis的问题 以下是针对 阿里云 ECS(8核16G,Redis 6分配3G内存,2个Tomcat各分配4G&a…...
机器学习-KNN算法
1.机器学习概述(全部流程) 获取数据: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. 优化(抢救一下) 4.1 随机选 key 4.2 三数取中 二. 挖坑法 格式优化 三. 前后指针(最好) 四. 小区间优化 五. 改非递归 快速排序是 Hoare 提出的一种基于二叉树…...
HTTPS和HTTP区别
客户端向服务器发送HTTPS请求。服务器响应并发送其数字证书。客户端通过证书的公钥验证数字签名的有效性,如果有效,客户端生成一个随机的对称密钥。客户端使用公钥对这个对称密钥进行加密,然后将加密后的密钥发送给服务器。服务器使用自己的私…...
自动驾驶中的预测控制算法:用 Python 让无人车更智能
自动驾驶中的预测控制算法:用 Python 让无人车更智能 自动驾驶技术近年来取得了令人惊叹的进步,AI 与边缘计算的结合让车辆能够实时感知环境、规划路径并执行驾驶决策。其中,预测控制(Model Predictive Control,MPC) 作为一种先进的控制算法,凭借其对未来驾驶行为的优化…...
分享一些实用的网址
第一个:视频转化为动图 网址:https://www.freeconvert.com/zh/convert/mp4-to-gif 当然还有很多其他的功能,可以按需选择使用。 第二个:ASCII字符串到16进制在线转换工具 网址 :https://coding.tools/cn/ascii-to-…...
打开小程序提示请求失败(小程序页面空白)
1、小程序代码是商城后台下载的还是自己编译的 (1)要是商城后台下载的,检查设置里面的域名是不是https的 (2)要是自己编译的,检查app.js里面的接口域名是不是https的,填了以后有没有保存 注&a…...