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

【Linux】磁盘 | 文件系统 | inode

🪐🪐🪐欢迎来到程序员餐厅💫💫💫

          主厨:邪王真眼

主厨的主页:Chef‘s blog  

所属专栏:青果大战linux

总有光环在陨落,总有新星在闪烁


模电好难啊,不知不觉怎么就要期末考试了,还有六级考试,哦哭了


前言 

我们之前讲的文件都是被打开的文件,或者说被加载到内存中的文件,但事实上计算机中没有被打开的文件比被打开的文件数量多得多,操作系统是如何管理这些没被打开的文件的呢?显然不会是一股脑往硬盘里一塞就啥也不管了, 今天我们就来好好介绍一下。


磁盘

在了解硬盘中的文件之前,我们要先来了解一下磁盘

计算机中存储数据有两种方式,,一种是存放在内存中,一种是存放在硬盘中,我们常说的电脑是512+16,手机是256+12,这里的大数字“256”、“512”就是硬盘的空间大小(单位G),小数字就是内存的空间大小(单位G)。

内存的特点叫做掉电即丢失,也就是说当你的电脑没电了那你内存中存储的数据会直接清空,要想保存数据就要一直开着电脑,这显然是不可能的,这时就要让硬盘发挥作用了,硬盘的不仅空间比内存大得多,而且他的数据存储是掉电不丢失的,除此之外价格也便宜很多。

硬盘分为机械磁盘和SSD(固态硬盘)

上图中,左侧是磁盘,右侧是SSD。

  1.  机械磁盘是我们的计算机中唯一一个机械设备,IO交互慢

  2. 固态硬盘IO效率、功耗、噪音大小上明显比机械磁盘更好,

事实上我们现在的PC上大多都是固态硬盘,那么为什么我们还要讲磁盘,而不是SSD呢?

首先虽然性能上有明显差异,但是SSD和磁盘的文件系统大框架是一样的,只是SSD多了些优化。

其次,对于企业来说他们要在服务器上安装硬盘,单块硬盘就是几个TB,并且一台机器可以安装几十块,这些硬盘主要是起到存储数据的作用,对他的IO交互速度、噪音什么的没什么要求,为了最大可能的节约成本,当然就要用机械磁盘了。


磁盘的物理结构

一个磁盘是由多个盘面组成的,我们先单拿出一个盘面讲解

在上图中我们可以看到很多圆环,每条圆环都是一条磁道,在工作时,中心的马达会带动磁盘高速旋转(一分钟几千转),磁头可以在磁头臂的帮助下移动到不同的磁道,这样一来磁头就可以读取任何一张盘面的任何地方了,当然磁头不是贴着盘面的,不然会刮坏盘面,而是以极近的距离挨着它。

机械磁盘是通过磁头在高速旋转的盘片表面进行数据的读写操作。盘片表面涂有磁性材料,磁头可以改变盘片上磁性材料的磁极方向来写入数据。例如,当磁头通过电流产生磁场时,就可以在盘片的磁性涂层上产生对应的磁极排列,这些不同的磁极排列就代表了 0 和 1 这样的二进制数据(例如规定N极为1,S为0)。而在读取数据时,磁头会检测盘片上磁性材料的磁极方向,从而将其转换为计算机能够识别的电信号。

磁盘是由多个盘面组成的,每个盘面都有一个磁头,用于写该面的数据,注意每个盘面正反都可以读写,也都各有一个磁头。

我们将不同盘面的相同大小的磁道看作一起,就可以当作一个柱面。


数据的存储

每个圆环都是一个磁道,而每个磁道又被分为了许多扇区,

扇区是磁盘IO的最小单位,一般固定是512字节

当然请注意,越是远离圆心,一个扇区所占面积就越大,为了使得扇区的数据空间都是512,所以外围的磁密度也会减小。

CHS寻址

  1. 第一步确定在哪个Cylinder(柱面),
  2. 第二步确定是哪个磁道,要用哪个Header(磁头)
  3. 第三步确定在哪个Sector(扇区)

数据的逻辑结构 

相信不少朋友小时候都玩过这个东西,揪着一边然后把它整个磁带全部撤出来,最后自然是按不回去了,不难看出磁带里面也是一圈一圈缠绕的,被扯出来后则是一根直线

事实上,这不就是二维数据转化为一维数组吗,我们的磁盘也是同样,于是乎在逻辑结构上我们可以把它从一个CHS三维的数组,转化为一个一维数组,

注意CHS中计算数量,扇区号是从下标1开始算的,磁道号和柱面号是下标0开始

在这个逻辑结构基础上,先人又发明了LAB寻址,

LAB下标=柱面号*单个柱面的扇区数+磁道号*单个磁道的扇区数+扇区号-1(最后减一是因为LAB下标从0开始算)

但是一个扇区的大小只有512字节,这个单位太小了,经过大量时间后人们发现当OS与磁盘单次OI以1kb、2kb、4kb、8kb为单位时效率高,其中又以4kb最为常用,于是我们接下来都是对4kb为单位的OS进行讨论。

我们把八个扇区看作一个数据块,这个块就是4字节,即OS与磁盘IO的单位 


文件系统

inode

属性会以结构体类型struct_inode的方式被构建出来,一个文件只有一个inode,他是文件属性的集合。

一个inode一般为128字节(某些OS下是256),他的主要内容如下

struct inode {unsigned long		i_ino;umode_t			i_mode;uid_t			i_uid;gid_t			i_gid;loff_t			i_size;
};
  1. i_ino:该inode结构体的编号

  2. i_mode:该文件的权限和类型(文件还是普通文件或其他的类型)

  3. uid:文件拥有者

  4. i_gid:文件拥有组

  5. i_size:文件大小 

使用指令 ls -i即可查看文件的inode编号

请注意,在linux中文件名属性没有在inode中保存, 


 分区&分组管理 

我们的PC一般是1T或者512G,而服务器可达几十TB,如此巨大的空间会存储大量的数据,那么如何对这么多数据进行管理呢?思路很简单,分治,分而治之。

这里的分区对应的就是我们windows里的分盘,C盘、D盘、E盘,不同的盘可以是不同的文件系统,这样可以防止出现一个文件系统挂了,文件全部出问题的情况

此时我们要做的就是如何管理好一个组的问题了,只要一个组管理好了,其他组就借鉴他的管理方法就可以了。


Group内容

我们先看看一个组里都有什么

 inode Table 

用于存储该组中的文件的inode,

Data blocks

以块为单位保存该组中的文件的内容,一份文件所占用块数是“文件大小/4kb”(向上取整)。

加入一个文件只有一个字节,就是是1/4k(向上取整),要给他分配一个数据块。

如果是大小为6kb,那就是6/4(向上取整),要分配两个数据块。

inode Bitmap&Block Bitmap

我们把inode Table中的空间以一个inode的大小(128字节)分为一份一份的,如何确定某一份空间有没有被使用呢,如何确定Data Block中的一个块(4字节)有没有被使用,靠的就是他们俩Bitmap。

这是两个位图,对于inode Bitmap第i个比特位为0表示第i份空间还没被使用,第i个比特位为1,表示第i份空间被使用了,Block Bitmap的第i个比特位负责表示第i个数据块是否被用了

当然了,虽然我们这里用的是位图,但是我们之前说了磁盘数据的IO要以块为单位,所以哪怕你只修改bitmap中的一个比特位,也要把一个块大小的Bitmap都读进去。

OS在给inode分配空间时,不是一定是连续的,加入第一份空间被使用了,第二份还没有,那么下次存储inode不一定会用第二份,而可能是第三、第五、第一千份空间。


Group Descriptor Table

简称GDT,块组描述符,用于描述块组属性信息

  • 该块组内的可用数据块数量。。
  • 该块组内的可用inode数量。
  • 该块组的块位图和inode位图的位置
  • 该块组的inode表的位置。

Boot block通常包含了启动计算机或其他设备所需的初始指令和数据,这些指令和数据是设备启动过程中最先被加载和执行的部分。我们现在先不考虑他。

Super Block(超级块)

存放文件系统本身的结构信息,是文件系统的核心。
Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
记录的信息主要有:
  • bolck 和 inode的总量,
  • 未使用的block和inode的数量
  • 一个block和inode的大小
  • 最近一次挂载的时间,
  • 最近一次写入数据的时间
  • 最近一次检验磁盘的时间等其他文件系统的相关信息。
  • 还有一些用于管理文件的函数

从功能上来讲,一个分区有一个Super Block就够了,那为什么实际是每隔几个Group就要设立一个Super Block呢?

因为一旦一个Super Block崩溃了,那么他管理的数据都要gg,所以我们不能把鸡蛋都放在一个篮子里。因此每隔几个group就设立一个super Block,正常情况下就一个Super Block负责管理该区,当他出了问题,OS就会把好的SuperBlock复制过去以修复问题,大大提高了文件系统的稳定性。请注意一个区中的不同位置的Super block的数据是完全一样的,

文件系统以分区为单位,不同的分区可以安装不同的文件系统

inode编号是以分区为单位分配的,而不是以组为单位,

即C盘中可能有个inode编号是100,D盘也有个inode编号100,但是不可能在C盘的两个inode编号都是100

每个组的inode在分配编号时只需要确定该组的起始inode编号即可(保存在GDT中),他的编号就等于该组的起始inode编号+i(在该组用的第i份空间),例如她所在组的起始inode编号是1000,它用的是第25份空间,那他的编号就是1025,Datablock也是同理。


inode对Data block的映射

在inode中还有一个元素

__le32	i_block[EXT2_N_BLOCKS];/* Pointers to blocks */

i_block就是一个int类型的数组,他的容量是EXT2_N_BLOCKS,这个宏是15,这个数组的前12个空间存放的就是数据块的编号,显然靠这12编号最多只能存放48个字节的数据

一级间接块索引表指针存储的数据块编号所对应的数据块不是直接存储文件数据的,而是在这个块中存储其他块的编号,一个编号是int类型占四个字节,一个块是4KB可以存1000个块号,通过这1000个块可以存储的数据时4MB

同理 一级间接块索引表指针指向的数据块存的是1000个一级间接块索引表指针,相当于可以存4GB。

三级间接块索引表指针指向的数据块存的是1000个二级间接块索引表指针,相当于可以存4TB。

加入我们没有这些间接索引,那单单12个块很容易就会不够,可如果你开太大比如1200甚至120000个块,那inode本身空间就太大了消耗了很多空间。

如此一来就在保证inode本身所占空间不太大且固定的基础上,基本可以满足各种大小的文件的存储,

或许有同学会问,为什么不直接放个int类型指针,需要几个块就malloc几个int空间来存放

因为mallco分配的是内存空间,我们这里讨论的都是磁盘空间!!

只能说,优雅,太优雅了(间谍过家家音)。


inode编号与文件名的映射

显然我们在通过指令或者代码中的函数操作文件时,使用的都是文件名,那么文件名和inode又有何关系呢?

首先明确,文件名没有存放在inode中。

如何理解目录?

事实上,目录本身也是个文件,

所以它也有自己的inode和data block,我们可以看出在底层磁盘,是不区分所谓的文件类型的,大家都是一个inode+几个block,

目录的内容是什么?

是文件名和inode编号的映射关系 ,当然这个映射是相互的,inode编号也可以映射文件名,这也是为什么一个目录下不会有同名文件。

所以我们我们要在磁盘中找到一个文件,只需要通过他的上级目录和它自己的文件名就可以得到他的inode编号,接着通过编号找到这个inode结构体,结构体里面有对应的数据块编号,如此就得到了文件的数据,即可加载到内存中。

这里我们就知道了,一个文件的文件名是存储在他的上级目录中的。这就是为什么当你没有读权限时无法看到目录中的内容,因为读不了目录文件,所以就无法获得inode与文件名的关系,所以你就访问不了目录里面的东西;没有写权限就是无法将inode与文件名的映射写到目录中

为什么不把文件名放到inode?

编号可以进行加减以实现一些优化,编号的大小比较速度也优于字符串,因此为了提高效率就只用inode了,那么没有用武之地的文件名就没有在inode的存放的必要了。事实上用户id,组id等信息也是以整型的形式存放的,而不是直接存储我们的字符串形式的用户名。而文件名即字符串这种东西是为了方便我们用户的观看和使用才被使用的。可以看出OS为了提高效率真的是煞费苦心。

但是你先别高兴,要从磁盘找到我们的文件,要先找到上级目录拿着它的inode映射去在磁盘找,可是,要找到上级目录得先找到上上级目录啊,诶死循环了。

当然不是啦,根目录是特殊处理的,他的inode和文件名是固定的,所以找到根目录不用再依靠别的文件。这就是为什么我们访问一个文件需要相对路径或者绝对路径,因为要打开一个文件,就要从自身开始层层递归到根目录才可以。


路径缓存struct dentry

他是一个存放于内存的结构

我们现在知道了要找到一个文件,就要从他的根目录开始把他的路径中的文件夹都打开(从磁盘加载到内存),才可以最终获得该文件的inode,进而在磁盘中找到它,但是这样就意味着我们为了找到inode要不断和磁盘做IO去打开文件,效率不忍直视,于是佬们发明了dentry

首先dentry是一种树状结构,它里面有父子节点的指针以便于构造树状结构,它里面存放了一个文件的文件名(字符串)和她对应的inode

他所构建的结构就像linux的tree命令一样

 

最开始这个数据结构就会默认把根节点设置为根目录,之后加入我们要把project1打开,就会打开根目录->home->用户->projcet,此时就会对于每个文件都会创建新的dentry把该文件的文件名和inode的映射关系存放进去,并且把这些节点按照上面的树状结构链接起来,如此一来下次我们再要打开project2,就可以在内存中通过dentry直接获取用户A文件的inode,不用从根目录开始层层推导,新的文件也会带来新的dentry,继续链接到该树状结构上。当然一些dentry路径要是一直不被用就会被OS去掉,以节省空间。

这样我们就把找inode的操作只依靠内存实现了,效率比磁盘高了太多。

至于为什么不直接预加载所有路径,因为占用的空间太大了,等你的内存什么时候扩展到512了再说吧。


文件增删查改

在学习了这些东西后,我们回头在看文件的增删查改。

查找一个文件

如果是对于相对路径,先拼接成成绝对路径,

先去dentry里看有没有对应的缓存,如果有直接拿到inode,如果没有就层层展开,从根目录开始映射文件名和inode编号,最后拿到目标文件的inode

让inode编号和每个组Group的GDT中记录的inode起始编号比较,直到找到该文件所在Group,然后在inode Bitmap中检查该inode编号是否合法(即bitmap的该比特位为1),合法后去inode Table找到inode结构体,通过结构体中的i_block找到文件的数据块,至此,文件的内容(数据块)和属性(inode)就算都找到了。

创建一个文件

OS在inode Bitmap中确定第i个比特位,它对应的值为0,表示inode Table对应位置的inode还未被使用。

使用包括inode编号i在内的信息创建一个inode结构体,把它放到inode table第i份(以128字节为单位)空间,接着计算他的大小需要占用几个数据块(向上取整),通过Block Bitmap给他在Data balock分配n个数据块空间存储内容数据,并将数据块的编号存放在inode的i_block数组中。

如何删除一个文件

先查找到文件的inode编号,接着找到inode结构体获取数据块编号,最后把对应的inode Bitmap的比特位和Block Bitmap比特位都置零即可。

这意味着当你删掉了它后,他的数据还在Data Block中保存,也有被恢复的可能,不过你要是接着又建立了一些文件,占用了原本文件的Data Block就真的恢复不了了。

修改一个文件

先通过查找找到该文件,然后把文件加载到内存,对其内容修改,最后将修改后的数据刷新回磁盘中的文件即可。

-------------------------------写了很久,创作不易,麻烦点赞关注支持一下--------------------------------------

​​​​​​​ 

相关文章:

【Linux】磁盘 | 文件系统 | inode

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 模电好难啊&#xff…...

A051-基于Spring Boot的网络海鲜市场系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...

谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的

最近不知怎么的,Chrome突然间打开百度很慢,甚至打不开。不光我一个人遇到这问题,我同事也遇到这个问题。开发中难免遇到问题,需要百度,现在是百度不了。 作为一名开发人员,习惯了使用Chrome进行开发&#…...

《企业级低代码开发平台技术要求》核心要点解析

一、引言 在数字化转型的浪潮中,企业级低代码开发平台成为推动企业创新与发展的关键力量。深圳市标准化协会发布的《企业级低代码开发平台技术要求》(T/SZAS 77—2024)为该领域提供了重要的规范与指引。深入剖析其核心要点,对于理…...

AI一键生成3D动画:腾讯最新方案,为小程序带来革命性变化

随着3D技术的快速发展,将静态的3D模型转化为能够生动展现各种动作的角色已经成为许多创作者和开发者梦寐以求的能力。然而,在过去,这一过程往往需要大量的手动工作和技术积累。现在,腾讯推出了一项创新的技术——AI一键生成3D动画,它不仅极大地简化了流程,还显著提高了效…...

AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复

在Altium Designer软件中,切换三维视图以及恢复二维视图的操作相对简单。以下是具体的步骤: 切换三维视图 在PCB设计界面中,2D切换3D,快捷键按住数字键盘中的“3”即可切换; 快捷键ctrlf(或者vb快捷键也…...

【赵渝强老师】PostgreSQL的数据库

PostgreSQL的逻辑存储结构主要是指数据库中的各种数据库对象,包括:数据库集群、数据库、表、索引、视图等等。所有数据库对象都有各自的对象标识符oid(object identifiers),它是一个无符号的四字节整数,相关对象的oid都…...

opencv 区域提取三种算法

opencv 区域提取三种算法 1.轮廓查找 findContours()函数&#xff0c;得到轮廓的点集集合 cv::vector<cv::vector<Point>> contours;threshold(roiMat,binImg,m_pPara.m_nMinGray,m_pPara.m_nMaxGray,THRESH_BINARY);//膨胀处理Mat dilaElement getStructuringE…...

C++初阶(十六)--STL--list的模拟实现

目录 结点类的实现 迭代器类的模拟实现 迭代器类的模板参数说明 构造函数 *运算符重载 ->运算符的重载 运算符的重载 --运算符重载 !运算符重载 运算符重载 list类的模拟实现 成员变量 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载 迭代器相关函数 …...

树莓集团:以人工智能为核心,打造数字化生态运营新典范

在当今数字化浪潮席卷全球的背景下&#xff0c;各行各业都在积极探索数字化转型的路径。作为数字产业的领军者&#xff0c;树莓集团凭借其深厚的技术积累和创新理念&#xff0c;在人工智能、大数据、云计算等前沿技术领域不断突破&#xff0c;成功打造了一个以人工智能为核心的…...

基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)

本研究提出了一种基于深度学习的十二生肖图像识别系统&#xff0c;旨在利用卷积神经网络&#xff08;CNN&#xff09;进行图像分类&#xff0c;特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型&#xff1a;ResNet50和VGG16&#xff0c;进行图像的特征提…...

Torchtune在AMD GPU上的使用指南:利用多GPU能力进行LLM微调与扩展

Torchtune on AMD GPUs How-To Guide: Fine-tuning and Scaling LLMs with Multi-GPU Power — ROCm Blogs 这篇博客提供了一份详细的使用Torchtune在AMD GPU上微调和扩展大型语言模型&#xff08;LLM&#xff09;的指南。Torchtune 是一个PyTorch库&#xff0c;旨在让您轻松地…...

ESLint

代码规范 一套写代码的约定规则&#xff1b;比如赋值符号左右是否需要空格&#xff0c;一句话结束是否要加&#xff1b;.... 代码规范错误 如果你的代码不符合standard的要求&#xff0c;ESLint&#xff08;脚手架里配的东西&#xff09;会告诉你哪个文件第几行错了 解决代码…...

小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…...

如何具体实现商品详情的提取?

在电商领域&#xff0c;获取商品详情信息对于市场分析、价格比较、商品推荐等应用场景至关重要。本文将详细介绍如何使用Java编写爬虫程序&#xff0c;以合法合规的方式获取淘宝商品的详情信息&#xff0c;并提供详细的代码示例。 1. 环境准备 在开始编写爬虫之前&#xff0c;…...

antd table 自定义表头过滤表格内容

注意&#xff1a;该功能只能过滤可一次性返回全部数据的表格&#xff0c;通过接口分页查询的请自主按照需求改动哈~ 实现步骤&#xff1a; 1.在要过滤的列表表头增加过滤图标&#xff0c;点击图标显示浮窗 2.浮窗内显示整列可选选项&#xff0c;通过勾选单选或者全选、搜索框来…...

高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)

引言 在现代iOS应用开发中&#xff0c;处理大规模数据是一个常见的挑战。尤其实在直播项目中&#xff0c;礼物面板作为展示用户互动的重要部分&#xff0c;通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异&#xff0c;还需要保证高效的加载与渲…...

Maven - 优雅的管理多模块应用的统一版本号

文章目录 概述一、使用 versions-maven-plugin 插件1. 在主 pom.xml 中定义插件2. 修改版本号3. 回退修改4. 提交修改 二、使用占位符统一管理版本号1. 在主 pom.xml 中定义占位符2. 使用 flatten-maven-plugin 插件自动替换占位符3. 修改版本号4. 为什么这种方式更方便&#x…...

C++设计模式(观察者模式)

一、介绍 1.动机 在软件构建过程中&#xff0c;我们需要为某些对象建立一种“通知依赖关系”&#xff0c;即一个对象的状态发生改变&#xff0c;所有的依赖对象&#xff08;观察者对象&#xff09;都将得到通知。如果这样的依赖关系过于紧密&#xff0c;将使软件不能很好地抵…...

【unity】WebSocket 与 EventSource 的区别

WebSocket 也是一种很好的选择&#xff0c;尤其是在需要进行 双向实时通信&#xff08;例如聊天应用、实时数据流等&#xff09;时。与 EventSource 不同&#xff0c;WebSocket 允许客户端和服务器之间建立一个持久的、全双工的通信通道。两者的区别和适用场景如下&#xff1a;…...

从ETL到DataOps:WhaleStudio替代Informatica,实现信创化升级

作者 | 白鲸开源 姜维 在数据集成和调度的领域&#xff0c;Informatica曾经是公认的权威工具。其强大的ETL功能、多年积累的市场经验&#xff0c;使其成为众多企业数据处理的核心工具。 然而&#xff0c;随着新一代大数据平台的迅速崛起&#xff0c;以及信创化改造的要求愈发严…...

第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放

文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…...

[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式

T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求&#xff1a; 编译硬件需求&#xff1a;做多系统测试&#xff0c;磁盘500GB起步(固态)&#xff08;机械会卡死&#xff09;&#xff0c;内存3…...

Web Worker 和 WebSocket的区别

Web Worker&#xff08;消息传递机制&#xff09; 定义&#xff1a;是为了在浏览器中提供多线程支持&#xff0c;允许 JavaScript 在后台线程运行&#xff0c;而不阻塞主线程。它非常适合执行耗时的计算任务或处理大量数据&#xff0c;避免主线程&#xff08;通常是 UI 线程&a…...

vmware Ubuntu2004运行STAR-Searcher

github链接 安装ros noetic gazebo11 略 gazebo更新方法 sudo sh -c echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable lsb_release -cs main" > /etc/apt/sources.list.d/gazebo-stable.list wget https://packages.osrfoundation.org/gaz…...

04_JavaScript引入到文件

JavaScript引入到文件 嵌入到HTML文件中 <body> <script> var age 20 </script></body> 引入本地独立JS文件 <body> <script type"text/javascript" src"./itbaizhan.js"> </script></body> 引入网络来…...

计算机网络的功能

目录 信息交换 资源共享 分布式处理 可靠性增强 集中管理 信息交换 计算机网络最基本的功能之一是允许不同设备之间的数据通信。这包括电子邮件的发送和接收、即时消息的传递、文件传输等。通过网络&#xff0c;用户可以轻松地与全球各地的其他人进行沟通和协作。 信息交…...

38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用L298N驱动连接P2.3和P2.4口进行电机驱动&#xff0c; 然后串口连接P3.0和P3.1模拟ESP8266&#xff0c; 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…...

Git仓库迁移到远程仓库(源码、分支、提交)

单个迁移仓库 一、迁移仓库 1.准备工作 > 手动在电脑创建一个临时文件夹&#xff0c;CMD进入该目录 > 远程仓库上创建一个同名的空仓库 2.CMD命令&#xff1a;拉取旧Git仓库&#xff08;包含提交、分支、源码&#xff09; $ git clone --bare http://git.domain.cn/…...

Go语言压缩文件处理

目录 Go 语言压缩文件处理1. 压缩文件&#xff1a;Zip函数2. 解压文件&#xff1a;UnZip 函数3. 小结 Go 语言压缩文件处理 在现代的应用开发中&#xff0c;处理压缩文件&#xff08;如 .zip 格式&#xff09;是常见的需求。Go 语言提供了内置的 archive/zip 包来处理 .zip 文…...

Libevent库-http通信不同请求方式的处理

做项目的时候用到了http通信&#xff0c;同事用libevent库写的&#xff0c;特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…...

Vue3 v-if与v-show的区别

v-if 与 v-show 我们都可以在开发中用于条件渲染&#xff0c;在面试时也是个常考的题目 实现原理 v-if&#xff1a;是真正的条件渲染&#xff0c;当v-if true时&#xff0c;元素会被创建、渲染&#xff0c;并插入到dom树中&#xff0c;这个过程会耗费系统的资源&#xff0c;当…...

同时在github和gitee配置密钥

同时在github和gitee配置密钥 1. 生成不同的 SSH 密钥 为每个平台生成单独的 SSH 密钥。 # 为 GitHub 生成密钥&#xff08;默认文件路径为 ~/.ssh/github_id_rsa&#xff09; ssh-keygen -t rsa -b 4096 -C "your_github_emailexample.com" -f ~/.ssh/github_id_…...

Scala—数组(不可变数组Array、可变数组ArrayBuffer)用法详解

Scala集合概述-链接 大家可以点击上方链接&#xff0c;先对Scala的集合有一个整体的概念&#x1f923;&#x1f923;&#x1f923; 在 Scala 中&#xff0c;数组是一种特殊的集合类型&#xff0c;可以是可变的也可以是不可变的。 1. 不可变数组 在 Scala 中&#xff0c;不可变…...

Failed to find SV in PRN block of SINEX file (Name svnav.dat)

gamit 精密星历生成失败 gamit svnav.dat没更新 下载svnav.dat.allgnss 重命名成 svnav.dat ,替换到tables&#xff0c;即可。...

H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件

EasyPlayer.js无插件H5播放器作为一款功能全面的H5流媒体播放器&#xff0c;凭借其多种协议支持、多种解码方式、丰富的渲染元素和强大的应用功能&#xff0c;以及出色的跨平台兼容性&#xff0c;为用户提供了高度定制化的选项和优化的播放体验。无论是视频直播还是点播&#x…...

Ubuntu上使用自带python创建虚拟环境

虚拟环境让项目之间的依赖关系更加清晰&#xff0c;也可以避免全局安装的包的版本冲突问题。 1.查看python Ubuntu上一般都是自带python的&#xff0c;查看python版本及指向(使用的话python要换成python3)&#xff1a; ls -l /usr/bin | grep python 2.安装python虚拟环境工…...

对智能电视直播App的恶意监控

首先我们要指出中国广电总局推出的一个政策性文件是恶意监控的始作俑者&#xff0c;这个广电总局的政策性文件禁止智能电视和电视盒子安装直播软件。应该说这个政策性文件是为了保护特殊利益集团&#xff0c;阻挠技术进步和发展的。 有那么一些电视机和电视盒子的厂商和电信运…...

网络原理(一):应用层自定义协议的信息组织格式 HTTP 前置知识

目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…...

微软企业邮箱:安全可靠的企业级邮件服务!

微软企业邮箱的设置步骤&#xff1f;如何注册使用烽火域名邮箱&#xff1f; 微软企业邮箱作为一款专为企业设计的邮件服务&#xff0c;不仅提供了高效便捷的通信工具&#xff0c;更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…...

matlab导出3D彩色模型(surface类转stl,并对白模上色)

在matlab中绘制3维图形时&#xff0c;需要将3维图形导出到PPT中展示。但是直接导出图片效果欠佳&#xff0c;无法全方位展示。 最近学习了如何将matlab中的图形导出为stl模型&#xff0c;然后再采用简单的方法对模型上色。 中间尝试过matlab导出stl、ply、3dm等多种格式&…...

【JavaScript】async /await异步详解2 promise举例

在 JavaScript 中&#xff0c;async 和 await 是处理异步操作的强大工具。结合 try...catch 语句&#xff0c;你可以优雅地处理异步操作中的错误。 基本用法 定义异步函数&#xff1a;使用 async 关键字。等待 Promise 解析&#xff1a;使用 await 关键字。错误处理&#xff…...

Android 设备使用 Wireshark 工具进行网络抓包

背景 电脑和手机连接同一网络&#xff0c;想使用wireshark抓包工具抓取Android手机网络日志&#xff0c;有以下两种连接方法&#xff1a; Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑&#xff0c;并在开发者模式中启用 USB 网络共享。 查看设备连接信…...

封装类与封装函数

目录结构 src/ ├── utils/ │ ├── test.js │ ├── Calculator.js ├── views/ │ ├── Home.vue ├── App.vue 共同点&#xff1a;模块导出与模块引入 封装函数 场景 简单、轻量级和性能敏感的场景&#xff0c;适合快速开发和维护。 优 可维护性&…...

【java】接口幂等性的实现

文章目录 1. 引言介绍幂等性的概念为什么需要在Java接口中实现幂等性 2. 使用幂等表实现幂等性什么是幂等表如何设计幂等表示例&#xff1a;Java代码实现使用幂等表使用幂等表实现幂等性 3. 利用Nginx Lua 和 Redis实现幂等性Nginx和Lua的作用简介介绍Redis的SETNX命令架构设计…...

Leetcode 1.两数之和

题目意在对数组的快速查找 思路&#xff1a;哈希表 先创建一个哈希表&#xff0c;然后对数组进行遍历&#xff0c;iter代表用目标值依次减去遍历数组中的元素后得出的值&#xff0c;如果这个值在map中存在&#xff0c;则返回其索引和当前数组元素中的索引&#xff1b;若不存…...

GitLab指定用户分配合并权限

进入项目 -》 Project Settings Repository -》展开 Protected branches -》 添加要保护的分支&#xff0c;设置角色 管理用户角色权限 查看到不同用户的角色&#xff0c;一般设置Developer只有Merger Request权限&#xff0c;Maintainer还有Merge审批权限 GitLab 中的权限…...

实战优化公司线上系统JVM:从基础到高级

引言 Java虚拟机&#xff08;JVM&#xff09;是Java语言的核心组件&#xff0c;它使得Java程序能够实现“一次编写&#xff0c;到处运行”的跨平台特性。在现代应用程序中&#xff0c;JVM的性能和稳定性直接影响到系统的整体表现。本文将深入探讨JVM的基础知识、基本特点、定义…...

实时数据开发 | 一文理解Flink窗口机制

窗口操作在流处理和批处理之间起到了桥梁的作用。 Flink引擎本质上是流式引擎&#xff0c;认为批处理是流处理的一个特例。因此&#xff0c;通过窗口将流数据划分为有限大小的集合&#xff0c;使得在这些有界的数据集上可以进行批处理风格的计算。 通过配置窗口的参数&#xf…...

【云原生系列】迁移云上需要考虑哪些问题

云计算已经成为现代企业架构中不可或缺的一部分。越来越多的公司正在将他们的应用、数据和基础设施迁移到云平台上&#xff0c;以便更好地应对快速变化的市场需求、提高运营效率并降低成本。然而&#xff0c;迁移到云端并不是一件轻松的事情。涉及到多个技术、业务和管理层面的…...