操作系统(四)——文件管理

news2024/9/29 3:22:25

文章目录

  • 第四章 文件管理
    • [4.1.1] 初识文件管理
      • (一)文件的属性
      • (二)文件内部的数据应该怎样组织起来
      • (三)文件之间应该怎样组织起来
      • (四)操作系统应该向上提供哪些功能
      • (五)从上往下看,文件应如何存放在外存
      • (六)其他需要由操作系统实现的文件管理功能
      • 小结
    • [4.1.2] 文件的逻辑结构
      • (一)无结构文件
      • (二)有结构文件
      • (三)有结构文件的逻辑结构
        • (1)顺序文件
        • (2)索引文件
        • (3)索引顺序文件
        • (4)多级索引顺序文件
      • 小结
    • [4.1.3] 文件目录
      • (一)文件控制块
      • (二)目录结构
        • (1)单级目录结构
        • (2)两级目录结构
        • (3)多级目录结构
        • (4)无环图目录结构
      • (三)索引结点(FCB的改进)
      • 小结

第四章 文件管理

[4.1.1] 初识文件管理

image-20230417091146334

  计算机中存放了各种各样的文件,一个文件有哪些属性?

  文件内部的数据应该怎样组织起来?

  文件之间又应该怎么组织起来?

  从下往上看,操作系统应提供哪些功能,才能为它的上层,即方便用户、应用程序使用文件?

  从上往下看,文件数据应该怎么存放在外存(磁盘)上?

  从最熟悉的Windows操作系统出发。

(一)文件的属性

  一个文件有哪些属性?

  文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件

  标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称(所以这个名称不向用户展示,右键-属性里也没有,这是操作系统内部自己用的)。(比如,虽然我同一目录下不能有重名文件,但是不同目录下可以有,比如两个目录下都有test.txt文件,那么该怎么区分他俩?就需要唯一标识符)

  类型:指明文件的类型。

  位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)。

  大小:指明文件大小。

  创建时间、上次修改时间、文件所有者信息

  保护信息:对文件进行保护的访问控制信息。(用户组)

(二)文件内部的数据应该怎样组织起来

image-20230417092148422

  无结构文件(如文本文件)——由一些二进制或字符流组成,又称“流式文件”。

image-20230417092217539

  有结构文件(如数据库表)——由一组相似的记录组成,又称“记录式文件”。

  记录是一组相关数据项的集合。(如上图中的一行就是一个记录)

  数据项是文件系统中最基本的数据单位。(如上图中的某行某列)

image-20230417092426407

  有结构文件中,各个记录间应该如何组织的问题——应该顺序存放?还是用索引表来表示记录间的顺序?——这是“文件的逻辑结构”重点要探讨的问题。

(三)文件之间应该怎样组织起来

image-20230417092633660

image-20230417092657376

  所谓的“目录”其实就是我们熟悉的“文件夹”。

  用户可以自己创建一层一层的目录,各层目录中存放相应的文件。系统中的各个文件就通过一层一层的目录合理有序的组织起来了。

  目录其实也是一种特殊的有结构文件(由记录组成),如何实现文件目录是之后会重点探讨的问题。

(四)操作系统应该向上提供哪些功能

向上提供的几个最基本的功能

  • 创建文件(create系统调用)

  • 删除文件(delete系统调用)

  • 读文件(read系统调用)

  • 写文件(write系统调用)

  • 打开文件(open系统调用)

  • 关闭文件(close系统调用)

    (这里的打开、关闭文件,和我们理解的双击某文件打开、点叉号关闭是不太一样的,后续再说)

    读/写文件之前,需要“打开文件”。读/写文件结束之后,需要“关闭文件”。

  可以用几个基本操作完成更复杂的操作,比如“复制文件”,先创建一个新的空文件,再把原文件读入内存,再将内存中的数据写到新文件中。

  操作系统在背后做的处理会在以后进行探讨。

image-20230417093012424

  可以“创建文件”,点击新建后,图形化交互进程在背后调用了“create系统调用”。

image-20230417093055546

  可以“读文件”,将文件数据读入内存,才能让CPU处理(双击后,“记事本”应用程序通过操作系统提供的“读文件”功能,即read系统调用,将文件数据从外存读入内存,并显示在屏幕上)。

  可以“写文件”,将更改过的文件数据写回外存(我们在“记事本”应用程序中编辑文件内容,点击“保存”后,“记事本”应用程序通过操作系统提供的“写文件”功能,即write系统调用,将文件数据从内存写回外存)。

image-20230417093416182

  可以“删除文件”(点了“删除”之后,图形化交互进程通过操作系统提供的“删除文件”功能,即delete系统调用,将文件数据从外存中删除)。

(五)从上往下看,文件应如何存放在外存

image-20230417094015551

  与内存一样,外存也是由一个个存储单元组成的,每个存储单元可以存储一定量的数据(如1B)。每个存储单元对应一个物理地址。

  类似于内存分为一个个的“内存块”,外存会分为一个个“块/磁盘块/物理块”。每个磁盘块的大小是相等的,每块一般包含2的整数幂个地址(如本例中,一块包含 2 10 2^{10} 210个地址,即1KB)。同样类似的是,文件的逻辑地址也可以分为(逻辑块号,块内地址),操作系统同样需要将逻辑地址转换为外存的物理地址(物理块号,块内地址)的形式。块内地址的位数取决于磁盘块的大小。

  操作系统以“块”为单位为文件分配存储空间,因此即使一个文件大小只有10B,但它依然需要占用1KB的磁盘块。外存中的数据读入内存时同样以块为单位。

image-20230417094651437

image-20230417094703964

  文件是否应该需要存放在连续的几个磁盘块中?

  文件如果比较大,是不是应该存放在离散的几个磁盘块中?

  对于空闲的磁盘块,操作系统又应该怎样管理?

  这些是在“文件的物理结构”部分会探讨的内容。

(六)其他需要由操作系统实现的文件管理功能

  文件共享:使多个用户可以共享使用一个文件。

  文件保护:如何保证不同的用户对文件有不同的操作权限。

  之后会结合Windows操作系统的实际应用进行探讨。

小结

image-20230417095028771

[4.1.2] 文件的逻辑结构

文件的逻辑结构

  • 无结构文件
  • 有结构文件
    • 顺序文件
    • 索引文件
    • 索引顺序文件

  所谓的“逻辑结构”,就是指在用户看来,文件内部的数据应该是如何组织起来的。

  而“物理结构”指的是在操作系统看来,文件的数据是如何存放在外存中的。

  其实在数据结构当中,我们也接触过“逻辑结构”和“物理结构”,如“线性表”就是一种逻辑结构,在用户角度看来,线性表就是一组有先后关系的元素序列。

  但是,对于一种逻辑结构来说,是可以用不同的物理结构来实现的。如:顺序表、链表。顺序表的各个元素在逻辑上相邻,在物理上也相邻;而链表的各个元素在物理上可以是不相邻的。因此,顺序表可以实现“随机访问”,而“链表”无法实现随机访问。

  可见,算法的具体实现与逻辑结构、物理结构都有关(文件也一样,文件操作的具体实现与文件的逻辑结构、物理结构都有关)

(一)无结构文件

  按文件是否有结构分类,可以分为无结构文件、有结构文件两种。

  无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如:Windows操作系统中的.txt文件。

image-20230417101145676

  文件内部的数据其实就是一系列字符流,没有明显的结构特性。因此也不用探讨无结构文件的“逻辑结构”问题。

  因此我们重点关注的是有结构文件。

(二)有结构文件

  有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录由若干个数据项组成。如:数据库表文件。一般来说,每条记录有一个数据项可作为关键字(作为识别不同记录的ID)。

image-20230417101404868

  这是一张数据库表,记录了各个学生的信息。

  每个学生对应一条记录,每条记录由若干个数据项组成。

  在本例中,“学号”即可作为各个记录的关键字。


  根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录可变长记录两种。

定长记录

  如上例中,设置学号占32字节,姓名占32字节,性别占4字节,专业占60字节。

image-20230417103425532

  这个有结构文件由定长记录组成,每条记录的长度都相同(共128B)。各数据项都处在记录中相同的位置,具有相同的顺序和长度(前32B一定是学号,之后32B一定是姓名…)

可变长记录

  其实可变长记录才是我们生活中最常见的。

image-20230417103655855

image-20230417103750888

  这个有结构文件由可变长记录组成,由于各个学生的特长存在很大区别,因此“特长”这个数据项的长度不确定,这就导致了各条记录的长度也不确定。当然,没有特长的学生甚至可以去掉“特长”数据项。

(三)有结构文件的逻辑结构

有结构文件的逻辑结构

  • 顺序文件
  • 索引文件
  • 索引顺序文件

  根据有结构文件中的各条记录在逻辑上如何组织,可以分为这三类。

(1)顺序文件

  顺序文件:文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储链式存储

image-20230417112807638

  顺序存储——逻辑上相邻的记录,物理上也相邻(类似于顺序表)。

image-20230417112834248

  链式存储——逻辑上相邻的记录,物理上不一定相邻(类似于链表)。

顺序文件

  • 串结构

    记录之间的顺序与关键字无关。通常按照记录存入的时间决定记录的顺序。

  • 顺序结构

    记录之间的顺序按关键字顺序排列。

  假设:已经知道了文件的起始地址(也就是第一个记录存放的位置)

  思考1:能否快速找到第i个记录对应的地址?(即能否实现随机存取)

  思考2:能否快速找到某个关键字对应的记录存放的位置?

  我们直接给出结论,如下。

顺序文件

  • 链式存储

    无论是定长/可变长记录,都无法实现随机存取,每次只能从第一个记录开始依次往后查找。

  • 顺序存储

    • 可变长记录

      无法实现随机存取。每次只能从第一个记录开始依次往后查找。

    • 定长记录

      • 可实现随机存取。记录长度为L,则第i个记录存放的相对位置是i*L
      • 若采用串结构,无法快速找到某关键字对应的记录;
      • 若采用顺序结构,可以快速找到某关键字对应的记录(如折半查找)。

    image-20230419154928741

  结论:定长记录的顺序文件,若物理上采用顺序存储,则可实现随机存取;若能再保证记录的顺序结构,则可实现快速检索(即根据关键字快速找到对应记录)

  注:一般来说,考试题目中所说的“顺序文件”指的是物理上顺序存储的顺序文件(即不是链式存储)。之后的讲解中提到的顺序文件也默认如此。

  可见,顺序文件的缺点增加/删除一个记录比较困难(如果是串结构则相对简单)。

(2)索引文件

  对于可变长记录文件,要找到第i个记录,必须先顺序的查找前i-1个记录,但是很多应用场景中又必须使用可变长记录。如何解决这个问题?

image-20230419155330864

  索引表本身是定长记录的顺序文件。因此可以快速找到第i个记录对应的索引项。

  可将关键字作为索引号内容,若按关键字顺序排列,则还可以支持按照关键字折半查找。

  每当要增加/删除一个记录时,需要对索引表进行修改。由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合。

  另外,可以用不同的数据项建立多个索引表。如:学生信息表中,可用关键字“学号”建立一张索引表。也可用“姓名”建立一张索引表。这样就可以根据“姓名”快速地检索文件了。

(3)索引顺序文件

  思考索引文件的缺点:每个记录对应一个索引表项,因此索引表可能会很大。

  比如:文件的每个记录平均只占8B,而每个索引表项占32个字节,那么索引表项都要比文件内容本身大4倍,这样对存储空间的利用率就太低了。

  索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项

image-20230419160301866

  首先将文件记录进行分组。在本例中,学生记录按照学生姓名的开头字母进行分组。每个分组就是一个顺序文件,分组内的记录不需要按关键字排序。

  之后,每个分组对应索引顺序文件中的一个索引项。索引顺序文件的索引项也不需要按关键字顺序排列,这样可以极大地方便新表项的插入。(定长记录、串结构)

  用这种策略,确实可以让索引表“瘦身”,但是是否会出现不定长记录的顺序文件检索速度慢的问题呢?


索引顺序文件——检索效率分析

  若一个顺序文件有10000个记录,则根据关键字检索文件,只能从头开始顺序查找(这里指的并不是定长记录、顺序结构的顺序文件),平均需查找5000个记录

  若采用索引顺序文件结构,可把10000个记录分为 10000 = 100 \sqrt{10000}=100 10000 =100组,每组100个记录。则需要先顺序查找索引表找到分组(共100个分组,因此索引表长度为100,平均需要查50次),找到分组后,再在分组中顺序查找记录(每个分组100个记录,因此平均需要查50次)。可见,采用索引顺序文件结构后,平均查找次数减少为50+50=100次

  同理,若文件共有 1 0 6 10^6 106个记录,则可分为1000个分组,每个分组1000个记录。根据关键字检索一个记录平均需要查找500+500=1000次。这个查找次数依然很多,如何解决呢?

(4)多级索引顺序文件

  为了进一步提高检索效率,可以为顺序文件建立多级索引表。例如,对于一个含 1 0 6 10^6 106个记录的文件,可先为该文件建立一张低级索引表,每100个记录为一组,故低级索引表中共有10000个表项(即10000个定长记录),再把这10000个定长记录分组,每组100个,为其建立顶级索引表,故顶级索引表中共有100个表项。

image-20230419162716365

  此时,检索一个记录平均需要查找50+50+50=150次。

小结

image-20230419162804171

image-20230419162851652

[4.1.3] 文件目录

image-20230419163217326

  这种目录结构对于用户来说有什么好处?

  文件之间的组织结构清晰,易于查找。

  编程时也可以很方便地用文件路径找到一个文件。如下。这样,用户可以轻松实现“按名存取”。

FILE *fp;
fp = fopen("F:\data\myfile.dat");

  从操作系统的角度来看,这些目录结构应该是如何实现的?

文件目录

(就是我们很熟悉的Windows操作系统的“文件夹”)

  • 文件控制块(实现文件目录的关键数据结构)
  • 目录结构
    • 单级目录结构
    • 两级目录结构
    • 多级目录结构(树形目录结构)
    • 无环图目录结构
  • 索引结点(对文件控制块的优化)

(一)文件控制块

image-20230419163744724

image-20230419163758595

  用一个所谓的“目录表”,来表示这个目录下存放了哪些东西。每一个文件、文件夹,都会对应其中一个表项。(目录/文件夹是一种特殊的文件了)

  目录本身就是一种有结构文件,由一条条记录组成。每条记录对应一个放在该目录下的文件。

  当我们双击“照片”后,操作系统会在这个目录表中找到关键字“照片”对应的目录项(也就是记录),然后从外存中将“照片”目录的信息读入内存,于是,“照片”目录中的内容就可以显示出来了。

image-20230419164548624

  目录文件中的一条记录就是一个“文件控制块(FCB)”。(就是上图所谓“目录表”里面的一行)

  FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项

  FCB中包含了文件的基本信息文件名物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)。

  最重要、最基本的还是文件名、文件存放的物理地址

  FCB最终要的是实现了文件名和文件之间的映射。使用户(用户程序)可以实现“按名存取”。


image-20230419171638828

  需要对目录进行哪些操作?

  搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项。

  创建文件:创建一个新文件时,需要在其所属的目录中增加一个目录项。

  删除文件:当删除一个文件时,需要在目录中删除相应的目录项。

  显示目录:用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性。

  修改目录:某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项(如:文件重命名)。

(二)目录结构

(1)单级目录结构

  早期操作系统并不支持多级目录,整个系统中只建立一张目录表,每个文件占一个目录项。

image-20230419172719809

  单级目录实现了“按名存取”,但是不允许文件重名

  在创建一个文件时,需要先检查目录表中有没有重名文件,确定不重名后才能允许建立文件,并将新文件对应的目录项插入目录表中。

  显然,单级目录结构不适用于多用户操作系统。(多个用户使用一个系统时,很容易使文件名重复)

(2)两级目录结构

  早期的多用户操作系统,采用两级目录结构。分为主文件目录(MFD,Master File Directory)和用户文件目录(UFD,User File Directory)。

image-20230419173040070

image-20230419173143186

  允许不同用户的文件重名。文件名虽然相同,但是对应的其实是不同的文件。

  除了允许重名之外,在采用了两级目录结构之后,也能够对不同用户实现访问限制。可以在目录上实现访问限制,检查此时登录的用户名是否匹配。但是两级目录结构依然缺乏灵活性,用户不能对自己的文件进行分类。

(3)多级目录结构

image-20230419173430561

  又称树形目录结构

  用户(或用户进程)要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。各级目录之间用“/”隔开。从根目录出发的路径称为绝对路径

  例如:自拍.jpg的绝对路径是"/照片/2015-08/自拍.jpg"

  系统根据绝对路径一层一层地找到下一级目录。刚开始从外存读入根目录的目录表;找到“照片”目录的存放位置后,从外存读入对应的目录表;再找到“2015-08”目录的存放位置,再从外存读入对应目录表;最后才找到文件“自拍.jpg”的存放位置。整个过程需要3次读磁盘I/O操作

  很多时候,用户会连续访问同一目录内的多个文件(比如:接连查看“2015-08”目录内的多个照片文件),显然,每次都从根目录开始查找,是很低效的。因此可以设置一个“当前目录”。

  例如,此时已经打开了“照片”的目录文件,也就是说,这张目录表已调入内存,那么可以把它设置为“当前目录”。当用户想要访问某个文件时,可以使用从当前目录出发的“相对路径”。

  在Linux中,“.”表示当前目录,因此如果“照片”是当前目录,则“自拍.jpg”的相对路径为:“./2015-08/自拍.jpg”。从当前路径出发,只需要查询内存中的“照片”目录表,即可知道"2015-08"目录表的存放位置,从外存调入该目录,即可知道"自拍.jpg"存放的位置了。

  可见,引入“当前目录”和“相对路径”后,磁盘I/O的次数减少了。这就提升了访问文件的效率。

  树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,树形结构不便于实现文件的共享。为此,提出了“无环图目录结构”。

(4)无环图目录结构

image-20230419175149513

  可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)(目录其实本身也是一种特殊的文件了)。

  那么在引用了共享功能之后,对于文件的删除就不能像以前那样了(只要删除一个文件就直接把这个文件的实际数据给删除),因为这个文件有可能是被多个用户使用的。所以,为了解决这一问题,需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。

  只有共享计数器减为0时,才删除结点

  注意:共享文件不同于复制文件。在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化

(三)索引结点(FCB的改进)

image-20230419175658176

  由一系列的FCB组成了文件目录。但是其实操作系统在查找各级目录的过程当中,只需要使用“文件名”这个信息就可以了,而其他的那些冗余的信息暂时不需要,而只有文件名匹配时,才需要去关心文件的其他信息,读出物理位置等。因此可以考虑让目录表简化来提升效率。

image-20230419175836039

  由于在查找各级目录结构的时候不用关心除文件名外其他的信息,那么就可以把这些其他的信息先存放到另外一个地方(文件对应的索引结点当中)。每个文件都有一个唯一的索引结点。

  而采用了索引结点机制后,文件目录中只包含文件名、索引结点指针这两个信息。这样一来,目录表占用的空间就会小很多。

  思考一下,这种机制到底是怎样提高我们查找一个文件的效率的呢?

  假设一个FCB是64B,磁盘块的大小为1KB,则每个盘块中只能存放16个FCB。若一个文件目录中共有640个目录项,则共需要占用640/16=40个盘块。因此按照某文件名检索该目录,平均需要查询320个目录项,从而平均需要启动磁盘20次(每次磁盘I/O读入一块)

  若使用索引结点机制,文件名占14B,索引结点指针占2B,则每个盘块可存放64个目录项,那么按文件名检索目录平均只需要读入320/64=5个磁盘块。显然,这将大大提升文件检索速度

image-20230419180426057

  当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据“存放位置”即可找到文件。

  存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。

  相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等。

小结

image-20230419180634920

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/438484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

geoserver发布矢量切片服务

以前切片服务只支持栅格切片,后来技术更新发展,也支持矢量切片了,好处是不失真,而且很快,geoserver本身也不支持这种服务,但是他提供了一个插件,去官网下载下来,放到lib文件夹里&…

2023/4/16周报

目录 摘要 论文阅读 1、标题和现存问题 2、模型构建 3、方法实现 4、实验结果 5、扩展实验 深度学习 1、GNN特点 2、原理 3、GNN数据处理 总结 摘要 本周在论文阅读上,阅读了一篇基于图神经网络的技术识别链接预测方研究论文。通过融合了时间特征的专利…

镭速Raysync v6.6.8.0版本发布

最近镭速发布了v6.6.8.0版本,已经发布上线了。主要更新内容有服务器下发任务支持指定客户端,客户端增加日志清理和日志压缩,自动删除源文件保持源目录结构,支持将文件投递给其他成员等功能,详细的更新内容如下&#xf…

ELK日志收集告警

elastic stack elastic search 日志持久化filebeats 日志收集kibana 日志展示elaticalert 日志告警 elastalert官网Elastic Observability APM 指标监控 java-agent 基于logback根据level进行日志的切分聚合宿主机上安装filebeats 配置inputs插件配置采集路径配置多行匹配规则…

第五天 CUDA Runtime API

图中可以看到,Runtime API 是基于 Driver API 之上开发的一套 APIDriver API 基本都是 cu 开头的,而Runtime API 基本都是以 cuda 开头的 Runtime API 概述 CUDA Runtime是封装了CUDA Driver的高级别更友好的APIcudaruntime需要引入cudart这个so文件上下…

系统分析师案例题【系统设计篇(Web开发)】

目录 1、Web综合知识考察 2、单台机器到数据库与Web服务器分离 3、应用服务器集群 3.1 负载均衡 3.2 Session 共享机制 3.3 有状态和无状态 4、持久化技术 5、数据库读写分离化 6、缓存技术 7、Redis 7.1 Redis集群切片与分片 7.2 Redis分布式存储 7.3 Redis数据类…

Windows使用ngrok实现本地程序外网域名访问-详细教程

需求分析 同事要求在外网以域名的方式,访问我本地的程序,故需要将localhost:8080映射到外网,让同事可以通过:域名/接口 的形式访问到本地程序的功能接口 安装 进入官网:https://ngrok.com/ 点击顶部Download&#x…

十三、市场活动:全部导出

功能需求:批量导出市场活动 用户在市场活动主页面,点击"批量导出"按钮,把所有市场活动生成一个excel文件,弹出文件下载的对话框; 用户选择要保存的目录,完成导出市场活动的功能. *导出成功之后,页面不刷新 功能分析:导出市场活动 1.给批量…

打卡Android学习—Compose 布局 和 修饰符

我们将通过解释 布局 和 修饰符 的基础知识 来开始我们的旅程。我们将介绍他们是如何协同工作的,Compose 提供了什么开箱即用的API,以及如何漂亮地设计您的UI 布局——因为 Compose 中的几乎所有内容都是布局 布局是Compose UI的核心组件,使…

( “树” 之 BST) 669. 修剪二叉搜索树 ——【Leetcode每日一题】

二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点。 二叉查找树中序遍历有序。 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&…

机器学习——核函数

问:已知三维空间中的两个样本点分别为(2,4,5)和(1,2,3),定义核函数表达式为:试计算这两个样本点映射到十维空间后的 答:首先计算两个样本点的平方内积2*14*25*325 然后代入核函数表…

互联网医院软件|互联网医院系统开发|在线问诊提高医疗效率

互联网医院系统源码开发设计理念是以患者为中心,将医院的各个科室、医生资源进行有效的整合和调配。互联网医院系统开发是基于最新的Web技术和云计算技术所构建的一种全新的医疗信息化平台,可以通过网页、小程序等多种方式,为患者提供在线预约…

Logstash:通过 lookups 来丰富数据

如果你想了解更多关于 lookup 的内容,请参阅文章 “Elastic:开发者上手指南” 中的 “丰富数据及 lookup” 章节。在今天的文章中,我来总结在 Logstash 中一些常用的 lookups。如下的这些插件可以帮助你使用附加信息丰富数据,例如…

基于深度学习的车型识别系统(Python+清新界面+数据集)

摘要:基于深度学习的车型识别系统用于识别不同类型的车辆,应用YOLO V5算法根据不同尺寸大小区分和检测车辆,并统计各类型数量以辅助智能交通管理。本文详细介绍车型识别系统,在介绍算法原理的同时,给出Python的实现代码…

浏览器强缓存与协商缓存

一、强缓存 强制缓存的思想是,在浏览器内置数据库中缓存每次请求中 “可以被缓存” (受到一些关键字的管控)的静态资源如 image, css, js 文件, 当第二次请求被缓存过的资源时候,会通过校验两个字段 Expires 和 Cache-…

AAAI 2023MOVEDepth:基于单目线索和速度指导的自监督多帧深度估计

文章目录 解决的问题实施细节总结 会议/期刊:2023 AAAI 论文题目:《Crafting Monocular Cues and Velocity Guidance for Self-Supervised Multi-Frame Depth Learning》 论文链接:[JeffWang987/MOVEDepth: AAAI 2023]Crafting Monocular Cue…

Flutter TextField 交互实例 —— 新手礼包

大家好,我是 17。 新手礼包一共 3 篇文章,每篇都是描述尽量详细,实例讲解,包会! Flutter Row 实例 —— 新手礼包Flutter TextField UI 实例 —— 新手礼包Flutter TextField 交互实例 —— 新手礼包 本篇包含所有常…

Unity打包WebGL: 导入Vue

Unity打包WebGL: 导入Vue 1. 介绍 1.1 任务 记录将Unity项目打包成WebGL,并集成到Vue项目中的过程。 1.2 环境 Unity:2021.3Vue: 2 2. Unity项目 2.1 UI界面 2.2 添加插件 构建WebGL项目需要添加一个.jslib文件,用于Unity脚本函数与JavaScript函数…

【FocalNet】学习笔记

1. 介绍 “FocalNet是map-based还是token-based模型呢?” FocalNet是token-based模型,与常见的【基于 feature map 的CNN】不同; 2. 模型代码 2.1 环境配置 [DINO | FocalNet-DINO] 2.1.1 配置CUDA11.1 Summary Driver: Not Selected…

FreeRTOS 时间管理

文章目录 一、FreeRTOS 延时函数1. 函数 vTaskDelay()2. 函数 prvAddCurrentTaskToDelayedList()3. 函数 vTaskDelayUntil() 二、FreeRTOS 系统时钟节拍 一、FreeRTOS 延时函数 1. 函数 vTaskDelay() 在 FreeRTOS 中延时函数也有相对模式和绝对模式,不过在 FreeRT…