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

Linux:基础IO---inode

文章目录

      • 1. inode
        • 1.1 未被打开的文件
        • 1.2 认识硬件
        • 1.3 对磁盘进行逻辑抽象(解构)
        • 1.4 文件系统

  • 序:在上一个章节缓冲区中,我通过将几个实例进行对比,引出了C语言级别即用户级别的缓冲区的概念,将用户级缓冲与内核级缓冲区进行了比较,从而了解了什么是缓冲区,缓冲区的缓冲加载策略是什么,而本章将深入探寻文件系统,去了解文件的本质是什么?未打开的文件又是如何存储的,存储在哪里,又是如何被访问的?诸君且听我娓娓道来!!!

1. inode

1.1 未被打开的文件

在之前的文章(Linux:基础IO—文件描述符)中曾提到过已经打开的文件是如何调用的,从而了解到了文件系统的概念,而现在我们要研究的对象是未被打开的文件

问题一:之前我们的研究对象是已经打开的文件,如果一个文件没有被打开呢?

如果一个文件没有被打开,那么该文件一定是在磁盘中存储的。

问题二:那我们要关心什么问题呢?

1. 路径问题
2. 存储问题
3. 获取问题(属性和文件内容)
4. 效率问题

文件 = 文件属性+文件内容—>磁盘上存储的文件 = 存文件的内容和存文件的属性

文件的内容 — 数据块

文件的属性 — inode

Linux的文件在磁盘中存储,是将属性和内容分开存储的!

1.2 认识硬件

在日常生活中,我们总能见到一种用来存储音频的光盘(CD)
在这里插入图片描述
同样可以类比,如果我们要存储文件,就一定要有一个载体,这个载体就是磁盘!!!
在这里插入图片描述
在这里插入图片描述

如下图所示:
在这里插入图片描述
其中一个盘片有两个盘面,上下个一个,磁头是一面一个,磁头和盘面不接触。

磁盘是永久性存储介质,可以一直存储数据,而内存是断电易失性存储介质,内存需要不断的通过电流来进行数据传输,一但断电,就会丢失所有数据。我们的未被打开的文件就存储在磁盘当中。

磁盘的存储构成:
在这里插入图片描述
在这里插入图片描述
磁盘被访问的最基本单位是扇区—512字节(0.5KB)甚至是4KB
我们可以将磁盘看做由无数个扇区构成的存储介质。(数组)
要把数据存到磁盘,第一个要解决的问题是定位一个扇区:那一面(定位哪个磁头),哪一个磁道,哪一个扇区。

对于磁盘来说:

  • 运动越少,效率越高
  • 运动越多,效率越低

所以,在软件设计上,一定要有意识的将相关数据放在一起。

CHS寻址方式:

CylinderHeaderSector
磁道磁头扇区
1.3 对磁盘进行逻辑抽象(解构)

在这里插入图片描述
一条磁带在物理上就是一个绕在一个柱子上的同心圆,如果我们将该磁带延展开,那么这个磁带就是一个线性结构,我们将这个磁带进行抽象,和我们的磁盘进行结合,就会发现,其实这条磁带上的某一块区域,对应的就是一个盘面(所以,这就是一个基于扇区的数组!),而一个盘面上又有很多个扇区,其中,某块区域的扇区就是一个磁道。

例子:任意一个扇区都有下标(和数组下标一样),如果现在,假设:每个盘面有2w个扇区,每个盘面有50个磁道,每个磁道有400个扇区。

假设一个扇区的编号为28888,我们怎么定位到该扇区呢?
哪一面:
28888/20000=1
28888%20000=8888

哪一磁道:
8888/400=22
8888%400=88

哪一扇区:88

所以,该扇区就是第1面的第22个磁道上的第88个扇区!!!

物理地址(CHS地址)
C磁道:22
H磁头:1
S扇区:88

逻辑扇区地址(LBA地址):28888

其中LBA地址和 CHS地址可以互相转换!!!

回归硬件:不仅仅CPU有“寄存器”,其他设备(外设)也有,其中磁盘就有他自己的寄存器。

磁盘中的寄存器有控制寄存器、数据寄存器、状态寄存器和地址寄存器
在这里插入图片描述

控制寄存器里面存的是IO方向,告诉磁盘我是要读入还是写入数据。
数据控制器里面就是要读入的地址或要写入的数据等
地址寄存器里面是LBA地址,如果要写入数据,就要存往哪里写,该LBA地址会被磁盘转为CHS地址!!!
状态寄存器里面存的是此次读入或写入是否成功

1.4 文件系统

问题一:对于一块800G的硬盘,我们怎么去管理呢?

我们是不是会把他分开啊!就像电脑,一共有800G,但是我们将这800G硬盘分成了C盘、D盘、E盘、F盘等,这种分治思想就是,只要管好了每个小的盘,大的盘也就管理好了。
但我们知道即使分成了这么多盘,拿D盘来说,里面可能还有200G,我们又要怎么管理者200G呢?
答案还是一样,分区,对这个盘进行区域划分,就像对程序地址空间那样,定义一个结构体,里面有start和end,我们将一个盘划分为多个这样的结构体,所以,我们只要管理好了这个结构体内的东西,就能管理好整个盘,盘管理好了,800G的内容也就管理好了!

struct partition{int strat;int end;
}struct partition part[N];

我们将这样的几个结构体通过数组来管理起来,假设,此时,200G的内容已经被我们进行区域分化,划分为很多个10G大小的区域,我们又该怎么管理呢?— 先描述,再组织!!!

现在让我们来探寻一下,操作系统是怎样管理这一个个的分区,从而实现了对整个大内存的管理!!!

在这里插入图片描述

对于一个200G的盘,我们这样进行划分,其中Block group 0就是数组下标为0所对应的结构体的范围。
其中Boot Block通常会记录操作系统启动的信息,里面存放着开机相关的字段,放在开头,与区域划分有关,一但出了问题,计算机就会瘫痪。

Data blocks:存文件内容的区域,将n个扇区以块的形式呈现出来(n == 2/4/8)— 文件系统的块的大小,其中,一个扇区有512个字节,一个块可能是(1024(1kb)/2048(2kb)/4096(4kb)字节)

inode Table:其中的inode是单个文件的所有属性,占128字节,一般而言,一个文件只会有一个inode,inode有唯一编号(ls -li可以查询某个文件的inode编号),所以inode Table就是存inode的一张表。其中,文件的属性和内容都是分开存储的。

在Linux中,文件的属性中,不包含文件的名称!!!
Linux系统里面标识文件用的是inode编号!!!

在这里插入图片描述

对于一个文件,操作系统会生成他的struct,来记录该文件的几乎所以属性,其中就有inode编号、文件类型、文件权限、引用计数、拥有者、所属组、ACM时间和block数组等,其中该block数组就是用来指向该文件所对应的inode的数据块,假设该数组大小为15,其中包含12个直接索引,2个索引,1个三级索引。

直接索引:里面直接存的是数据块的下标,直接去数据块里面找内容
两级索引:里面存的不是文件内容,而是存储我们的文件的块号,一个数据块大概能存8MB。的数据块下标。
三级索引:能存的更多了,是以多叉树的形式来存数据块的下标,能存储大文件。

一般而言,inode的编号是连续的,但如果你删了一个文件,该编号可能会被重新被操作系统分配

问题二:我怎么知道,这些块中哪些被使用,哪些没有被使用呢???

Block Bitmap:比特位的位置和块号映射起来,比特位的内容如果是0,表示该块没有被使用过或已经失效,如果为1,就说明正在被使用!

问题三:那么,我们删一个文件的时候,用不用把块(文件内容)清空呢?

答案是不用,当我们要删除一个文件的时候,只需要通过他的inode找到对应的块数据,然后在对应的block bitmap置0,然后再讲对应的inode bitmap置0就行,对应的内容没必要去删,很麻烦会降低IO效率,直接将对应的块数据置0,在后面被别人访问的时候该块的数据就会被覆盖。

总结:删除一个文件是对该文件编号所对应的Block Bitmap和inode Bitmap清零,inode Table和Data blocks都没动!!!

inode Bitmap:比特位的位置和inode的编号映射起来,比特位的内容决定了inode是否是有效的!!!

Super Block:文件系统的基本信息,是用来描述整个分区的基本使用情况
比如:该分区一个有多少组、每个组的大小、每个组的inode数量、每个组的block数量、每个组的起始inode和文件系统的类型与名称…

其中Super Block不一定会在每一个分组中,因为更新数据,要统一更新,很麻烦,但是如果只有一个组有Super Block,万一该部分的数据出了问题,操作系统不就崩了吗?于是就让Super Block点点星星放在组中,有的组有,有的组没有,于是该Super Block里面有一个魔数(一种随机数),在Super Block的一个固定位置,只要将某几个组的Super Block的信息一比较,就能知道这个数据是否是正确的了!!

每个分区在被使用前,都必须提前将部分文件系统的属性信息设置进对应的分区中,方便我们后续使用这个分区或分组 — 格式化

Group Descriptor Table(GDT):块组描述符,描述块组属性信息

GDT内容如下:

//Structure of a blocks group descriptor
struct ext2_group_desc
{__le32   bg_block_bitmap;  /* group中block bitmap所在的第一个block号 */__le32   bg_inode_bitmap;  /* group中inode bitmap 所在的第一个block号 */__le32   bg_inode_table;    /* group中inodes table 所在的第一个block号 */__le16   bg_free_blocks_count;    /* group中空闲的block总数 */__le16   bg_free_inodes_count;   /* group中空闲的inode总数*/__le16   bg_used_dirs_count;       /* 目录数 */__le16   bg_pad;__le32   bg_reserved[3];
};

问题四:新建/删除/查找/修改一个文件,操作系统要做什么?

** A. 如果我们要新建一个文件,操作系统可以通过该新建文件的路劲知晓该文件在哪个分区的哪个组内,操作系统会检查inode Bitmap内没有被使用过的位置,然后操作系统会给该文件分配一个inode(不同分区的组的inode分配范围不同,所以知道了该文件的inode就知道了该文件在哪个组里面),然后通过这个inode找到该文件在inode Table中的位置,然后将该文件的属性填入到里面去,然后将他对应的inode Bitmap置“1”,如果该文件还有内容要写入,操作系统会先确认你要写入的内容的大小,操作系统就会通过该文件的inode去查看Block Bitmap内没有被分配的数据块,然后将这些块号填入到inode Table中对应的inode的属性当中,然后将要写入的内容直接写到对应的数据块中!!!**

** B. 当我们要删除一个文件时,操作系统会拿到该文件的inode去找他inode Table中对应的属性,通过属性中存放数据的数据块的下标,将对应的Block Bitmap的位置置“0”,然后在将该inode对应inode Bitmap的位置置“0”,就将该文件删除了,数据块中的内容不用去删除,很麻烦,效率也不高。删除了该文件对应的数据块,就表示该数据块可以被别人申请访问,并覆盖该数据块的内容!!!**

** C. 当我们要查找一个文件,就要通过他的inode找到他在inode Table中对应的属性,从而找到该文件的相关内容,查找该文件的内容,就去访问该文件的数据块,查找该文件的权限,就去访问该文件的权限等**

** D. 修改一个文件也是同理!!!**

在Linux操作系统中,一个文件一个inode,每一个inode都有自己的编号,要注意的是:inode表示文件的所有属性,文件名并不属于inode内的属性

我怎么知道文件的inode编号,使用者从不关心inode编号,只知道文件名?接下来让我们通过理解目录来解答这个问题!

问题五:如何理解目录?

目录也是文件,也有自己的inode,也就是说,目录也有自己的属性。

1. 目录有内容吗?
有,因为文件 == 内容+属性

2. 既然有内容,那目录需不需要对应的数据块?
一定要,目录下也是有文件的。

3. 数据块里面放着什么呢?
放该目录下,文件名和对应文件的inode映射关系,我们可以将该文件名看出对应inode编号的key值,将inode编号看出value值。

1. 为什么同一个目录下,不能有同名文件?
因为文件名是作为一个key值来映射对应的文件的inode编号的,所以不能有同名文件,不然就会有歧义。

2. 为什么目录下,没有w权限,我们就无法创建文件?
没有写权限,即使真的创建了文件,操作系统也没法将创建文件的文件名和对应映射关系的inode编号写入该目录的数据块中,也就无法创建。

3. 为什么目录下,没有r权限,我们就无法查看文件?
因为我们要查看该目录下的文件的信息,就需要去访问该目录下的文件名对应映射的inode编号,而我们没有读权限,就没法读这个inode编号,也就无法查看文件了。

4. 为什么目录下,没有x权限,我们就无法进入这个目录?
当我们通过上一级目录或得该目录的inode时,由于没有执行权限,我们根本就无法通过访问该目录改变当前的PWD。

问题六:目录也是文件,也有inode编号,那么目录的inode编号怎么来的呢?

我们知道一个目录的inode就要去看他的上一级路径的目录去查他的inode,这样一直递归上去,直到root路径。由于root的文件名是确定的,我们就通过该文件名找到与之映射关系的inode编号,然后在递归回去,就能知道某个目录的inode编号了,这就是为什么,系统要访问一个文件,都要带一个路径。

总结:

本章,从硬件出发,由宏观到微观,由具体到抽象,围绕研究对象未被打开的文件来讲解,操作系统是如何对一个大块的磁盘进行管理的,还是那6个字,先描述,再组织!!!通过对一小块的分组的管理从而管理好一个分区,从而将一整块磁盘管理好,而后通过引入inode的概念讲述了什么是文件系统,什么是目录,文件是如何被访问的,又会存储在哪里!!!希望我的总结能帮助到大家,谢谢!!!

相关文章:

Linux:基础IO---inode

文章目录 1. inode1.1 未被打开的文件1.2 认识硬件1.3 对磁盘进行逻辑抽象(解构)1.4 文件系统 序:在上一个章节缓冲区中,我通过将几个实例进行对比,引出了C语言级别即用户级别的缓冲区的概念,将用户级缓冲与…...

蓝桥杯_LITS游戏 俄罗斯方块 模拟 暴力 搜索 DFS 剪纸 枚举

从格子图的第一个格子开始,依次尝试放置 L、I、T、S 形状。在放置每个形状时,检查当前位置是否合法(是否在格子图范围内且没有被其他形状占据)。如果合法,我们就标记当前位置为已占据,并递归地尝试放置下一…...

蓝桥杯基础算法-字符串与集合

对集合的考察集中在集合的特性和功能。 set-唯一性 list-有序性 集合元素的个数 思路分析:set的唯一性,取出重复的子串 eg: 下标0截取的范围:【0,最大下标】 下标1截取的范围:【1,最大下标…...

ChatGPT 4:解锁AI文案、绘画与视频创作新纪元

文章目录 一、ChatGPT 4的技术革新二、AI文案创作:精准生成与个性化定制三、AI绘画艺术:从文字到图像的神奇转化四、AI视频制作:自动化剪辑与创意实现五、知识库与ChatGPT 4的深度融合六、全新的变革和机遇《ChatGPT 4 应用详解:A…...

【C++】多态详解

文章目录 一、多态的概念二、多态的效果及实现1.多态的效果2.实现多态有两个必须条件3.虚函数4.虚函数的重写/覆盖5.多态场景下两个很坑的选择题6.重载/重写/隐藏的对比 三、虚函数重写的一些其他知识1.协变(了解)2.析构函数的重写3.检测是否重写&#x…...

Python与CATIA集成实现拓扑面颜色映射——图像驱动自动化设计实战

一、技术背景与需求场景 在汽车/航空等高端制造领域,常需将二维图像的颜色特征映射到三维模型的拓扑表面。传统手动操作耗时且易出错,本文通过Python-CATIA集成技术实现像素级颜色自动映射,可应用于: 涂装方案可视化验证材料纹理…...

Qt中的多种输出方式,信号与槽的基本使用

完成Hello World可以通过很多控件实现 如采用编辑框来完成hello world 编辑框分为单行编辑框----QLineEdit 和多行编辑框---QTextEdit 采用单行编辑框,创建项目后,展开forms文件夹,双击ui文件进入 qt designer设计页面 找到line edit 拖到页…...

C语言查漏补缺:基础篇

1.原理 C语言是一门编译型计算机语言,要编写C代码,C源代码文本文件本身无法直接执行,必须通过编译器翻译和链接器的链接,生成二进制的可执行文件,然后才能执行。这里的二进制的可执行文件就是我们最终要形成的可执行程…...

【ElasticSearch】

目录 1. 基本知识1.1 restful语法1.2 内部基于_version乐观锁控制1.3 restful 批量(bulk)增删改 2. 分布式及容错机制2.1 ElasticSearch分布式基础1 ES分布式机制2 rebalance3 master节点4 节点对等 2.2 分片shard、副本replica机制2.3 es容错机制 3. 文…...

投资策略分析:十年年化32.2%,夏普比1.31的动量斜率策略(策略源码+数据下载)

原创内容第848篇,专注智能量化投资、个人成长与财富自由。 竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。 回首向来萧瑟处,归去,也无风雨也无晴。 苏轼被贬黄州期间,借雨中徐行的意象,表达对人生荣辱得…...

httpx模块的使用

在使用requests模块发起请求时,报以下错误,表示服务器有可能使用的是http2.0协议版本,导致requests无法爬取。 此时就可以使用httpx模块爬取。 先下载httpx模块: pip install httpx[http2]然后用httpx发起请求: impo…...

【文献研究】含硼钢中BN表面偏析对可镀性的影响

《B 添加钢的溶融 Zn めっき性に及ぼす BN 表面析出の影響》由JFE公司田原大輔等人撰写。研究聚焦 B 添加钢在低露点退火时 BN 形成对镀锌性的影响,对汽车用高强度钢镀锌工艺优化意义重大。通过多组对比实验,结合多种分析手段,明确了相关因素…...

Logo语言的区块链

Logo语言的区块链探索 引言 随着科技的快速发展,区块链作为一种颠覆传统的分布式账本技术,正逐渐被许多行业所接受和应用。其核心特性在于去中心化、透明性、不可篡改性和安全性,这些特性使得区块链在金融、供应链、医疗、版权保护等领域显…...

3D Gaussian Splatting as MCMC 与gsplat中的应用实现

3D高斯泼溅(3D Gaussian splatting)自2023年提出以后,相关研究paper井喷式增长,尽管出现了许多改进版本,但依旧面临着诸多挑战,例如实现照片级真实感、应对高存储需求,而 “悬浮的高斯核” 问题就是其中之一。浮动高斯核通常由输入图像中的曝光或颜色不一致引发,也可能…...

车载ECU底软测试:方法与技术的深度解析

文章目录 引言车载 ECU 底软概述测试目标测试范围功能验证性能与实时性安全性与可靠性兼容性测试测试工具与技术方案分层测试方法与技术实现1. 单元测试(Unit Testing)2. 集成测试(Integration Testing)3. 系统测试(System Testing)4. 安全认证测试(Certification Testi…...

机器视觉3D中激光偏镜的优点

机器视觉的3D应用中,激光偏镜(如偏振片、波片、偏振分束器等)通过其独特的偏振控制能力,显著提升了系统的测量精度、抗干扰能力和适应性。以下是其核心优点: 1. 提升3D成像精度 抑制环境光干扰:偏振片可滤除非偏振的环境杂光(如日光、室内照明),仅保留激光偏振信号,大…...

25.6 多模态AI类型系统实战:日均10万请求下的99.99%可靠性保障与10倍性能提升

多模态AI类型系统实战:日均10万请求下的99.99%可靠性保障与10倍性能提升 关键词:类型标注实践, Pydantic 数据建模, 多模态数据处理, CogView 集成, CharGLM 对话引擎 1. 类型系统在 AI 应用中的核心价值 在复杂 Agent 系统中,类型标注是保障代码健壮性的第一道防线。当我…...

单链表的实现 | 附学生信息管理系统的实现

目录 1.前言: 2.单链表的相关概念: 2.1定义: 2.2形式: 2.3特点: 3.常见功能及代码 : 3.1创建节点: 3.2头插: 3.3尾插: 3.4头删: 3.5尾删: 3.6插入…...

【CMake】《CMake构建实战:项目开发卷》笔记-Chapter11-实践:基于onnxruntime的手写数字识别库

第11章 实践:基于onnxruntime的手写数字识别库 读者已经跟着本书实践了很多零零散散的实例,应该能够熟练使用CMake来构建C和C程序了吧!不过,前面的实例往往都是针对某个特定功能编写的,我们可能很难将它们综合起来实…...

微软主要收入云计算,OFFICE,操作系统和游戏10大分类

微软2024年主要收入10大分类是哪些,再加一列赚钱比例 微软 2024 财年的财务数据可能尚未完全统计完成,且官方可能没有正好按 10 大分类公布主要收入情况。不过,依据微软过往的业务板块和常见的收入来源,下面是模拟的表格,赚钱比例…...

PDF预览-搜索并高亮文本

在PDF.js中实现搜索高亮功能可以通过自定义一些代码来实现。PDF.js 是一个通用的、基于Web的PDF阅读器,它允许你在网页上嵌入PDF文件,并提供基本的阅读功能。要实现搜索并高亮显示文本,你可以通过以下几个步骤来完成: 1. 引入PDF…...

随笔1 认识编译命令

1.认识编译命令 1.1 解释gcc编译命令: gcc test1.cpp -o test1 pkg-config --cflags --libs opencv 命令解析: gcc:GNU C/C 编译器,用于编译C/C代码。 test1.cpp:源代码文件。 -o test1:指定输出的可执行文件名为t…...

【谷歌设置】chrome打开页面在新tab设置(新版)

这里一定要在搜索之后点击账户,然后选择更过设置 选择在新窗口打开搜索结果...

9.翻页器组件设计开发与应用(Vue父子组件通信)

翻页器组件设计开发与使用 写在前面el-pagination分页器的用法用法介绍实战案例实现代码 Vue中的父子组件用法与通信何谓父子组件搭建Paginator.vue子组件组件初步搭建父组件向子组件传参通信子组件向父组件通信 最终代码Index.vuePaginator.vue 总结 欢迎加入Gerapy二次开发教…...

MyBatis-Flex关联查询

MyBatis-Flex关联查询 在 MyBatis-Flex 中,我们内置了 3 种方案,帮助用户进行关联查询,比如 一对多、一对一、多对一、多对多等场景,他们分别是: 方案1:Relations 注解方案2:Field Query方案3…...

Lucene.Net 分词器选择指南:盘古分词 vs 结巴分词

文章目录 前言一、核心特性对比二、典型场景推荐1. 选择盘古分词的场景2. 选择结巴分词的场景 三、关键指标实测对比1. 分词质量测试(F1值)2. 性能测试(单线程) 四、如何选择?决策树五、进阶优化建议1. 盘古分词优化方…...

YOLOv11实战电力设备缺陷检测

本文采用YOLOv11作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv11以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对电力设备缺陷数据集进行训练和优化,该数据集包含丰富的电力设备缺…...

LINUX 5 vim cat zip unzip

dd u撤销 ctrlr取消撤销 q!刚才的操作不做保存 刚才是编辑模式 现在是可视化模式 多行注释...

Redis的常见命令

Redis的常见命令 官方命令文档:https://redis.io/docs/latest/commands/ 文章目录 Redis的常见命令Redis数据结构介绍Redis通用命令1.String类型2.Hash类型3.List类型List类型的常见命令:利用List结构实现:栈、队列、阻塞队列: 4.…...

LeetCode第131题_分割回文串

LeetCode 第131题:分割回文串 题目描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 难度 中等 题目链接 点击在LeetCode中查看题目 示…...

网络钓鱼攻击的威胁和执法部门的作用(第一部分)

在当今的数字世界中,网络犯罪分子不断开发新技术来利用个人、企业和政府机构。 最普遍和最具破坏性的网络犯罪形式之一是网络钓鱼——一种社会工程手段,用于欺骗人们提供敏感信息,例如登录凭据、财务数据和个人详细信息。 随着网络钓鱼攻击…...

用Scala玩转Flink:从零构建实时处理系统

大家好!欢迎来到 Flink 的奇妙世界!如果你正对实时数据处理充满好奇,或者已经厌倦了传统批处理的漫长等待,那么你找对地方了。本系列文章将带你使用优雅的 Scala 语言,一步步掌握强大的流处理引擎——Apache Flink。 今…...

【LeetCode】算法详解#3 ---最大子数组和

1.题目介绍 给定一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 1 < nums.length < 105-104 < nums[i] < 104 2.解决思路 要求出…...

基于Python的心衰疾病数据可视化分析系统

【Python】基于Python的心衰疾病数据可视化分析系统 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目基于Python开发&#xff0c;重点针对5000条心衰疾病患者的数据进行可视化分析&#…...

oracle批量删除分区

为了清理数据&#xff0c;往往需要删除一些分区 简单查看当前分区 附件 --创建测试表 -- drop table test_part purge;CREATE TABLE test_part (sales_id NUMBER,sale_date DATE,amount NUMBER ) PARTITION BY RANGE (sale_date) INTERVAL (INTERVAL 1 MONTH) -- 每个月创建…...

Android Compose入门和基本使用

文章目录 一、Jetpack Compose 介绍Jetpack Compose是什么Composable 函数命令式和声明式UI组合和继承 二、状态管理什么是状态Stateremember状态提升 三、自定义布局Layout ModifierLayout Composable固有特性测量使用内置组件固有特性测量自定义固有特性测量 四、项目中使用J…...

xLua的Lua调用C#的2,3,4

使用Lua在Unity中创建游戏对象&#xff0c;组件&#xff1a; 相关代码如下&#xff1a; Lua --Lua实例化类 --C# Npc objnew Npc() --通过调用构造函数创建对象 local objCS.Npc() obj.HP100 print(obj.HP) local obj1CS.Npc("admin") print(obj1.Name)--表方法希…...

使用 Python 连接 PostgreSQL 数据库,从 `mimic - III` 数据库中筛选数据并导出特定的数据图表

要使用 Python 连接 PostgreSQL 数据库&#xff0c;从 mimic - III 数据库中筛选数据并导出特定的数据图表&#xff0c;你可以按照以下步骤操作&#xff1a; 安装所需的库&#xff1a;psycopg2 用于连接 PostgreSQL 数据库&#xff0c;pandas 用于数据处理&#xff0c;matplot…...

算法刷题记录——LeetCode篇(2.6) [第151~160题](持续更新)

更新时间&#xff1a;2025-04-06 算法题解目录汇总&#xff1a;算法刷题记录——题解目录汇总技术博客总目录&#xff1a;计算机技术系列博客——目录页 优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注&#xff01; 152. 乘积最大子数组 给你一个…...

Dijkstra求最短路径问题(优先队列优化模板java)

首先 1. 主类定义与全局变量 public class Main {static int N 100010; // 最大节点数static int INF Integer.MAX_VALUE; // 无穷大static ArrayList<Pair>[] G new ArrayList[N]; // 邻接表存储图static int[] dis new int[N]; // 存储每个节点的最短…...

【软件测试】性能测试 —— 基础概念篇

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容主要介绍性能测试相关知识&#xff0c;首先我们需要了解性能测试是什么&#xff0c;本期内容主要介绍性能测试…...

Jmeter脚本使用要点记录

一&#xff0c;使用Bean shell获取请求响应的数据 byte[] result prev.getResponseData(); String str new String(result); System.out.println(str);其中&#xff0c;prev是jmeter的内置变量&#xff0c;直接使用即可。 二&#xff0c;不同的流程中传参数 vars.put(&quo…...

HTML5

HTML5是对HTML标准的第5次修订 HTML是超文本标记语言的简称&#xff0c;是为【网页创建和其它可在网页浏览器中所看到信息】而设计的一种标记性语言。 H5优点&#xff1a;跨平台使用将互联网语义化&#xff0c;更好地被人类与机器所理解降低了对浏览器的依赖&#xff0c;更好地…...

算法—博弈问题

1.博弈问题 1.前提:每一步都是最优解的情况下&#xff0c;先手的那个人已经确定了胜负 用dp数组记录每一步操作后的结果&#xff0c;如果下一步会出现必输结果&#xff0c;那么说明执行这步操作的人必胜&#xff0c;因为必输结果的下一步操作后都是必胜的结果&#xff0c;所以在…...

vector模拟实现(2)

1.构造函数 2.拷贝构造 我们利用push_back和reserve来实现拷贝构造。 3.迭代器的实现 由于底层是一段连续的空间&#xff0c;所以我们选择用指针来实现迭代器。 4.swap 这里的swap函数是有两种方法&#xff0c;一种是开辟一段新的空间&#xff0c;然后memcpy来把原来的数据拷…...

【嵌入式系统设计师】知识点:第3章 嵌入式硬件设计

提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…...

输入框输入数字且保持精度

在项目中如果涉及到金额等需要数字输入且保持精度的情况下&#xff0c;由于输入框是可以随意输入文本的&#xff0c;所以一般情况下可能需要监听输入框的change事件&#xff0c;然后通过正则表达式去替换掉不匹配的文本部分。 由于每次文本改变都会被监听&#xff0c;包括替换…...

Vue3中的Inject用法全解析

大家好呀&#xff5e;今天给大家带来一个超级实用的Vue3技巧&#xff1a;如何使用inject进行组件间的通信&#xff01;如果你对组件间的数据传递、事件触发感兴趣&#xff0c;那一定不要错过这篇文章哦&#xff01;话不多说&#xff0c;直接开整&#xff5e; &#x1f31f; 什么…...

FPGA同步复位、异步复位、异步复位同步释放仿真

FPGA同步复位、异步复位、异步复位同步释放仿真 xilinx VIVADO仿真 行为仿真 综合后功能仿真&#xff0c;综合后时序仿真 实现后功能仿真&#xff0c;实现后时序仿真 目录 前言 一、同步复位 二、异步复位 三、异步复位同步释放 总结 前言 本文将详细介绍FPGA同步复位、异…...

深度解析需求分析:理论、流程与实践

深度解析需求分析&#xff1a;理论、流程与实践 一、需求分析的目标&#xff08;一&#xff09;准确捕捉用户诉求&#xff08;二&#xff09;为开发提供清晰指引 二、需求分析流程&#xff08;一&#xff09;需求获取&#xff08;二&#xff09;需求整理&#xff08;三&#xf…...