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

【操作系统笔记】-文件系统

引言

之前已经学习过数据在内存中是如何表示,如何存储,但是这些存储在PC断电后数据便消失。因此我们需要一个可以持久化存储并且容量远远大于内存的结构,这一篇我们将学习,文件是如何被组织和操作的,这是一个操作系统重要的部分-文件系统。文章的结构主要分为文件和目录的概念、文件系统的实现、文件系统的管理和优化、最后是例子。

文件和目录的基本概念

文件

  • 文件定义:文件是一种抽象的概念,它提供了一种方法可以将信息存储到硬盘并且随后读取回来。
  • 文件命名: 文件命名规则是通常分为两部分,小数点后的叫文件扩展名(不是必须的),小数点前的叫文件名,某些操作系统有字符数限制(学完文件的组织结构就知道为什么了),某些系统区分大小写。
  • 文件结构:文件结构可以多种方式,下图是常见的三种方式
    在这里插入图片描述
    • a 代表文件是一个无结构的字节序列,操作系统无需知道文件是什么,由用户程序解释字节序列。这种方式提供了最大限度的灵活性,用户程序可以以自己觉得合适的方式来存放文件。
    • b代表文件是一个定长记录的序列,记录有其内部结构。核心思想是对文件的操作以记录为单位,读取一个记录
    • c代表文件被组织成树型结构,树最大的好处就是方便查找,因此这种文件结构在数据库日常作索引,比如mysql的B+Tree索引。
  • 文件类型
    文件类型通常分为普通文件和目录,目录比较重要,后面会讲,unix还有额外的字符特殊文件和块特殊文件。
    • 普通文件
  1. ASCII
    ASCII文件包含多行正文,每行以换行或者回车结束,Windows系统同时使用换行和回车。ASCII文件的好处是可以显示和打印也可以通过文本编辑器编辑
  2. 二进制文件
    二进制文件即使打印出来也是无法理解的字符,通常其有独立的内部结构,只有其用户程序才能解释,下面是两个UNIX系统的两个二进制文件的例子
    1. 可执行二进制
    通常可执行程序都是存放为二进制
    在这里插入图片描述
  • 头(以魔数开头,魔数通常用于标识程序的特定文件,比如java的class文件就有魔数0xCAFEBABE,还存放了正文大小、数据大小等信息)

  • 程序正文(代码)

  • 数据

  • 重定位位(程序被载入内存重定位时需要)

  • 符号表(通常是程序debug需要)
    2. 存档文件
    UNIX存档文件是已编译但未链接的文件,其结构如下
    在这里插入图片描述

    • 字符特殊文件,通常用于串行I/O设备,比如终端、打印机和网络
    • 块特殊文件,通常用于硬盘交互
  • 文件访问

    • 顺序访问

早期操作系统只支持顺序访问,那时的磁带也只支持顺序访问

    • 随机访问

磁盘支持随机访问,有两种思路

  1. read操作每次指定开始读文件的位置读取
  2. 通过seek设置当前位置,然后顺序读取(UNIX和Windows采用这种方式)
  • 文件属性
    在这里插入图片描述
    • 前四个是创建者和所有者以及访问权限相关
      flags指定特殊属性,很容易理解
    • record-length、key-position、key-length只出现在用key查找的文件中
    • Time相关属性,Creation time是创建时间;Time of last access最后访问时间;Time of last change,最后修改时间
    • size相关属性,Current size,文件字节数;Maximum size在老的操作系统中有使用,在创建时指定文件的最大大小,然后预留存储空间,现代操作系统已经不需要
  • 文件操作
    • Create:创建文件
    • Delete:删除文件
    • Open:打开文件,在使用文件之前必须先打开
    • Close:关闭文件
    • Read:读取文件,通常从当前位置读取,必须指定需要读取多少个byte而且必须提供一个buffer来容纳它们
    • Write:写入文件,通常从当前位置写入,如果当前位置是文件末尾,则增加文件的大小,如果在中间,则覆盖原有的数据
    • Append:追加内容,只能写入在文件末尾
    • Seek:用于随机访问时,指定文件的需要操作的位置,seek操作后,read和write操作都将在这个位置执行
    • Get attributes:获取文件属性
    • Set attributes:设置文件属性
    • Rename:重命名

目录

目录是为了记录文件的位置,管理文件

  • 单级目录系统
    早期个人计算机比较通用这类目录系统,那时个人计算机通常只有一个用户。这个方案的好处是简单,定位文件快(因为磁盘只有一个地方存目录信息),目前常用于嵌入式设备,因为现代计算机文件太多,单级的目录无法适用。其结构示意图如下
    在这里插入图片描述

  • 层级目录系统
    虽然单级目录系统有简单和定位文件快的好处,但是现在计算机的用户通常有成千上万的文件,不可能放到一个目录中,因此需要一种方法将有关系文件分组聚集在一起,一种方案是层级目录,就像一本书的目录,如下图,不仅可以分组聚集相关文件,还可以为不同用户创建独立的目录

在这里插入图片描述

  • 路径名
    用目录树组织目录时,需用某种方法指定文件名。
    绝对路径:每个文件获得一个从root目录到文件的路径。比如路径/usr/ast/mailbox代表根目录有一个子目录usr,然后usr下有一个子目录ast,然后ast目录有mailbox文件。绝对路径都是从根目录“/“开始,并且是唯一的。在UNIX下路径目录分隔用”/“,windows下用”\“

相对路径:相对路径通常和工作目录一起使用,例如,使用绝对路径复制mailbox

cp /usr/ast/mailbox /usr/ast/mailbox.bak

如果此时在目录/usr/ast,也就是工作目录是/usr/ast,使用相对路径

cp mailbox mailbox.bak

每个目录中有两个特殊的目录".“和”,“,”.“代表当前目录,”…"代表父级目录

  • 目录主要操作
    • Create:创建一个空目录,除了"."和”…“
    • Delete:只有空目录才能被删除
    • Opendir:打开目录
    • Closedir:关闭目录
    • Readdir:返回打开目录的下一个目录项
    • Rename:重命名
    • Link:链接,可以使同一个文件出现在多个目录中,
    • Unlink:解除链接,当文件只出现在一个目录中时,删除文件

文件系统实现

文件系统布局

文件系统存储在磁盘上,一个disk可以分成多个分区,每个分区都可以有自己独立的文件系统

  • MBR:0号扇区叫作主引导记录,用于引导计算机,在MBR结尾有一个分区表,记录了磁盘分区的开始和结束位置,表中的一个记录被标记为活跃的。

  • 分区:计算机引导时,读入MBR并执行,MBR程序的第一件事是确定活跃分区并读入第一个块(引导块boot block),引导块的程序将加载该分区的操作系统,每一个分区都是以boot block开头,即使没有可执行的操作系统。文件系统分区布局如下
    在这里插入图片描述

    • 超级块(superblock):包含了文件系统的所有关键参数,在计算机启动时或者文件系统第一次使用时就会被读入内存,通常里边包括代表文件系统类型的魔数,文件系统块数量和其他关键管理信息
    • Free space mgmt:管理空闲块信息
    • I-nodes:i节点数组,每个文件一个,包含文件的各种信息
    • Root dir:根目录,存放了文件系统目录树的根
    • Files and directories:所有其他目录和文件
  • 系统引导读取文件系统流程
    在这里插入图片描述

文件实现

文件实现的关键问题是记录各个文件用了哪些块

  • 连续分配:最简单的方案,为各个文件分配连续的块存储,示意图如下,a是磁盘前40个块存放7个文件块的示意图

  • 在这里插入图片描述

    • 优点
      实现简单,只需要记录文件起始块和块数
      有出色的读取性能,只需要一次seek操作就可以读取整个文件,因为块连续,只需要找到文件第一个块就可以
    • 缺点
      随着时间推移,磁盘容易产生碎片,如上图中b,文件D和F被删除后留下了磁盘碎片,如果压缩磁盘碎片开销非常高,解决方法是利用碎片列表重用碎片,但是为了选择合适的碎片需要确定的文件最终大小,这种方式对用户很不友好,比如编辑一个文档根本不知道最终大小,只能预估。
    • 适用场景:CD-ROMs,因为CD-ROMs第一次写的时候明确知道文件的大小,并且后续不会改变,比如存放电影
  • 链式分配:每个块的第一个字都是指向下一个块的指针,其结构如图
    -在这里插入图片描述

    • 优点
      不会像连续分配那样产生外部碎片
      目录项中只需要保存文件第一个块的地址
    • 缺点、
      随机读取速度慢,因为每一次都要从头开始
      因为块中需要空间存放指针,因为存放数据不足一个块,此时如果程序读取一个块的数据就要读两个块
  • 利用内存存放表的链式分配:链式分配的两个缺点都可以通过将文件用到的块信息单独存放在内存的方式来解决,这个内存中表叫做FAT(File Allocation Table),这样块不用再存放指针,而且随机访问也变得容易
    在这里插入图片描述

    • 缺点:要使用这种方式,FAT需要常驻内存,假设1T的硬盘和1kb大小的块,可能需要2个多G的内存空间。由于这个缺点导致它的扩展性很差
  • I-nodes:为文件单独分配的一个数据结构,用来存放文件的属性和文件包含的磁盘块。一个简单的i-nodes例子
    在这里插入图片描述

    • 优点:i-nodes只需要将打开的文件的nodes信息存入内存中,节省大量的空间,使得i-nodes可以支持很大的磁盘,因此其对大磁盘的扩展性较好,因为它占用内存的大小和磁盘大小无关而和打开的文件有关
    • 解决文件块数量很多的问题:如果i-node的大小是固定的,那么文件可以存放的磁盘块地址也是固定的,为了解决这个问题,当i-node结构不能存放所有块时,那么最后一个块地址不是指向文件的数据,而是指向存放额外块的块,如上图

目录实现

  • 目录属性存储方式
  1. attributes存在目录项中,具有固定长度的目录项
    在这里插入图片描述
  2. 如果系统使用i-node,那么可以将attributes存储到i-node中,如下图,前面文件系统布局提到过i-nodes数组单独存放在分区的某个位置。因此目录项非常短,只需要存储文件名和i-node索引号
    在这里插入图片描述
  • 文件名实现方式
    1.定长文件名,比如分配255个字符固定长度来存放文件名,浪费空间
    2.变长文件名
    • 行内存放文件名:目录项的开头是目录项的长度,目录项属性是定长的,文件名放在属性后,变长的,如下图。缺点是当文件删除后,目录项会产生空隙,之后的目录项可能不匹配这个空隙
    • 在这里插入图片描述
    • 堆内存放文件名:目录项有固定的长度,将文件名放在目录项后边的堆中,如下图。这种方式的优点是当文件被删除时,产生的目录项空隙肯定可以和下一个目录项匹配,一个优化是,堆中的文件名不需要字对齐
      在这里插入图片描述
  1. 加速查找
  • 散列查找文件名:当目录中的文件非常多时,如果线性查找必然会慢,一种解决方法是每个目录构造一个散列表,用文件名的hash值求模来映射,如果hash值相同,用链表来连接
  • 缓存文件查找结果

共享文件

  • 共享文件,如下图的C目录的一个文件也出现在了B目录下,B对共享文件的联系称为链接
    在这里插入图片描述
  • 共享文件实现
  1. 目录不包含文件的磁盘块,而是列入文件中的一个小数据结构,目录指向这个结构,UNIX就是采用这种方式,小型数据结构即i-node。i-node中需要一个计数器记录当前有多少目录项指向它,当删除时,扣减计数,直到为0时,由其所有者删除
  2. 符号链接:当B链接C目录下的文件时,系统会在B目录中创建一个LINK类型的文件,只包含了共享文件的路径,当读取B目录下的共享文件时,发现类型为LINK,则拿到真实的路径读取共享文件。缺点是需要额外的开销

日志结构文件系统(LFS)

  • 基本假设
  1. 随着内存和磁盘缓存越来越大,一般程序的工作集都会保持在内存和磁盘缓存中,真正的读操作是很少的,大部分磁盘操作都是写操作
  2. 磁盘的随机操作速度慢,顺序操作速度快
  3. 传统的零碎写操作是非常低效的
    LFS实现
  • 写入流程:将磁盘抽象为一个日志,将零碎的写先缓存在内存中,当缓存达到一个段的大小时,然后作为一个段写在日志的末尾,由于是顺序写,因此可以高效的利用磁盘带宽。段中包含各种数据,比如目录块、文件数据块和i-nodes,段的开头是段内容的摘要,概述了段中包含什么内容。
  • i-node的查找处理:因为i-nodes现在散落在各个段中,所以查找i-nodes是一个很困难的任务,因此LFS引入一个i-node的映射的map,这个map保存在磁盘上,当然也会缓存在内存中
  • 磁盘压缩:磁盘的容量是有上限的,因此需要定期清理已删除的文件。清理的过程是读入一个段,如果段中的信息已经没有使用,丢弃该内容,否则写入缓冲区等待写回下一个段,清理线程从后面清理,因此磁盘成了一个大环形缓冲区。LFS详细介绍会单独写一篇文章

日志文件系统

  • 原理:以日志的方式记录文件系统下一步的操作,当系统崩溃时,重启读取日志完成未完成的任务。记录日志的操作必须幂等的,可以重复执行

文件系统管理和优化

磁盘空间管理

  • 块大小

    • 选择合适的块大小需要平衡空间浪费和性能,大尺寸的块存放小文件浪费空间,小尺寸的块查找块次数多导致访问慢(SSD除外)。确定合适的尺寸需要统计文件大小分布
    • 一个文件大小分布的研究,数据是1984年和2005年的大型研究型大学的计算机系、一个政治网站(www.electoral-vote.com)的文件分布数据。通过数据可以看出90%以下的文件是小于64KB的
      在这里插入图片描述
    • 磁盘访问时间:
      seek+rotationaldelay+transfer
    • 磁盘块大小对磁盘数据率和磁盘利用率的影响,实线是磁盘利用率随着磁盘块的增大而减小;虚线代表磁盘数据率随磁盘块增大而增大
  • 记录空闲块
    前面我们学习过空闲内存的管理,其实知识都是相通的,所以我们也很容易的想到用链表和bitmap来管理
    前面我们学习过空闲内存的管理,其实知识都是相通的,所以我们也很容易的想到用链表和bitmap来管理

    • 链表,如果块大小为1KB,一个块号用32位表示,则一个块可以存放256个空闲块,如果1T的硬盘,没有使用时,需要400万个块管理空闲块,虽然占用了很多空间,但是它们是存储在空闲块中,并且随着磁盘使用率增加,它们占用的空间会变小
      在这里插入图片描述
  • 空闲链表管理实现过程:保持一个空闲链表块在内存中,当文件删除导致块回收时,空闲链表块增加,当空闲链表块满时写回磁盘,如下图的a->b;为了避免刚删除文件导致空闲链表写回磁盘后马上又有需要写文件导致刚写回的空闲链表块又读回内存,做了一个优化,当内存中的空闲链表块满时,不是整块写回磁盘,而是写一半,然后内存中的空闲块就只剩一半左右的空闲块,来处理临时的释放和申请空闲块,减少磁盘IO
    在这里插入图片描述

    • bittmap,只需要用一位就可以表示一个块是否空闲,假设磁盘大小为1T,块大小为1KB,则需要130,000 1-KB块存储
    • 在这里插入图片描述
  • 磁盘配额

    在多用户系统中,为了避免某一个用户占用太多的磁盘空间,通常会对用户做限额,限额主要是文件数量和磁盘块数量。

    • 实现原理:当一个文件被创建或打开时,会记录到打开的文件列表中,并且根据其属性中的所有者,加载用户配额到内存中的配额表,打开的文件列表项中记录了文件所有者配额的指针,如图
    • 在这里插入图片描述
    • 配额表项结构
    1. Soft * limit:软限制
    2. Hard * limit:硬限制,绝对不能超过
    3. warnings left:剩余警告次数,当用户登录时,会校验软限制,如果其中一项超过,则会警告用户,每警告一次,该值减一,当减到0时,则用户被拒绝登录

文件系统备份

  • 备份的关键问题

    1. 是整个文件系统备份还是部分备份
    2. 对前一次备份后没有变化的文件备份是非常浪费的:增量转储
      - 最简单的,定期与全量备份比较,备份期间变化的
      - 更好的方式,与上一次备份比较
      - 优缺点:最小化了备份时间,但是恢复时可能比较复杂
    3. 备份的数据通常都是很大的,因此可能会采用压缩备份的方式,但是压缩过程中产生的一个错误可能导致整个备份文件无法使用,因此使用压缩算法时要小心
    4. 对活动文件系统备份是困难,因为可能导致数据不一致,虽然可能在晚上或空闲的时候备份,但是有时可能备份时间很长。Hutchinson在1999年提出基于文件系统快照的备份,记录文件系统关键数据结构的快照,然后在空闲的时候备份
    5. 非技术性数据安全问题
  • 备份策略

文件一致性

当系统崩溃时可能导致文件系统数据一致性问题,OS通过应用程序来分析和处理这些数据一致性问题

  • 块检查

    • 检查需要的数据结构:一个表记录文件用到的块,一个表记录空闲块

    • 程序执行步骤

        1.读出所有的i-node,从磁盘0号块开始,由i-node开始构建第一个表,如果块被使用计数加12.读出空闲链表或者bitmap检查空闲的块,如果块出现在空闲链表或bitmap中第二个表中计数加13. 对比两个表,如果文件系统一致,那么一个块有且仅出现一次在两个表中的某一个,且必须出现
      
    • 程序执行结果各种情形

      1. 文件系统一致
        在这里插入图片描述

      2. 块缺失:块不在任何一个表中,比如2号块,不会造成实际的损害,但是会造成空间的浪费,解决方法很简单,将它加入空闲链表
        在这里插入图片描述

      3. 空闲块重复:比如4号块,这种情况解决方法也很简单,减少空闲链表
        在这里插入图片描述

      4. 数据块重复:最坏的情况是一个块出现在两个或多个文件中,比如5号块,这中情形应该报告给用户,由用户处理
        在这里插入图片描述

  • 文件检查

    • 原理:从文件目录的根目录开始递归扫描,将出现的文件和目录加入一个表中,并增加其计数,然后遍历表将i-nodes的链接数(文件创建时值为1,每一个硬链接都会加1)和表的计数对比,如果一致,则文件系统一致
    • 第一种错误:i-nodes链接数目太大
      • 导致问题:即使所有目录中都删除了这个文件,该文件也不会释放,会继续占用空间。
      • 解决办法:修正i-nodes中的值为正确值
    • 第二种错误:i-nodes链接数目太小
      • 导致问题:可能会导致严重的后果,当有两个文件链接了文件,而i-nodes链接计数为1时,一旦一个文件链接删除,则i-nodes的链接计数将降为0,导致文件i-nodes和块被释放,如果被分配给其他文件,则此时另一个链接指向了错误的文件。
      • 解决办法:修正i-nodes中的链接数值为真实的链接数(即表中的计数)

文件系统性能

  • 缓存

    • 缓存结构:通过设备号和磁盘地址的hash值构建一个hash表快速查询缓存,缓存节点有三个指针,一个是用于hash冲突时,构成的一个单链表,另外两个用户构造缓存块使用顺序的双向链表、 在这里插入图片描述

    • 缓存淘汰算法:类似内存分页系统的页面淘汰算法

    • LRU算法磁盘缓存存在的问题

      1.使用LRU缓存对块的修改会在淘汰的时候写回磁盘,但是如果修改一个i-nodes块,要从队尾到队首才写回磁盘,中间需要一段时间,而此时系统崩溃,会导致文件系统不一致

        - 考虑两个因素:1.这个块是否会在稍后还会修改2.这个块是否对文件系统一致性是必不可少的- 根据上述因素对块分类1. i-nodes块2. 间接块3. 目录块4. 满数据块5. 不满数据块- 改进:将稍后可能不在需要的块放在队首,将还在写不满的块放在队尾
      
      1. 除了数据块,其他块应该立刻写回磁盘

        • 解决办法

            1. unix提供sync系统调用,系统启动时启动一个update进程,定期调用sync系统调用强制将修改写回磁盘2. Windows提供FlushFileBuffers调用,Windows采用比unix更好(某种程度更坏)的策略,采用write-through caches的方式,每当缓存中的块发生改变立刻写回磁盘,和CPU高速缓存的写穿透一样。但是需要更多的磁盘IO
          
        • Windows和unix处理的区别

          1.如果unix没有调用sync就移除磁盘,那么数据会丢失
          2. Unix的方法在Windows中也有使用,ntfs改进(日志文件系统)了来增强其可靠性

  • 块预读

    • 原理:在块被需要使用之前先将它们载入到缓存中来提高缓存命中率
    • 缺点:这种策略只能在顺序读时能提高效率
    • 实现:需要跟踪每个文件的访问方式,通过提供一个访问模式标记来判断当前读是顺序访问还是随机访问,如果不知道是什么模式,先以顺序读的模式读,读完之后立即清除标记,如果接下来读是顺序的,那么顺序读标记就会被设置

磁盘碎片整理

Windows下有defrag,用户应该定时运行(除了SSD)
SSD碎片整理会缩短其寿命

ref:https://blog.csdn.net/houwanfeimark/article/details/106972929

其它

在这里插入图片描述

相关文章:

【操作系统笔记】-文件系统

引言 之前已经学习过数据在内存中是如何表示,如何存储,但是这些存储在PC断电后数据便消失。因此我们需要一个可以持久化存储并且容量远远大于内存的结构,这一篇我们将学习,文件是如何被组织和操作的,这是一个操作系统…...

第二十一章 网络通信

计算机网络实现了堕胎计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据,编写网络应用程序前,首先必须明确网络协议…...

【漏洞复现】万户协同办公平台ezoffice wpsservlet接口存在任意文件上传漏洞 附POC

漏洞描述 万户ezOFFICE集团版协同平台以工作流程、知识管理、沟通交流和辅助办公四大核心应用 万户ezOFFICE协同管理平台是一个综合信息基础应用平台。 万户协同办公平台ezoffice wpsservlet接口存在任意文件上传漏洞。 免责声明 技术文章仅供参考,任何个人和组织使用网络应…...

【uniapp】小程序中input输入框的placeholder-class不生效解决办法

问题描述 uniapp微信小程序&#xff0c;使用input组件时&#xff0c;想要改变提示词 placeholder 的样式&#xff0c;但是使用placeholder-class 改变不了 如下&#xff1a; <input type"text" placeholder"搜索" placeholder-class"placeholde…...

SimplePIR——目前最快单服务器匿踪查询方案

一、介绍 这篇论文旨在实现高效的单服务器隐私信息检索&#xff08;PIR&#xff09;方案&#xff0c;以解决在保护用户隐私的同时快速检索数据库的问题。为了实现这一目标&#xff0c;论文提出了两种新的PIR方案&#xff1a;SimplePIR和DoublePIR。这两种方案的实现基于学习与错…...

Spring Boot中使用Swagger

1. 启用Swagger 1.1 启用注解扫描和文档接口 直接在POM文件引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency>1.2 启动swagger-u…...

uniapp实战 —— 竖排多级分类展示

效果预览 完整范例代码 页面 src\pages\category\category.vue <script setup lang"ts"> import { getCategoryTopAPI } from /apis/category import type { CategoryTopItem } from /types/category import { onLoad } from dcloudio/uni-app import { compu…...

SAP UI5 walkthrough step6 Modules

在SAPUI5 中&#xff0c;资源通常用作Modules&#xff0c;这个我们将用Message Toast 来实现告警功能 修改controller.js webapp/controller/App.controller.js sap.ui.define(["sap/ui/core/mvc/Controller","sap/m/MessageToast" ], (Controller, Mes…...

时间相关类

内容 JDK7时间相关类JDK8时间相关类 第一章 Date类 1.1 Date概述 java.util.Date类 表示特定的瞬间&#xff0c;精确到毫秒。 继续查阅Date类的描述&#xff0c;发现Date拥有多个构造函数&#xff0c;只是部分已经过时&#xff0c;我们重点看以下两个构造函数 public Dat…...

数据库事务:保障数据一致性的基石

目录 1. 什么是数据库事务&#xff1f; 1.1 ACID特性解析 2. 事务的实现与控制 2.1 事务的开始和结束 2.2 事务的隔离级别 3. 并发控制与事务管理 3.1 并发控制的挑战 3.2 锁和并发控制算法 4. 最佳实践与性能优化 4.1 事务的划分 4.2 批处理操作 5. 事务的未来发展…...

自动化操作脚本

文章目录 vbsopenCV pyautogui vbs SSH连接并执行指令操作 Dim WshShell Set WshShellWScript.CreateObject("WScript.Shell") WshShell.Run "cmd.exe" WScript.Sleep 1000 WshShell.SendKeys "ssh xcmg10.27.40.103" WshShell.SendKeys &qu…...

MVC、MVP、MVVM模式的区别

前言&#xff1a;这三个表现层框架设计模式是依次进化而形成MVC—>MVP—>MVVM。在以前传统的开发模式当中即MVC模式&#xff0c;前端人员只负责Model&#xff08;数据库&#xff09;、 View&#xff08;视图&#xff09;和 Controller /Presenter/ViewModel&#xff08;控…...

【Vue】日常错误总结(持续更新)

日常遇到的小问题汇总, 内容小篇幅少的就全放这里了, 内容多的会在Vue专栏单独分享~ 目录 【Q】 el-form-item值为 null 或 undefined显示““ 【Q】dialog内组件数据刷新总是延迟慢一拍 问题背景描述 解决方案 代码简单模拟 JS 【Q】el-input 不能输入的解决办法 方法…...

java多线程(常用方法、实现方式、线程安全问题、生命周期、线程池)

多线程相关的三组概念 程序和进程 程序&#xff08;program&#xff09;&#xff1a;一个固定的运行逻辑和数据的集合&#xff0c;是一个静态的状态&#xff0c;一般存储在硬盘中。简单来说就是我们编写的代码 进程&#xff08;process&#xff09;&#xff1a;一个正在运行的…...

Day05 linux高级系统设计 - 管道

复制文件描述符 dup函数 作用&#xff1a; 文件描述符复制 语法&#xff1a; #include <unistd.h> int dup (int oldfd); 参数&#xff1a; 所需复制得文件描述符 返回值&#xff1a; 复制到的文件描述符 功能&#xff1a; 从文件描述符表中&#xff0c;找一个最小…...

低代码:美味膳食或垃圾食品?

一、什么是低代码 低代码是一种开发方法&#xff0c;通过可视化界面和少量的编码&#xff0c;使开发者能够快速构建应用程序。它的目标是提高开发效率、降低开发成本&#xff0c;并支持快速迭代和敏捷开发。 二、低代码的优缺点 低代码开发具有以下优点&#xff1a; 快速开…...

免费网页抓取工具大全【附下载和工具使用教程】

在当今信息爆炸的时代&#xff0c;获取准确而丰富的数据对于企业决策和个人研究至关重要。而网页抓取工具作为一种高效获取互联网数据的方式&#xff0c;正逐渐成为大家解决数据需求的得力助手。本文将深入探讨网页抓取工具的种类&#xff0c;并为大家提供简单实用的页面采集教…...

Leetcode 39 组合总和

题意理解&#xff1a; 一个 无重复元素 的整数数组 candidates 和一个目标整数 target 从candidates 取数字&#xff0c;使其和 target &#xff0c;有多少种组合&#xff08;candidates 中的 同一个 数字可以 无限制重复被选取&#xff09; 这道题和之前一道组合的区别&am…...

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库 文章目录 Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库一、前言二、编译环境三、示例C/CPP程序1、总体工程结构2、示例代码3、CMakeLists.txt&#xff08;重要&#xff09;4、…...

MySQL七 | 存储引擎

目录 存储引擎 存储引擎特点 存储引擎选择 Innodb与MyISAM区别 存储引擎 默认存储引擎:InnoDB show engines;#展示当前数据库支持的存储引擎 存储引擎特点 特点InnoDBMyISAMMemory存储限制64TB有有事务安全支持--锁机制行锁表锁表锁Btree锁支持支持 支持 Hash索引--支…...

网上下载的pdf文件,为什么不能复制文字?

不知道大家有没有到过这种情况&#xff1f;在网上下载的PDF文件打开之后&#xff0c;发现选中文字之后无法复制。甚至其他功能也都无法使用&#xff0c;这是怎么回事&#xff1f;该怎么办&#xff1f; 当我们发现文件打开之后&#xff0c;编辑功能无法使用&#xff0c;很可能是…...

Linux下apisix离线安装教程

Linux下apisix离线安装教程 一、首先需要安装etcd&#xff1a;二、通过rpm离线安装apisix三、启动apisix四、安装apisix-dashboard1、安装2、更改dashboard登录账号名和密码3、运行 一、首先需要安装etcd&#xff1a; 解压缩etcd后执行以下命令&#xff1a; tar -xvf etcd-v3.…...

基于STM32 + DMA介绍,应用和步骤详解(ADC多通道)

前言 本篇博客主要学习了解DMA的工作原理和部分寄存器解析&#xff0c;针对ADC多通道来对代码部分&#xff0c;应用部分作详细讲解&#xff0c;掌握代码编程原理。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联系我删除。 本次博客开发板使用的是正点原子精英版&am…...

openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断

文章目录 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断144.1 背景信息144.2 前提条件 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断 144.1 背景信息 在SQL语句执行性能不符合预期时&#xff0c;可以查看SQL语句执行信息&#xff0c;便…...

计算机毕业设计springboot+ssm停车场车位预约系统java

管理员不可以注册账号 停车位包括车位所在楼层、车位编号、车位类型(全时间开放/高峰期开放)、预定状态等 用户预约时要求支付预约时间段的停车费用 违规行为&#xff1a;1.停车超过预约时间段 2.预约未使用 于系统的基本要求 &#xff08;1&#xff09;功能要求&am…...

打破常规思维:Scrapy处理豆瓣视频下载的方式

概述 Scrapy是一个强大的Python爬虫框架&#xff0c;它可以帮助我们快速地开发和部署各种类型的爬虫项目。Scrapy提供了许多方便的功能&#xff0c;例如请求调度、数据提取、数据存储、中间件、管道、信号等&#xff0c;让我们可以专注于业务逻辑&#xff0c;而不用担心底层的…...

系列学习前端之第 2 章:一文精通 HTML

全套学习 HTMLCSSJavaScript 代码和笔记请下载网盘的资料&#xff1a; 链接: https://pan.baidu.com/s/1-vY2anBdrsBSwDZfALZ6FQ 提取码: 6666 HTML 全称&#xff1a;HyperText Markup Language&#xff08;超文本标记语言&#xff09; 1、 HTML 标签 1. 标签又称元素&#…...

SCSS Module 这样处理配置和使用太赞了

SCSS Module 只是Scss和Css Module结合&#xff0c;可以利用SCSS对代码静态处理的能力&#xff0c;使得样式处理更强大一些&#xff0c;并不是什么新的东西&#xff0c;对比css-in-js和scoped&#xff0c;个人偏向喜欢Scss Module做样式隔离&#xff0c;先说一下优点&#xff1…...

【Unity动画】Unity 2D动画创建流程

本文以2D为案例&#xff0c;讲解Unity 播放动画的流程 准备和导入2D动画资源 外部导入序列帧生成的 Unity内部制作的 外部导入的3D动画 2.创建动画过程 打开时间轴Ctrl6 选中场景中的一个未来需要播放动画的物体 回到时间轴点击Create一个新动画片段 拖动2D动画资源放入…...

【算法每日一练]-图论(保姆级教程篇12 tarjan篇)#POJ3352道路建设 #POJ2553图的底部 #POJ1236校园网络 #缩点

目录&#xff1a; 今天知识点 加边使得无向图图变成双连通图 找出度为0的强连通分量 加边使得有向图变成强连通图 将有向图转成DAG图进行dp POJ3352&#xff1a;道路建设 思路&#xff1a; POJ2553&#xff1a;图的底部 思路&#xff1a; POJ1236校园网络 思路&#x…...

Python数据科学视频讲解:数据挖掘与建模的注意事项

1.7 数据挖掘与建模的注意事项 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.7节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括…...

unity | 动画模块之循环滚动选项框

一、作者的话 评论区有人问&#xff0c;有没有竖排循环轮播选项框&#xff0c;我就写了一个 二、效果动画 如果不是你们想要的&#xff0c;就省的你们继续往下看了 三、制作思路 把移动分成里面的方块&#xff0c;还有背景&#xff08;父物体&#xff09;&#xff0c;方块自…...

TinyMPC - CMU (卡耐基梅隆大学)开源的机器人 MPC 控制器

系列文章目录 CasADi - 最优控制开源 Python/MATLAB 库 文章目录 系列文章目录前言一、机器人硬件对比1.1 Teensy 上的微控制器基准测试1.2 机器人硬件1.3 BibTeX 二、求解器三、功能&#xff08;预期&#xff09;3.1 高效3.2 鲁棒3.3 可嵌入式3.4 最小依赖性3.5 高效热启动3.…...

C++ 对象的初始化和清理:构造函数和析构函数

目录 构造函数和析构函数 构造函数 析构函数 构造函数的分类及调用 括号法 显示法 隐式转换法 拷贝构造函数的调用时机 使用一个已经创建完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值方式返回局部对象 构造函数调用规则 初始化列表 类对象作…...

Tmux中使用Docker报错 - 解决方案

问题 进入Tmux会话后&#xff0c;在其中使用Docker可能会出现如下报错&#xff1a; Got permission denied while trying to connect to the Docker ……解决方案 退出tmux会话: tmux detach在tmux会话外部杀掉tmux进程&#xff1a; pkill -f tmux重新进入tmux&#xff1a…...

如何在WordPress中批量替换图片路径?

很多站长在使用WordPress博客或者搬家时&#xff0c;需要把WordPress文章中的图片路径进行替换来解决图片不显示的问题。总结一下WordPress图片路径批量替换的过程&#xff0c;方便有此类需求的站长们学习。 什么情况下批量替换图片路径 1、更换了网站域名 有许多网站建设初期…...

el-pagination 纯前端分页

需求&#xff1a;后端把所有数据都返给前端&#xff0c;前端进行分页渲染。 实现思路&#xff1a;先把数据存储到一个大数组中&#xff0c;然后调用方法进行切割。主要使用数组的slice方法 所有代码&#xff1a; html <template><div style"padding: 20px&qu…...

基于springboot的校园二手市场

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

【开源】基于Vue和SpringBoot的在线课程教学系统

项目编号&#xff1a; S 014 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S014&#xff0c;文末获取源码。} 项目编号&#xff1a;S014&#xff0c;文末获取源码。 目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2…...

Mysql分布式集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上

1.1 目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1 数据分片 MySQL集群Cluster将数据分成多个片段&#xff0c;每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上&#xff0c;提高系统的性能和可扩展性。 2. 数据同步 MySQL集群Cluster使…...

身份认证技术

身份认证是对系统的用户进行有效性、真实性验证。 1&#xff0e;口令认证方式 使用口令认证方式&#xff0c;用户必须具有一个唯一的系统标识&#xff0c;并且保证口令在系统的使用和存储过程中是安全的&#xff0c;同时口令在传输过程中不能被窃取、替换。另外特别要注意的是在…...

Centos7、Mysql8.0 load_file函数返回为空的终极解决方法--暨selinux的深入理解

零、问题背景 最近想换房&#xff0c;为了方便自己对比感兴趣的房子&#xff0c;因此决定将目标房源的基本信息放在表里&#xff0c;特别是要一目了然的看到众多房子的各种图纸和照片&#xff0c;因此决定要在Mysql8.0.34数据库中以二进制形式保存图片&#xff08;抛开合理性和…...

基于Spring Boot的水产养殖管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot的水产养殖管理系统,jav…...

LCR 090. 打家劫舍 II(leetcode)动态规划

文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中&#xff0c;我们将要详细介绍一下LeetcodeLCR 090. 打家劫舍 II。采用动态规划解决&#xff0c;这是一道经典的多状态dp问题 一、题目分析…...

【小沐学Python】Python实现语音识别(Whisper)

文章目录 1、简介1.1 whisper简介1.2 whisper模型 2、安装2.1 whisper2.2 pytorch2.3 ffmpeg 3、测试3.1 命令测试3.2 代码测试&#xff1a;识别声音文件3.3 代码测试&#xff1a;实时录音识别 结语 1、简介 https://github.com/openai/whisper 1.1 whisper简介 Whisper 是…...

Nginx负载均衡实战

&#x1f3b5;负载均衡组件 ngx_http_upstream_module https://nginx.org/en/docs/http/ngx_http_upstream_module.html upstream模块允许Nginx定义一组或多组节点服务器组&#xff0c;使用时可以通过多种方式去定义服务器组 样例&#xff1a; upstream backend {server back…...

Redis skiplist源码解析(支持范围查询)

跳表是一个多层的有序链表&#xff0c;在跳表中进行查询操作时&#xff0c;查询代码可以从最高层开始查询。层数越高&#xff0c;结点数越少&#xff0c;同时高层结点的跨度会比较大。因此&#xff0c;在高层查询结点时&#xff0c;查询一个结点可能就已经查到了链表的中间位置…...

MVSNeRF:多视图立体视觉的快速推广辐射场重建(2021年)

MVSNeRF&#xff1a;多视图立体视觉的快速推广辐射场重建&#xff08;2021年&#xff09; 摘要1 引言2 相关工作3 MVSNeRF实现方法3.1 构建代价体3.2 辐射场的重建3.3 体渲染和端到端训练 3.4 优化神经编码体 Anpei Chen and Zexiang Xu and Fuqiang Zhao et al. MVSNeRF: Fast…...

华为OD机试真题-CPU算力分配-2023年OD统一考试(C卷)

题目描述: 现有两组服务器A和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能力,B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换,求两组服务器中,用于交换的CPU的算力,…...

校验数据是否重叠(各种操作符>,<,>=,<=,or,and)

最近接到一个需求&#xff0c;其中部分功能涉及到数据的重叠校验&#xff0c;并且录入的数据需要包含各种操作符。如果只通过java代码来查询并进行循环判断的话&#xff0c;判断情况会很复杂&#xff0c;幸好有同事的帮忙提供了一个用sql查询重叠部分的方法&#xff0c;现在分享…...