虚拟文件系统,文件描述符,io重定向

虚拟文件系统

概述

虚拟文件系统,文件描述符,io重定向_第1张图片
VFS是一个抽象层,其向上提供了统一的文件访问接口,而向下则兼容了各种不同的文件系统。不仅仅是诸如Ext2、Ext4、XFS和Btrfs等常规意义上的文件系统,还包括伪文件系统和设备等等内容。由图可以看出,虚拟文件系统位于应用与具体文件系统之间,其主要起适配的作用。对于应用程序来说,其访问的接口是完全一致的(例如open、read和write等),并不需要关系底层的文件系统细节。也就是一个应用可以对一个文件进行任何的读写,不用关心文件系统的具体实现。另外,VFS实现了一部分公共的功能,例如页缓存和inode缓存等,从而避免多个文件系统重复实现的问题。

inode模块: 管理一个具体的文件,是文件的唯一标识,一个文件对应一个inode。通过inode可以方便的找到文件在磁盘扇区的位置。同时inode模块可链接到address_space模块,方便查找自身文件数据是否已经缓存。

两个程序如果打开的是统一文件,共享的是同一个pagecache 4k。
如果后续我们对pagecache进行了修改,会产生脏数据,这时候需要使用flush刷新到磁盘中去。“脏”这个标识是内核对于上层打开的文件的一个统一的管理,并不是针对某一个文件。内核会根据自己的设定,把数据输入到磁盘中去。如果你在5秒钟内产生了3.8G数据,又恰好没有触发内核的写磁盘操作,这时候突然断电会导致你这些数数据的丢失。

虚拟目录树

VFS的存在可以让Linux操作系统实现非常复杂的文件系统关联关系(虚拟目录树)
虚拟文件系统,文件描述符,io重定向_第2张图片
计算机引导的时候,先挂载了3分区,又挂载了1分区。新的挂载覆盖了原有的boot目录
虚拟文件系统,文件描述符,io重定向_第3张图片

文件类型

目录树结构趋于稳定有两个定义:

  • 映射:文件类型映射
  • 一切皆文件:磁盘文件、摄像头、打印机,都被看做是文件,基于文件的这种抽象,就可以应用到IO流了
    虚拟文件系统,文件描述符,io重定向_第4张图片

文件描述符

  • 任何程序都有
    0:标准输入
    1:标准输出
    2:报错输出

lsof是list open files的简称,它的作用主要是列出系统中打开的文件,基本上linux系统中所有的对象都可以看作文件,lsof可以查看用户和进程操作了哪些文件,也可以查看系统中网络的使用情况,以及设备的信息。
虚拟文件系统,文件描述符,io重定向_第5张图片
创建一个文件描述符8,用来读取ooxx.txt
NODE列:表示Inode号
如果lsof加上-o参数的话,会显示一列OFFSET,表示当前读文件位置的指针。
虚拟文件系统,文件描述符,io重定向_第6张图片
使用read读文件:
虚拟文件系统,文件描述符,io重定向_第7张图片
新开了一个bash标签页,用一个新的文件描述符6,去读取ooxx.txt
证明两个进程读取文件时,不会相互影响:
虚拟文件系统,文件描述符,io重定向_第8张图片
我们可以得出这个结论,内核为每一个进程各自维护了一套数据,包括fd文件描述符。
fd维护了一些关于文件的偏移、Inode号,以及元数据信息等。

io重定向

标准输入/输出(standard I/O)可能是软件设计原则里最重要的概念了。这个概念就是:程序应该有数据的来源端、数据的目的端(输出结果的地方)已经报告问题的地方,它们分别被称为标准输入(standard input)、标准输出(standard output)以及标准错误输出(standard error)。程序不必知道也不用关心它的输入与输出背后是什么设备,当程序运行时,这些标准 IO 就已经打开并准备就绪了。

运行时的程序称为进程,在 Linux 系统中,对于每个进程来说,始终有 3 个"文件"处于打开状态:

  • stdin
  • stdout
  • stderr

这三个文件就是进程默认的标准输入、标准输出和标准错误输出。每个打开的文件都会被分配一个文件描述符。stdin,stdout 和 stderr 的文件描述符分别是 0,1 和 2(一个文件描述符说白了就是文件系统为了跟踪这个打开的文件而分配给它的一个数字)。对于 Bash 进程来说,stdin 默认就是键盘,stdout 和 stderr 默认都是屏幕。

我们可以把 IO 重定向简单理解为:
系统捕捉一个文件、命令、程序或脚本的输出,然后将这些输出作为输入发送到另一个文件、命令、程序或脚本中。

ls 命令的标准输出
ls ./ 1> ls.out将ls的标准输出1重定向到ls.out
虚拟文件系统,文件描述符,io重定向_第9张图片
cat 命令的标准输入、标准输出
cat 0< test.txt 1> cat.out 将cat的标准输入重定向为 test.txt , 将其标准输出重定向为 cat.out
虚拟文件系统,文件描述符,io重定向_第10张图片
read命令的标准输入、标准输出
虚拟文件系统,文件描述符,io重定向_第11张图片
重定向操作符< >的对接
让两个流写到不同的文件中去:
虚拟文件系统,文件描述符,io重定向_第12张图片
让两个流写到相同的文件中去:
虚拟文件系统,文件描述符,io重定向_第13张图片

PageCache(粗讲)

虚拟文件系统,文件描述符,io重定向_第14张图片

你可能感兴趣的:(IO)