精华内容
下载资源
问答
  • 不过应该不影响正常使用后两行日志的情况,我估计是你系统的glibc和gcc支持库版本不对或缺失,libatomic.so文件我查了一下,来源于gcc项目。你安装一下对应依赖看看能不能解决问题查看了一下gcc版本,应该是最新版了...

    前一个日志表示你fontconfig有问题,估计是版本不对。不过应该不影响正常使用

    后两行日志的情况,我估计是你系统的glibc和gcc支持库版本不对或缺失,libatomic.so文件我查了一下,来源于gcc项目。你安装一下对应依赖看看能不能解决问题

    查看了一下gcc版本,应该是最新版了,如下

    Name : gcc

    Version : 10.1.1

    发布 : 1.fc32

    Architecture : x86_64

    Size : 81 M

    源 : gcc-10.1.1-1.fc32.src.rpm

    Repository : @System

    来自仓库 : updates

    Summary : Various compilers (C, C++, Objective-C, ...)

    URL : http://gcc.gnu.org

    协议 : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and

    : LGPLv2+ and BSD

    Description : The gcc package contains the GNU Compiler Collection version 10.

    : You'll need this package in order to compile C code.

    glibc版本,安装了最新版,如下

    Name : glibc

    Version : 2.31

    发布 : 4.fc32

    Architecture : x86_64

    Size : 16 M

    源 : glibc-2.31-4.fc32.src.rpm

    Repository : @System

    来自仓库 : updates

    Summary : The GNU libc libraries

    URL : http://www.gnu.org/software/glibc/

    协议 : LGPLv2+ and LGPLv2+ with exceptions and GPLv2+ and GPLv2+ with

    : exceptions and BSD and Inner-Net and ISC and Public Domain and

    : GFDL

    Description : The glibc package contains standard libraries which are used by

    : multiple programs on the system. In order to save disk space and

    : memory, as well as to make upgrading easier, common system code

    : is kept in one place and shared between programs. This particular

    : package contains the most important sets of shared libraries: the

    : standard C library and the standard math library. Without these

    : two libraries, a Linux system will not function.

    展开全文
  • 操作系统:文件系统的实现

    千次阅读 2020-12-31 14:39:13
    目录一、文件系统结构二、文件系统实现1.概述2.虚拟文件系统三、目录实现1.线性列表2.哈希表四、磁盘空间的分配方法1.连续分配2.链接分配3.索引分配五、磁盘空闲空间的管理1.位向量2.链表3.组4.计数六、文件系统的...

    一、文件系统结构

    磁盘的逻辑单元为,内存和磁盘之间的I/O传输以为单位执行。

    磁盘的特点

    1. 可以原地重写,可以从磁盘上读一块儿,修改该块,并将它写回到原来的位置
    2. 可以直接访问磁盘上的任意一块。因此,可以方便地按顺序或随机访问文件

    文件系统需要提供高效快捷磁盘访问,以便轻松存储、定位、提取数据。即存储文件、访问文件

    文件系统有两个不同的设计问题

    1. 访问问题:如何定义文件系统对用户的接口
    2. 存储问题:创建数据结构和算法,把逻辑文件系统映射到物理外存设备

    文件系统本身通常由许多不同层组成。每层实际利用更低层功能,创建新的功能,以用于更高层的服务。
    在这里插入图片描述
    设备驱动程序可以作为翻译器,他的输入作为高级指令,输出由底层的、硬件特定指令组成。
    基础文件系统只需向适当设备驱动程序发送命令。
    逻辑文件系统通过文件控制块维护文件结构。
    文件控制块(FCB)包含有关文件的信息,包括所有者、权限、文件内容的位置等。

    大多数操作系统支持多种不同的文件系统,举例:

    • CD-ROM ISO9660 文件格式
    • Unix 文件系统(Unix File System)
    • Windows文件系统:FAT(File Allocation Table),FAT32, FAT64,NTFS(Windows NT File System)
    • Linux 文件系统:可扩展文件系统(Extended file system),分布式文件系统(Distributed File System)

    二、文件系统实现

    1.概述

    在磁盘上,文件系统包括的信息有

    1. 如何启动存储在那里操作系统
    2. 总的块数
    3. 空闲块的数目和位置
    4. 目录结构
    5. 各个具体文件 等

    上述许多结构会在之后详细讲述。这里简述如下:

    • 引导控制块(每个卷):可以包含从该卷引导操作系统的所需信息。如果磁盘不包括操作系统,则这块的内容为空。UFS称为引导块(boot block),NFS称为分区引导扇区(partition boot sector)
    • 卷控制块(每个卷):包括卷的详细信息(分区的块数、块的大小、空闲块的数量和指针、空闲
      FCB 的数量和指针等)。UFS称为超级块儿(super block),NTFS主控文件表(master boot sector)
    • 每个文件的FCB包含该文件的许多详细信息。他有一个唯一的标识号,以便与目录条目相关联
    • 每个文件系统的目录结构用于组织文件

    内存中的信息用于管理文件系统并通过缓存来提高性能,这些数据在安装文件装系统时被加载,在文件系统操作期间被更新,在卸载是被卸载。这些结构类型包括:

    1. 每个进程的打开文件表:包括一个指向系统的打开文件表中合适条目的指针和其他信息
    2. 整个系统的打开文件表:包括每个打开文件的FCB副本和其他信息

    创建一个新文件

    1. 应用程序调用逻辑文件系统。逻辑文件系统指导目录结构的格式,它会分配一个新的FCB
    2. 系统将相应的目录信息读入内存
    3. 更新目录结构和FCB
    4. 将结果写回磁盘

    一旦文件被创建,就能用于I/O,不过,首先他要被打开。系统调用open()将文件名传到逻辑文件系统,系统调用open():

    1. 首先搜索整个系统的打开文件表,查看是否已经被打开,如果是,则在该进程的打开文件表创建一个条目,并指向现有整个系统的打开文件表。
    2. 否则,根据文件名搜索目录结构
    3. 找到后,它的FCB会复制到内存的整个系统的开放文件表中(该表还存放着打开该文件的进程数量) ,接下来,在该进程的打开文件表创建一个条目,并指向现有整个系统的打开文件表。

    Open() 返回值:文件描述符是一个非负整数。它是一进程打开文件表的索引值,指向系统范围内打开文件表相应条目在这里插入图片描述
    在这里插入图片描述

    2.虚拟文件系统

    操作系统如何才能将多个类型的文件系统集成到目录结构中?用户如何在访问文件系统空间时,可以无缝地在文件系统类型间迁移?大多数操作系统采用面向对象的技术来简化、组织、模块化实现。

    数据结构和程序用于隔离基本的操作系统调用的功能与实现细节。因此,文件系统的实现有三个主要层构成。
    第一层为文件系统接口。
    第二层为虚拟文件系统(VFS)把文件系统的通用操作和具体实现分开,虚拟文件系统提供了在唯一标识一个文件的机制。VFS基于vnode 的文件表示结构,它包含了一个数值标识符来唯一表示网络上的一个文件。

    1. VFS能区分不同本地文件系统
    2. VFS能区分本地文件系统和远程文件系统

    在这里插入图片描述
    在这里插入图片描述

    三、目录实现

    1.线性列表

    采用文件名称和数据块指针的线性列表

    • 优点:编程简单
    • 缺点:因为需要搜索,运行较为费时

    2.哈希表

    哈希表根据文件名得到一个值,并返回一个指向线性列表中元素的指针

    • 优点:减少目录搜索时间
    • 缺点:两个文件名哈希到相同的位置时可能发生冲突;因哈希表固定大小,创建文件需要哈希表重建时,比较麻烦。

    四、磁盘空间的分配方法

    1.连续分配

    每个文件在磁盘上占有一组连续的块。 文件的连续分配可以用文件第一块的磁盘地址和连续块的数量(即长度)来定义
    在这里插入图片描述
    连续分配支持顺序访问和直接访问
    问题:当文件需要扩展,文件大小变大时会无法扩展
    解决:找更大的连续空间,复制过去

    基于扩展的连续分配方案
    用以下参数来定义文件

    1. 开始地址
    2. 块儿数
    3. 指向下一个扩展块儿的指针(扩展块儿可以是多个)

    定义格式:
    文件【开始地址,块儿数,指向下一个扩展块的指针】

    2.链接分配

    每个文件是磁盘块儿的链表,磁盘块分布在磁盘的任何地方,文件有起始块和结束块来定义

    定义格式:【起始块,结束块】

    同时,每个磁盘块都有指向下一个磁盘块的地址。

    在这里插入图片描述
    优点:没有磁盘空间浪费
    缺点:

    1. 不支持文件的直接访问
    2. 需要更多的磁盘空间(来记录指针)

    链接分配的一个重要变种是文件分配表
    每个卷的开始部分用于存储文件分配表(File Allocation Table),表中每个磁盘块都有一个FAT条目,并可通过块号索引。(未使用的块为0,使用的块包含下一个块儿号)
    在这里插入图片描述
    目录条目含有文件首块号码,通过这个块号索引的FAT条目包含文件下一块的号码,这个链会继续下去,直到最后一块,最后一块的表条目值为文件结束值。
    在这里插入图片描述

    3.索引分配

    通过将所有指针放在一起,即索引块
    文件用索引块来定义, 每个文件有其索引块。
    在这里插入图片描述
    这里有一个问题,索引块应为多大
    每个文件必须有一个索引块,因此索引块应尽可能小,然而不能太小,否则放不下足够多的指针,为处理这个问题,有如下一些机制:

    1. 链接方案:为了处理大文件,可以将多个索引块链接起来
    2. 多层次索引:用第一层索引块指向一组第二层的索引块,第二层索引块再指向文件块
    3. 组合方案:用于基于UNIX的文件系统,将索引块的前15个指针存储在文件的i-node中。其中,前12个指针指向直接块,剩下3个指针指向间接块
      在这里插入图片描述

    五、磁盘空闲空间的管理

    1.位向量

    空闲空间表实现为位图, 或位向量,每块用一位(bit)表示。1表示块空闲;0表示块已分配

    2.链表

    所有空闲块用链表链接起来,并将指向第一个空闲块儿的指针保存在特殊位置,同时缓存在内存。
    每个块儿含有下一个块儿的指针

    3.组

    将n个空闲块的地址保存在第一个空闲块中。
    这些空闲块中的前n-1个为空,而最后一块包含另外n个空闲块的地址。
    比链表好的是空闲块的地址可以很快找到,而且可以明确一段连续空闲块空间

    例:n=3
    在这里插入图片描述

    4.计数

    基于以下事实:
    通常有多个连续块需要同时分配或释放,尤其是在使用连续分配时。因此记录

    • 记录第一块的地址和紧跟第一块的连续的空闲块的数量。
    • 空闲空间表的每个条目包括磁盘地址数量

    例:
    在这里插入图片描述

    六、文件系统的性能和效率

    磁盘空间的有效使用(效率),取决于

    • 磁盘分配和目录管理算法
    • 保留在文件目录条目中的数据类型

    改善性能的方法:缓存

    1. 缓冲区缓存:一块独立内存,位于其中的块是马上需要使用的
    2. 页面缓存:将文件数据作为页而不是块来缓存。页面缓存使用虚拟内存技术,将文件数据作为页来缓存,比采用物理磁盘块来缓存更高效
    3. 板载高速缓存

    在这里插入图片描述
    如果没有统一缓存,则会由下图情况发生:
    在这里插入图片描述
    系统调用read()和write()会通过缓冲区缓存,然而,内存映射调用需要使用两个缓存,即页面缓存和缓冲区缓存。内存映射先从文件系统中读入磁盘块,并放入缓冲区缓存,由于虚拟内存系统没有缓冲区缓存接口,缓冲缓存内的文件必须复制到页面缓存中。

    采用统一缓冲缓存
    统一缓冲缓存:统一使用缓冲器缓存来缓存进程页和文件数据。
    在这里插入图片描述
    无论是缓存块还是页面都有置换问题
    文件的读入或写出一般是按顺序进行。所以,不适合采用LRU算法,因为最近使用的页面最后才会用甚至根本不会再用。

    顺序访问可以通过马上释放预先读取来加以优化

    1. 马上释放(free-behind):请求下一页时,马上释放上一页
    2. 预先读取(read-ahead):请求页之后的下一个页也一起读入

    七、文件系统的恢复

    目录信息一般事先保存在内存中以加快访问,有时会导致目录结构中的数据和磁盘块中的数据不一致。
    解决:

    1. 一致性检查:比较目录结构中的数据和磁盘块中的数据,尝试着去修正不一致
    2. 备份&恢复:
      I. 备份(backup):利用系统程序来备份数据到其他的存储设备。软盘,磁带
      II. 恢复(recovery):通过从备份来恢复丢失的文件或磁盘

    基于日志结构的文件系统

    • 文件创建涉及到目录结构修改,FCB分配,数据块分配等
    • 所有元数据(meta data)的变化写入日志上,一旦这些修改写到日志,就认为已经提交了。
    • 提交了的事务,并不一定马上完成操作
    • 当整个提交的事务已经完成时,就从日志中删除事务条目
    • 如果系统崩溃,日志文件可能还存在事务,它包含的任何事务虽然已经由操作系统提交了,但还没有完成到文件系统,必须重新执行。
    展开全文
  • Linux驱动开发_设备文件系统详解

    千次阅读 多人点赞 2021-05-11 14:09:24
    以上的前提下是你的设备是流行设备且被操作系统的设备管理器支持的情况下,倘若我们有一个未知的设备,或者是我自己开发的硬件产品,如我们自己写的键盘,我们不使用通用键盘通讯协议,我们非要自己创建一套我们键盘...

     

    目录

    何为设备管理器?

    Linux下dev的作用

    Devfs

    sysfs

    kobject

    udev

    proc


    何为设备管理器?

    设备管理器就是负责管理这台电脑上的外设,当我们通过电脑提供的USB口插入一个键盘、鼠标时设备管理器会与其通讯来确认你插入的到底是一个什么样的设备,然后在创建对应的设备驱动。

    以上的前提下是你的设备是流行设备且被操作系统的设备管理器支持的情况下,倘若我们有一个未知的设备,或者是我自己开发的硬件产品,如我们自己写的键盘,我们不使用通用键盘通讯协议,我们非要自己创建一套我们键盘自己的协议,包括内部架构、PCB都是我们自己设计的,一个全新的键盘,虽然也是键盘但是协议,与硬件架构不同于ISO标准,所以操作系统的设备管理器无法识别,因为设备管理器里没有对应的驱动程序来与你建立通讯,同时你也不符合标准ISO的获取设备类型协议,所以它不知道你到底是个啥。

    这个时候我们就要用到驱动了,驱动就是用来与你的设备建立通讯,并传递给操作系统,在Windows上需要一个配置文件,用来告诉设备管理器某些设备使用什么驱动,所以最初我们安装的时候一般windows上的驱动程序都由配置文件和驱动程序组成,配置文件用来告诉操作系统我们的设备描述信息,并告知操作系统如果遇到这样的设备请调哪个驱动来处理,在通过驱动将数据传递给操作系统,由驱动来解析协议。

    所以驱动就是一个中间层,那么调用驱动就由设备管理器来调用,这一切是由设备管理器来负责完成从设备识别到驱动调用,在这个过程中你的设备要符合iso的通讯标准,否则操作系统不会去认,因为现代操作系统已经遵守iso国际化标准。

    Linux下dev的作用

    最早的Linux版本在Linux内核2.4之前,Linux内核支持外设时的方法是在内核里主动增加你的硬件设备,以及增加你的硬件交互代码,非常麻烦。

    当时如果你有了一个新的设备,需要让Linux支持的话,你需要发邮件去联系Linux内核社区的维护人员,让他们去给你增加你的设备,然后在新的Linux内核上线之后才能看见你的设备,这个时候你的设备存在/dev目录下的。

    用户无法主动去增加自己的设备,这导致了一个问题,当设备不存在时,/dev目录下仍有这个设备,时间久了你会发现/dev目录下充斥着巨多不知名的设备类型,当然因为Linux内核是开源的所以你可以自己手动去维护一个内核版本,但是这个成本太高了。

    Devfs

    为了解决dev的问题,所以到了Linux2.4版本以后,引入了一个devfs,也就是一个设备管理器,用于管理/dev目录,同时增加许多内核库文件,面向用户,允许用户手动调用函数向devfs注册你的设备,然后devfs在将设备注册到内核表中之后,在注册到/dev目录下。

    这解决了一个很大的问题,让Linux内核灵活了很多,因为支持了内核驱动编写的lib库,用户可以通过调用对应的函数来注册自己的设备,并实例化open、write、read这些函数,这个方式是引用自unix技术,使得文件系统用户层不用关心底层代码是如何实现的,只需要调用用户态的open、write、read就能实现对硬件的打开,写入,读取控制方式,这一方法被引用自VFS系统。

    这让Linux不在每次都充斥着许多不知名的设备,因为这样不仅拖累了内核,也让Linux变得非常没有扩展性。

    Devfs很好的解决了这个问题。

    Devfs只是负责管理与注册设备到vfs中。

    如果想知道vfs是如何抽象调用不同的open和write、read函数的可以参见我的这篇文章:Linux嵌入式开发_主设备号与次设备号详解

    sysfs

    sysfs是Linux2.6推出的一个新的文件系统,它的文件挂载点在/sys目录下,在最早刚推出时是没有明确规定挂载在哪个目录下,可以挂载在任意目录下,sysfs的挂载方式与devfs有很大的不同,当我们挂载到/dev下时候,devfs会在这个目录下创建一个文件,并给对应的权限,c表示是字符设备,b是块设备文件, s是socket文件,你可以在/dev目录下使用ls命令看一下

    可以看到最前面有一个c,代表这是一个字符设备,通过使用open函数打开这些文件,然后在通过devfs去在vfs表里去寻找我们的设备对应的模块,调用模块里的open以及read、write的函数指针。

    sys的挂载文件就是一个目录,目录里包含了许多文件,每个文件对应不同的信息,这些文件里描述着设备的所有信息,但是不是由sysfs来注册到vfs内核文件表里的,sysfs只是提供了一组文件操作函数,这系列函数用于注册到VFS虚拟文件系统中关于sysfs的相关表里。

    说到sysfs的具体实现就不得不提一个结构体:kobject

    这里给大家补充一下这个知识

    在VFS虚拟文件系统这块里有这样一个结构体:

    struct kobject {
    	const char		*name;
    	struct list_head	entry;
    	struct kobject		*parent;
    	struct kset		*kset;
    	struct kobj_type	*ktype;
    	struct kernfs_node	*sd; /* sysfs directory entry */
    	struct kref		kref;
    #ifdef CONFIG_DEBUG_KOBJECT_RELEASE
    	struct delayed_work	release;
    #endif
    	unsigned int state_initialized:1;
    	unsigned int state_in_sysfs:1;
    	unsigned int state_add_uevent_sent:1;
    	unsigned int state_remove_uevent_sent:1;
    	unsigned int uevent_suppress:1;
    }

    这个结构体原本是用来存储Linux 设备文件描述信息的,在Linux内核中,使用四大模型来描述Linux设备模型:Bus(总线)、Class(设备类)、Device(设备)、Driver(驱动),这四个都是数据结构体,组成一个Linux设备模型,针对这四个模型,我后面会写文章介绍,这里大家先大致知道这个概念。

    为了方便管理这四个结构体所以就诞生了kobject结构体,这个结构体里对这四大模型结构体进行了封装,并且通过parent指针把所有的层次结构关联起来,可以利用这个结构体找到sys目录下的相联目录

    同时它也具有引用计数的算法,当被引用时计数+1,当被解除一次引用时-1,到引用为0时Linux内核会释放掉这个设备模型,因为Linux内核不可能因为多个用户使用一个驱动设备就去给你分配多个实例化吧,太浪费了。

    并且这个结构体是专门为sysfs诞生的。

    这里给大家简单描述一下kobject结构体里的成员作用:

    kobject

    name:该Kobject的名称,同时也是sysfs中的目录名称。由于Kobject添加到Kernel时,需要根据名字注册到sysfs中,之后就不能再直接修改该字段。如果需要修改Kobject的名字,需要调用kobject_rename接口,该接口会主动处理sysfs的相关事宜。
    
    entry:用于将Kobject加入到Kset中的list_head。
    
    parent:指向parent kobject,以此形成层次结构(在sysfs就表现为目录结构)。
    
    kset:该kobject属于的Kset。可以为NULL。如果存在,且没有指定parent,则会把Kset作为parent(别忘了Kset是一个特殊的Kobject)。
    
    ktype:该Kobject属于的kobj_type。每个Kobject必须有一个ktype,或者Kernel会提示错误。
    sd:该Kobject在sysfs中的表示。
    
    kref:"struct kref”类型(在include/linux/kref.h中定义)的变量,为一个可用于原子操作的引用计数。
    
    state_initialized,指示该Kobject是否已经初始化,以在Kobject的Init,Put,Add等操作时进行异常校验。
    
    state_in_sysfs:指示该Kobject是否已在sysfs中呈现,以便在自动注销时从sysfs中移除。
    
    state_add_uevent_sent/state_remove_uevent_sent:记录是否已经向用户空间发送ADD uevent,如果有,且没有发送remove uevent,则在自动注销时,补发REMOVE uevent,以便让用户空间正确处理。
    
    uevent_suppress:如果该字段为1,则表示忽略所有上报的uevent事件,此成员是为udev提供的
    

    可以看到有许多针对sysfs的变量,最早它是没有的,在Linux2.6版本推出sysfs时,为了支持sysfs文件系统,对kobject进行了修改。

    因为kobject在内核中的主要作用就是描述通过sysfs注册文件设备模型。

    在内核寻找实现时在VFS中会遍历所有的文件链表,其中在2.6以后的版本就会遍历这个链表。

    这里给大家看一下各成员结构体原型:

    kset

    /**
     * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
     *
     * A kset defines a group of kobjects.  They can be individually
     * different "types" but overall these kobjects all want to be grouped
     * together and operated on in the same manner.  ksets are used to
     * define the attribute callbacks and other common events that happen to
     * a kobject.
     *
     * @list: the list of all kobjects for this kset
     * @list_lock: a lock for iterating over the kobjects
     * @kobj: the embedded kobject for this kset (recursion, isn't it fun...)
     * @uevent_ops: the set of uevent operations for this kset.  These are
     * called whenever a kobject has something happen to it so that the kset
     * can add new environment variables, or filter out the uevents if so
     * desired.
     */
    struct kset {
    	struct list_head list;
    	spinlock_t list_lock;
    	struct kobject kobj;
    	const struct kset_uevent_ops *uevent_ops;
    };

    参数介绍:

    list/list_lock:用于保存该kset下所有的kobject的链表。
    
    kobj:该kset自己的kobject(kset是一个特殊的kobject,也会在sysfs中以目录的形式体现)。
    
    uevent_ops:该kset的uevent操作函数集。当任何Kobject需要上报uevent时,都要调用它所从属的kset的
    
    uevent_ops:添加环境变量,或者过滤event(kset可以决定哪些event可以上报)。因此,如果一个kobject不属于任何kset时,是不允许发送uevent的。

    kobj_type

    struct kobj_type {
    	void (*release)(struct kobject *kobj);
    	const struct sysfs_ops *sysfs_ops;
    	struct attribute **default_attrs;
    	const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
    	const void *(*namespace)(struct kobject *kobj);
    };

    参数介绍:

    release:通过该回调函数,可以将包含该种类型kobject的数据结构的内存空间释放掉。
    
    sysfs_ops:该种类型的Kobject的sysfs文件系统接口。
    
    default_attrs:该种类型的Kobject的atrribute列表(所谓attribute,就是sysfs文件系统中的文件)。将会在Kobject添加到内核时,一并注册到sysfs中。
    
    child_ns_type/namespace:和文件系统(sysfs)的命名空间有关

    可以看到Linux内核把许多通用的结构体类型都抽象到一个结构体中,在VFS进行遍历时会寻找通用类型在结构体里进行遍历寻找对应的vfs open、wirte、read的实现。

    其中kobj_type里的release用来释放当前模型的内存空间,只有在引用为0的情况下,release才会真正释放,否则只会递减引用。

    当我们在驱动开发时若要使用这个驱动模型的话也提供了对应的函数:

    void kobject_init(struct kobject *kobj, struct kobj_type *ktype)
    int kobject_add(struct kobject *kobj, struct kobject *parent, const char *fmt, ...)
    int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,              struct kobject *parent, const char *fmt, ...)
    struct kobject *kobject_create(void)
    struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)
    int kobject_set_name(struct kobject *kobj, const char *fmt, ...)//设置kobject名称

    这里只是告诉大家kobject与sysfs的对应关系,sysfs依赖kobject结构体,sysfs会把所有的信息注册到kobject中,供内核维护使用。

    上面说过sysfs注册的文件会挂载在/sys目录下,我们打开sys目录看看:

    这些目录对应不同的类型设备:

    devices:该目录下是全局设备结构体系,包含所有被发现的注册在各种总线上的各种物理设备。一般来说,所有的物理设备都按其在总线上的拓扑结构来显示,但有两个例外即platform devices和system devices。
    
    dev:该目录下存放主次设备号文件,其中分成字符设备、块设备的主次设备号码(major:minor)组成的文件名,该文件是链接文件并且链接到其真实的设备(/sys/devices)。
    
    class:该目录下包含所有注册在kernel里面的设备类型,这是按照设备功能分类的设备模型,每个设备类型表达具有一种功能的设备。每个设备类型子目录下都是这种设备类型的各种具体设备的符号链接,这些链接指向/sys/devices/下的具体设备。 设备类型和设备并没有一一对应的关系,一个物理设备可能具备多种设备类型;一个设备类型只表达具有一种功能的设备,比如:系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统的。
    
    block:该目录下的所有子目录代表着系统中当前被发现的所有块设备。按照功能来说放置在/sys/class下会更合适,但由于历史遗留因素而一直存在于/sys /block,但从linux2.6.22内核开始这部分就已经标记为过去时,只有打开了CONFIG_SYSFS_DEPRECATED配置编译才会有 这个目录存在,并且其中的内容在从linux2.6.26版本开始已经正式移到了/sys/class/block,旧的接口/sys/block为了向后兼容而保留存在,但其中的内容已经变为了指向它们在/sys/devices/中真实设备的符号链接文件。
    
    bus:该目录下的每个子目录都是kernel支持并且已经注册了的总线类型。这是内核设备按照总线类型分层放置的目录结构,/sys/devices中的所有设备都是连接于某种总线之下的,bus子目录下的每种具体总线之下可以找到每个具体设备的符号链接,一般来说每个子目录(总线类型)下包含两个子目录,一个是 devices,另一个是drivers;其中devices下是这个总线类型下的所有设备,这些设备都是符号链接,它们分别指向真正的设备(/sys/devices/下);而drivers下是所有注册在这个总线上的驱动,每个driver子目录下 是一些可以观察和修改的driver参数。
    
    fs:按照设计,该目录使用来描述系统中所有的文件系统,包括文件系统本身和按照文件系统分类存放的已挂载点。
    
    kernel:这个目录下存放的是内核中所有可调整的参数。
    
    firmware:这里是系统加载固件机制的对用户空间的接口,关于固件有专用于固件加载的一套API,在附录 LDD3 一书中有关于内核支持固件加载机制的更详细的介绍;
    
    module:该目录下有系统中所有的模块信息,不论这些模块是以内联(inlined)方式编译到内核映像文件中还是编译为外模块(.ko文件),都可能出现在/sys/module中。即module目录下包含了所有的被载入kernel的模块。
    
    power:该目录是系统中的电源选项,对正在使用的power子系统的描述。这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机/重启等等。
    

    你可以根据你的设备类型注册到对应目录下,当你注册到对应目录下时,都会生成一个与你设备名一致的名字的目录,这个目录会在内核里注册一个kobject结构体与其对应起来,同时里面的parent成员用来指向子目录的层次结构。

    甚至你可以通过修改目录下的一些文件属性来控制硬件.

    如msp700修改背光

    这样做的前提是这个设备驱动支持你这样做,可以根据厂商给的手册。

    因为msp700的驱动是读取这个文件来设置背光的。

    echo 20 > /sys/class/backlight/pwm-backlight/brightness;

    udev

    其实在介绍完sysfs后,udev就非常简单不难理解了,udev是在2.6.x之后推出的,它是在sysfs之后推出的,因为它基于sysfs。

    用来管理优化devfs的,前面也说过devfs存在一些问题,如不够灵活,无法自动识别设备,当我们插入一个通用usb时,它不能给出usb的名字,当我们设备较多的情况下压根找到哪个是哪个设备,甚至无法知道哪个设备是usb,无法区分设备类型,同时也无法提供对设备的热拔插事件。

    所以udev的推出解决了这个问题,它是依赖sysfs的。

    它通过解析sysfs的目录,并把设备注册到/dev目录下。

    同时会监听热拔插事件提供给用户态,用户就可以知道当前是否有设备插入与弹出。

    它是运行在用户态的,以守护进程的方式运行。

    同时也具有自动识别设备的功能。

    如我们插入一个硬盘,会自动识别为/dev/hda1

    所以我们就可以知道我们的硬盘在哪儿,同时它还为每个设备提供了一个唯一的文件系统统一ID,同时也支持自定义规则。

    如果想修改udev的规则可以在这个文件中修改:

    /etc/udev/udev.conf

    proc

    proc是一种伪虚拟文件系统,存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

    为什么说它是伪虚拟文件系统,因为它会实时监听系统里内核以及进程的状态,并实时更新文件。

    当我们查看时会发现目录下全是以数字为命名的目录:

    这些数字是PID,这些PID对应进程,也就是说这些目录里存储着每个PID进程的运行状态。

    我们可以随便打开一个看看:

    每个文件对应不同的属性,如就拿cmdline来说,它对应的是启动时的完整命令,我们看打开看看:

    /usr/libexec/goa-identity-service

    fd目录里包含了这个程序目前使用的文件描述符,这些文件描述符是一个符号链接:

    /dev/null
    socket:[58]

    可以看到socket的描述符,port也能看到

    所以在这个目录下你能看到所有的进程相关信息。

    这里给大家介绍一下常见的文件目录作用:

    cmdline:启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息
    
    cwd:指向当前进程运行目录的一个符号链接
    
    environ:当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示
    
    exe:指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe可以启动当前进程的一个拷贝
    
    fd:这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接
    
    limits:当前进程所使用的每一个受限资源的软限制、硬限制和管理单元;此文件仅可由实际启动当前进程的UID用户读取;(2.6.24以后的内核版本支持此功能)
    
    maps:当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表
    
    mem:当前进程所占用的内存空间,由open、read和lseek等系统调用使用,不能被用户读取
    
    root:指向当前进程运行根目录的符号链接;在Unix和Linux系统上,通常采用chroot命令使每个进程运行于独立的根目录
    
    stat:当前进程的状态信息,包含一系统格式化后的数据列,可读性差,通常由ps命令使用
    
    statm:当前进程占用内存的状态信息,通常以“页面”(page)表示
    
    status:与stat所提供信息类似,但可读性较好,如下所示,每行表示一个属性信息;其详细介绍请参见 proc的man手册页
    
    task:目录文件,包含由当前进程所运行的每一个线程的相关信息,每个线程的相关信息文件均保存在一个由线程号(tid)命名的目录中,这类似于其内容类似于每个进程目录中的内容;(内核2.6版本以后支持此功能)

    proc常见目录介绍:

    apm:高级电源管理(APM)版本信息及电池相关状态信息,通常由apm命令使用
    
    buddyinfo:用于诊断内存碎片问题的相关信息文件
    
    cmdline:在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递
    
    cpuinfo:处理器的相关信息的文件
    
    crypto:系统上已安装的内核使用的密码算法及每个算法的详细信息列表
    
    devices:系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名
    
    diskstats:每块磁盘设备的磁盘I/O统计信息列表;(内核2.5.69以后的版本支持此功能)
    
    dma:每个正在使用且注册的ISA DMA通道的信息列表
    
    execdomains:内核当前支持的执行域(每种操作系统独特“个性”)信息列表
    
    fb:帧缓冲设备列表文件,包含帧缓冲设备的设备号和相关驱动信息
    
    filesystems:当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型
    
    interrupts:X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号
    
    iomem:每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息
    
    ioports:当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;如下面所示,第一列表示注册的I/O端口范围,其后表示相关的设备
    
    kallsyms:模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;(内核2.5.71以后的版本支持此功能);通常这个文件中的信息量相当大
    
    kcore:系统使用的物理内存,以ELF核心文件(core file)格式存储,其文件大小为已使用的物理内存(RAM)加上4KB;这个文件用来检查内核数据结构的当前状态,因此,通常由GBD通常调试工具使用,但不能使用文件查看命令打开此文件
    
    kmsg:此文件用来保存由内核输出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用,不要试图使用查看命令打开此文件
    
    loadavg:保存关于CPU和磁盘I/O的负载平均值,其前三列分别表示每1秒钟、每5秒钟及每15秒的负载平均值,类似于uptime命令输出的相关信息;第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;第五列表示此文件被查看前最近一个由内核创建的进程的PID
    
    locks:保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;如下输出信息中每行的第二列表示当前锁定使用的锁定类别,POSIX表示目前较新类型的文件锁,由lockf系统调用产生,FLOCK是传统的UNIX文件锁,由flock系统调用产生;第三列也通常由两种类型,ADVISORY表示不允许其他用户锁定此文件,但允许读取,MANDATORY表示此文件锁定期间不允许其他用户任何形式的访问
    
    mdstat:保存RAID相关的多块磁盘的当前状态信息,在没有使用RAID机器上
    
    meminfo:系统中关于当前内存的利用状况等的信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值
    
    mounts:在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统,在2.4.19以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向/proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接
    
    modules:当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看
    
    partitions:块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目
    
    pci:内核初始化时发现的所有PCI设备及其配置信息列表,其配置信息多为某PCI设备相关IRQ信息,可读性不高,可以用“/sbin/lspci –vb”命令获得较易理解的相关信息;在2.6内核以后,此文件已为/proc/bus/pci目录及其下的文件代替
    
    slabinfo:在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了这些对象相关slap的信息;详情可以参见内核文档中slapinfo的手册页
    
    stat:实时追踪自系统上次启动以来的多种统计信息
    
    swaps:当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于/proc/swap目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大
    
    uptime:系统上次启动以来的运行时间
    
    version:当前系统运行的内核版本号
    
    vmstat:当前系统虚拟内存的多种统计数据,信息量可能会比较大,这因系统而有所不同,可读性较好
    
    zoneinfo:内存区域(zone)的详细信息列表
    
    sys:与/proc下其它文件的“只读”属性不同的是,管理员可对/proc/sys子目录中的许多文件内容进行修改以更改内核的运行特性,事先可以使用“ls -l”命令查看某文件是否“可写入”。写入操作通常使用类似于“echo  DATA > /path/to/your/filename”的格式进行。需要注意的是,即使文件可写,其一般也不可以使用编辑器进行编辑。
    
    /proc/sys/debug 子目录
    此目录通常是一空目录;
    
    /proc/sys/dev 子目录
    为系统上特殊设备提供参数信息文件的目录,其不同设备的信息文件分别存储于不同的子目录中,如大多数系统上都会具有的/proc/sys/dev/cdrom和/proc/sys/dev/raid(如果内核编译时开启了支持raid的功能) 目录,其内存储的通常是系统上cdrom和raid的相关参数信息文件。

    上面这些大多数虚拟文件可以使用文件查看命令如cat、more或者less进行查看,有些文件信息表述的内容可以一目了然,但也有文件的信息却不怎么具有可读性。不过,这些可读性较差的文件在使用一些命令如apm、free、lspci或top查看时却可以有着不错的表现。

    除了udev是运行在用户空间以外,其它的所有文件系统都属于内核的一部分。

    在VFS中,会把这些结构体抽象出来,并利于用户调用open函数发生中断时,遍历寻找对应的模块指针。

    它是通过systemd服务进行管理的。

     

    展开全文
  • 在操作系统中增加了文件管理功能,专门管理在外存上的文件,并把对文件的存取,共享和保护等手段提供给用户。这不仅方便了用户保证了文件的安全性,还可有效地提高系统资源的利用率。

    学习总结目录:

    在操作系统中增加了文件管理功能,专门管理在外存上的文件,并把对文件的存取,共享和保护等手段提供给用户。这不仅方便了用户保证了文件的安全性,还可有效地提高系统资源的利用率。

    文件和文件系统

    文件系统的管理功能是将其管理的程序和数据通过组织为一系列文件的方式实现的,而文件是指具有文件名的若干相关元素的集合。元素通常是记录;记录是一组有意义的数据项的集合。数据组成成分可以分为三层:数据项,记录(元素)和文件。

    一.数据项

    • 基本数据项:除了数据名外还有数据类型,两者定义了数据项的“型”。表征一个实体在数据项上的数据称为“值”例如 int age; age=10;

    • 组合数据项:由若干基本数据项组成,简称组项

    二.记录

    记录是一组相关数据项的集合,用于描述一个对象在某方面的属性。在诸多记录中为了可以唯一的标识一个记录,必须在记录的各个数据项中确定出一个或多个数据项,把它们的集合称为关键字(key)

    三.文件(是文件系统中最大的数据单位)

    文件是由所创建者所定义的,具有文件名的一组相关元素的集合分为有结构文件(文件由若干相关记录组成)和无结构文件(被看成字符流)
    文件的属性:(1)文件类型(2)文件长度(3)文件的物理位置(4)文件的建立时间

    在这里插入图片描述

    文件类型:

    • 按用途分:系统文件;用户文件;库文件
    • 按文件中的数据形式分类:源文件.c .java文件;目标文件.obj;可执行文件.exe
    • 按存取控制属性分类:只执行文件;只读文件;读写文件
    • 按组织形式和处理方式分类:普通文件;目录文件;特殊文件

    文件系统的模型分为三个层次结构:最底层是对象及其属性,中间层是对对象进行操作和管理的软件集合,最高层是文件系统提供给用户的接口。

    对象及其属性——文件管理系统管理的对象有:文件;目录;磁盘(磁带)存储空间

    文件系统的接口:命令接口;程序接口

    文件操作:1)最基本的文件操作:创建文件;删除文件;读文件;写文件;设置文件的读写位置;2)文件的打开和关闭操作;3)其他文件操作

    文件的逻辑结构

    用户所看到的文件称为逻辑文件,是由一系列的逻辑记录组成,从用户的观点而言文件的逻辑记录是能够被存取的基本单位。在系统中的所有文件都存在两种形式的文件结构:
    (1)文件的逻辑结构用户可以直接处理的数据及结构,又称为文件组织。
    (2)文件的物理结构,又称为文件的存储结构

    文件逻辑结构类型:

    1.按文件是否有结构分类

    • 有结构文件:记录式文件,记录长度可以分为两类:定长记录和变长记录
    • 无结构文件:流式文件,可以看做是记录式文件的一个特例:一个记录仅仅有一个字节。

    2.按文件的组织方式分类(把有结构的文件分为三类)

    (1)顺序文件

    顺序文件:由一系列记录按某种顺序排列所形成的文件,记录可以是定长或者变长。
    排列方式:串结构通常按时间顺序排列每次查找要从头开始。
    顺序结构用户指定一个字段作为关键字,可以是任意一个类型的变量其中最简单的是正整数

    顺序文件的优缺点:最佳应用场合是在对文件中的记录进行批量存取时。所有逻辑文件中顺序文件的存取效率是最高的。对于顺序存储设备(如磁带)也只有顺序文件才能被存储并有效工作。在交互场合对于查找和修改则性能较差。

    记录寻址:

    1.隐式寻址方式: 对于定长记录的顺序文件,如果已知当前记录的逻辑地址很容易确定下一个记录的逻辑地址。读文件时设一个读指针Rptr令它指向下一个记录的首地址;写指针指向要写记录的首地址;读写完执行加L操作,L是记录长度。也称随机访问或直接访问;对于变长记录的顺序文件需要设置读写指针但是要加上Li(刚读写完的记录长度)也称顺序访问适用于所有文件类型但是需要从头访问速度慢。
    2.显示寻址方式: 对定长记录的文件实现直接访问或者随机访问通过文件中记录中的位置;利用关键字。变长不可以实现直接访问。

    (2)索引文件
    索引文件指为可变长记录文件建立一张索引表,为每个记录设置一个表项,以加速对记录的检索速度。

    • 1.按关键字建索引:定长记录文件可以通过简单计算实现随机查找,变长记录文件需要从第一个开始查一直顺序查找目标记录为止。我们为变长记录文件建立一张索引表,为主文件中的每个记录在索引表中分别设置一个表项记录指向记录的指针以及记录的长度L。索引表按关键字排序。索引表本身是一个定长记录的索引文件。把对变长记录顺序文件的顺序检索转变为对定长记录的顺序文件。实现直接存取。根据用户提供的关键字利用折半查找的方法去检索索引表,从中找到表项,在利用表项中给的指针去访问记录
    • 2.具有多个索引表的索引文件
      索引文件的优点:顺序查找的文件改造成随机查找的文件,插入删除方便。

    (3)索引顺序文件
    索引顺序文件是对顺序文件的改进,克服对变长记录的顺序文件不能随机访问以及不便插入和删除的缺点。仍保留顺序文件的关键特征,记录是按关键字的顺序组织起来的,还有两个新特征:引入文件索引表实现随机访问,增加溢出文件记录新增加,删除和修改的记录。

    一级顺序索引文件:将变长记录顺序文件中的所有记录分为若干组,为每组的第一个记录在索引表中建立一个索引项,含有该记录的关键字和指向该记录的指针。索引顺序文件是最常见的一种逻辑文件形式。检索效率比顺序文件提高根号N/2倍记录数为N,分为根号N个分组,每个分组有根号N个记录查找最佳。

    两级顺序索引文件:例:对于一个含有10的6次方个记录的顺序文件,作为索引顺序文件时,平均需要查询1000个记录。建立多级索引分组为100*100*100,此时查找一个记录所需的次数变为50+50+50=150。

    直接文件:可根据给定关键字直接获取指定记录的物理地址。关键字就决定了记录的物理地址。

    哈希文件

    文件目录

    对于目录的管理要求有:
    1.实现“按名存取”
    2.提高对目录的检索速度
    3.文件共享
    4.允许文件重名

    文件控制块FCB含有三类信息:
    1)基本信息:文件名;文件物理位置;文件逻辑结构(指示文件是流式文件还是记录文件,记录数,文件是变长还是定长);文件物理结构(存取控制信息类和使用信息类)

    索引结点:文件目录通常是存放在磁盘上的查找时要将盘块上的目录调入内存按文件名逐一比较。磁盘索引结点:每个文件有唯一的一个磁盘索引结点包括:

    • 1.文件主标识符
    • 2.文件类型
    • 3.文件存取权限
    • 4.文件物理地址
    • 5.文件长度
    • 6.文件连接技术
    • 7.文件存取时间。

    内存索引结点:当文件被打开时将磁盘索引结点拷贝到内存的索引结点中之后又增加了:

    • 1.索引结点编号
    • 2.状态
    • 3.访问计数
    • 4.文件所属文件系统的逻辑设备号
    • 5.链接指针

    简单的文件目录:

    1.单级文件目录:整个文件系统中只建立一张目录表。
    缺点:查找速度慢;不允许重名;不便于实现文件共享。

    2.两级文件目录:可以为,每一个用户再建立一个单独的用户文件目录UFD(User File Directoy);再建立衣蛾主文件目录(MFD)在MFD中为UFD占用一个目录项(含有用户名和指向该用户目录文件的指针);
    优点:检索目录速度快;在不同的用户目录中。可以使用相同的文件名;不同用户可以使用不同的文件名访问系统中的同一个共享文件。

    数型结构目录:
    数型目录:在现代OS中,最通用且实用的文件目录无疑是树形结构目录。明显的提高对目录的检索速度和文件系统的功能。主目录称为根目录在每一个文件目录中只有一个根目录。

    路径名和当前目录:

    • 1.路径名:从根目录到任何数据文件都只有一条唯一的通路。把全部目录文件名和数据文件名依次用/连接起来。
    • 2.当前目录(工作目录)从当前目录为止到数据文件为止所构成的路径名称为相对路径名,而把从树根开始的路径名称为绝对路径名
    展开全文
  • 盘点分布式文件存储系统

    千次阅读 2021-02-08 22:14:23
    在项目的数据存储中,结构化数据通常采用关系型数据库,非结构化数据(文件)的存储就有很多种方式,服务器本地存储、Nas挂载、ftp等等,今天就来盘点一下,分布式文件存储系统
  • 大家好,学习时间又到啦。...可以凭借划分逻辑卷、做RAID、LVM等方式将它格式化,可以格式化为你所指定的文件系统(Ext3,Ext4,NTFS,FAT32等),随后才可以被操作系统浏览。比较常见的DAS、FC-SAN、IP-SAN基本都
  • 文件存储NAS与对象存储OSS

    千次阅读 2021-02-04 15:44:47
    NAS(Network Attached Storage):是一套网络储存设备,通常是直接连在网络上并提供资料存取服务,一套 NAS 储存设备就如同一个提供数据文件服务的系统,特点是性价比高。NAS采用NFS或CIFS命令集访问数据,以文件为...
  • Linux目录结构和Windows目录结构差异 Windows目录结构 按照盘符划分,每个分区下都有一...一切皆是文件(包括/dev目录下的设备文件); 小型、单一用途的程序; 配置数据放置于文本。 Linux目录树思维导图 Linux挂载
  • Java面向对象 - 文件类第1关:创建文件任务描述相关知识如何创建文件如何判断文件是否存在编程要求测试说明实现代码第2关:文件的常用操作任务描述相关知识创建文件夹删除文件列出文件夹下的文件编程要求测试说明...
  • 特殊文件系统

    千次阅读 2020-12-21 18:53:43
    linux 文件系统,就和 OOP 里的对象一样,是一个人造的概念。 也就是说,文件系统和有没有实际存储设备没有必然联系,重要的是要表现出文件系统的行为:目录可以列出文件,文件可以读写内容,或者使用 ioc
  • Qt 元对象系统

    千次阅读 2021-05-02 16:53:35
    Qt 的元对象系统(Meta-Object System)提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。 元对象系统由以下三个基础组成: QObject 类,是所有使用元对象系统的类的基类。换句话说只有继承 ...
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有...在做课件时,往往需要将其他文件链接到当前PPT中,比如数学中的解题步骤做在另外一个文件中,点击“解一”“解二”时才显示该解题
  • JavaScript 文件对象File

    千次阅读 2021-01-21 15:51:45
    在浏览器中操作文件,多数情况下用到的是 File 对象,从<input type='file' />元素获取,进而继续操作(例如将选择的图片展示在页面上,用ajax将文件上传至服务器等)。这里介绍在浏览器中操作文件的相关API. ...
  • 文章目录5.1 文件管理概述5.2 文件结构5.2.1 文件的逻辑结构5.2.2 文件的物理结构5.3 文件目录管理5.4 文件的存储设备5.4.1 文件的存储...所以在操作系统中又增加了文件管理功能,即构成一个文件系统,负责管理在外存
  • 对象存储、文件存储、块存储直观的区别介绍
  • 什么是星际文件系统(IPFS)

    千次阅读 2020-12-29 22:29:16
    星际文件系统(IPFS)会是将来一个非常重要的技术。IPFS的全称是Interplanetary File System,是一种p2p的文件分享系统,目的是要改变信息分发的方式。它在通信协议和分布式系统方面都有几项创新。我们先来看一下它...
  • 在Linux中,所有内容都是以文件的形式保存和管理的,即一切皆文件,普通文件是...虚拟文件系统其实就是一个目录树,树上不同的节点可以映射到物理的文件地址,也可以进行挂载,相当于一个解耦层,在具体的文件系统之上
  • 阿里云对象存储——上传文件 一、配置文件 #OSS连接路径 endpoint = http://oss-cn-beijing.aliyuncs.com #已经在控制台创建的bucket bucketName = 20201221 #相应的id和key值,请填写你具体的值,这里不方便展示我...
  • tempfile库:Python临时文件系统对象

    千次阅读 2021-04-21 19:10:05
    这个时候在系统中频繁的创建中转文件,删除中转文件,不仅浪费系统的资源,而且容易被破坏或者篡改,这个时候用临时文件反而更好。 而Python给我们提供了临时文件操作库:tempfile。本篇将详细介绍临时文件的应用与...
  • 当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对他进行分区存储到若干台单独的计算机上,管理网络中跨多台计算机存储的文件系统称为分布式文件系统(Distributed FileSystem)。 Educo
  • FatFs 支持 FAT12、FAT16、FAT32 等格式,所以我们利用前面写好的 SPI Flash 芯片驱动,把 FatFs 文件系统代码移植到工程之中,就可以利用文件系统的各种函数,对 SPI Flash 芯片以“文件”格式进行读写操
  • 阿里云对象存储OSS和文件存储NAS有什么区别?文件存储NAS和对象存储OSS如何选择?NAS是传统的NFS挂载共享文件夹,OSS可以使用RESTful API,阿里云百科从技术、使用方式、容量、存储内容、性能及使用场景等方面来详细...
  • NFS(网络文件系统)简介及搭建

    千次阅读 2021-01-27 09:33:45
    网络文件系统 网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。 定义 NFS是基于UDP/IP...
  • 目录前言建立路径joinPath()路径格式化with_name()与with_suffix()解析路径home()与cwd()获取当前路径下的所有文件路径设置条件获取文件(glob()与rglob())读写文件 前言 Pathlib库提供了一个面向对象的API来解析,...
  • //*** requestFileSystem: 请求本地文件系统对象 plus.io.requestFileSystem( type, succesCB, errorCB ); //获取指定的文件系统,可通过type指定获取文件系统的类型。 参数: type: ( Number ) 必选 本地文件...
  • 可以看到目前HDFS文件系统的目录是空的,没有任何的文件和文件夹,下面开始今天的API操作 一、创建Maven项目 首先,打开IDEA,点击新建项目,在左侧中选择Maven,然后直接点击next 设置项目名称,点...
  • 星际文件系统优点和原理

    千次阅读 2021-12-07 14:52:25
    星际文件系统优点 IPFS原理简述 基本原则一、通过内容寻址的唯一标识: 二、通过有向非循环图 (DAG) 链接内容: 三通过定向哈希表 (DHT) 发现内容 什么是IPFS 一个点对点的超媒传输协议。IPFS支持创建完全...
  • STM32+LittleVgl(LVGL)文件系统使用

    千次阅读 2021-05-23 19:48:37
    为什么要使用LVGL文件系统?在LVGL中,我们会使用很多图片资源以及字体来设计我们的UI,然而将这些资源文件存储在内部FLASH是很不友好的,因为图片及字体会占用很大一部分空间,这会使得内部FLASH空间不足。所以,我们...
  • Python——学生管理系统(面向对象

    千次阅读 多人点赞 2021-04-05 11:46:36
    学生管理系统(面向对象)前言file_manager.pytools.pymodel.pyindex.pymanagerSystem.py执行效果 前言 这个只是使用面向对象的方法写的 构思和学生管理系统(JSON模块)是一样的 file_manager.py """ Project: ...
  • 大数据从入门到实战 - 第2章 分布式文件系统HDFS

    千次阅读 多人点赞 2021-01-13 16:56:03
    大数据从入门到实战 - 第2章 分布式文件系统HDFS 一、关于此次实践1、实战简介2、全部任务二、实践详解1、第1关: HDFS 的基本操作2、第2关:HDFS-JAVA接口之读取文件3、实验三 HDFS-JAVA 接口之上传文件4、实验四 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,839,991
精华内容 735,996
关键字:

对象文件系统