IO深度学习01——虚拟文件系统,文件描述符,IO重定向,PackageCache

一、虚拟文件系统

在这里插入图片描述

Windows用的是物理文件系统
Linux用的是虚拟文件系统VFS,虚拟目录树

VFS可以看做是虚拟目录树,每个文件都有自己的inode号,可以当做id。

在这里插入图片描述

目录树结构
df命令:查看文件系统挂载情况
umount /boot 解除boot的挂载
mount /dev/sda1/boot /boot 把/dev/sda1/boot 目录挂载到 /boot
ll 查看目录详情
ls 查看目录
pwd 查看当前路径(目录树结构)
mkdir 创建目录
cp /root/a.txt /root/b/c.txt 把a.txt 拷贝 b目录下并命名为c.txt
多个文件同时拷贝到 ./lib64/目录下在这里插入图片描述
echo 打印
echo $$ 打印当前进程号

二、文件描述符

重定向 > 如echo “hello” > hello.txt 写入内容到hello.txt
所以以前 nohup java -jar jar包名 >log.file 2>&1 &
任何程序都有0 1 2 文件描述符
0 标准输入 1 标准输出 2 错误输出

/proc目录是内核映射的变量属性,里面的每个数字就是进程id号,进程、网络、变量属性等都在这里被映射成文件,一切皆文件。而 $ $ 是获取当前和我互动的bash的pid,通过$ BASHPID也能获取到这个当前进程ID,所以使用 /proc/$$/fd lsof -op $ $ 能获取当前文件描述符的细节
在这里插入图片描述
cd /proc/$ $ 进入当前进程的空间
ls 查看当前进程的内容
在这里插入图片描述
cd fd 进入io空间,查看所有本进程开启的IO
在这里插入图片描述

三、IO重定向

nohup java -jar jar包名 >log.file 2>&1 &
具体参数参照 http://t.csdn.cn/AUQbS
nobup内容输出
java -jar xxx.jar 某jar包
输出内容重定向到这个文件 >log.file文件
重定向描述符如果后面放的是文件描述符 即 2> 1 则中间必须加&,即2>& 1,这是硬性约束,如果不写会被认为是把 错误 写到 名叫1的这个文件里去
2> 1把前面的这个文件的错误写到名叫1的文件中
2>&1 把前面的这个文件的错误作为输入写到后面的文件中去
如果是>>则是追加模式
顺序不能错,1是文件描述符 输出 2是文件描述符错误 0是文件描述符输入
命令 > log.file 2>&1 是 先把 jar的内容指向 log.file(1),再把输出指向1
& 后台不挂断运行

四、硬链接与软连接

文件系统,如上图左边第一个字母什么意思
-普通文件
d目录
l 连接,连接分为 软连接和硬连接

vim demo.txt
ln demo.txt demo2.txt 此时会创建一个硬连接 demo2.txt
stat demo.txt和stat demo2.txt,得到的Inode是一样的,即id是一样的

硬连接:磁盘里这个文件真实存在,有自己的path,相当于创建了一个新的指针,也指向同一块内存
软连接:如windows里的快捷方式
在这里插入图片描述
硬连接被引用的数量,此时如果 rm -f demo.txt,也没啥影响,demo2.txt依旧指向源数据空间,数据不会丢失,只是这个被引用的数量会减一。同理,如果修改了demo.txt打开的文件,demo2.txt打开后发现也变了。相当于两个都是个文件指针而言。

ln -s demo.txt demo2.txt 创建软连接,就是快捷方式
stat 后两个的Inode号也不同
此时修改一个,另一个也会内容发生变化,这是连接的特性
在这里插入图片描述
不过删除就不一样了,删除demo2.txr无影响 ,本来就只是个快捷方式
在这里插入图片描述
但删除demo.txt
在这里插入图片描述

b 块设备,如硬盘
c 字符设备,如键盘输入那种
s socket 一切皆文件,socket文件在这里插入图片描述
在这里插入图片描述
p 管道 pipeline [eventpoll]

在这里插入图片描述

五、PackCache

packcache 页缓存 4K

早期计算机是单进程,一次把整个进程读进内存,后来发展到多进程并行运行,就是多个进程运行在内存的不同位置,但是会引发两个问题:内存不足 和 内存读取数据边界控制,防止读到其他进程的数据。
由内存不足,引发了分块,就是一个页表,把一个进程分成4K的块,需要哪一块,就把对应的块读到内存。
由数据边界访问,发展到虚拟内存,通过地址映射,保证不会读取到其他进程的数据。

一个文件如果被打开两个,不会同时创建两个空间,第二个发现对应的packcache已经命中了,直接返回数据

在这里插入图片描述

六、管道 (前面的输出作为后面的输入)

查看前十行信息

在这里插入图片描述

查看前三行

在这里插入图片描述

查看后十行

在这里插入图片描述

查看后两行信息

在这里插入图片描述

但是没有直接查看第几行的命令,此时就可以使用管道,把前面的输出作为后面的输入

查看第二行

在这里插入图片描述

所以 ps -ef 是打印所有进程信息
ps -ef | grep 8080
输出所有进程信息到管道进行处理,grep抓取关于 8080 的所有信息

注意优先级
此处" $" 的优先级高于管道,所以先打印"$"的进程号,再执行管道,类似 ++a
其实最后的进程号已经不是原进程号了,只是优先级没$$高,没打印出来

在这里插入图片描述

10388才是管道的pid

在这里插入图片描述

七、进程隔离

创建变量y=100,打印,创建子进程,打印y为空,进程间数据隔离

在这里插入图片描述

export可以使当前变量父子进程都能访问到

在这里插入图片描述

代码块的使用,都是运行在同一进程下的
注意两边留空格

同时开启两个子进程

在这里插入图片描述

注意此时不要再输出了,要阻塞住进程,再开个面板看信息。

在这里插入图片描述
查看进程信息 lsof -op 进程号

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 1 虚拟文件系统概述 5 1.1 通用文件模型 7 1.2 VFS所处理的系统调用 9 2 虚拟文件系统架构 11 2.1 VFS对象数据结构 11 2.1.1 超级块对象 11 2.1.2 索引节点对象 15 2.1.3 文件对象 18 2.1.4 目录项对象 22 2.2 把Linux中的VFS对象串联起来 24 2.2.1 与进程相关的文件 25 2.2.2 索引节点高速缓存 29 2.2.3 目录项高速缓存 30 2.2.4 VFS对象的具体实现 32 2.3 文件系统的注册与安装 38 2.3.1 文件系统类型注册 38 2.3.2 文件系统安装数据结构 41 2.3.3 安装普通文件系统 52 2.3.4 分配超级块对象 58 2.3.5 安装根文件系统 60 2.3.6 卸载文件系统 65 2.4 路径名的查找 66 2.4.1 查找路径名的一般流程 67 2.4.2 父路径名查找 82 2.4.3 符号链接的查找 84 2.5 VFS系统调用的实现 88 2.5.1 open()系统调用 88 2.5.2 read()和write()系统调用 96 2.5.3 close()系统调用 97 3 第二扩展文件系统 99 3.1 Ext2磁盘数据结构 101 3.1.1 磁盘超级块 102 3.1.2 组描述符和位图 105 3.1.3 磁盘索引节点表 105 3.2 VFS接口数据结构 110 3.2.1 Ext2 超级块对象 110 3.2.2 Ext2 的索引节点对象 121 3.2.3 创建Ext2文件系统 124 3.2.4 Ext2的方法总结 126 3.3 Ext2索引节点分配 129 3.3.1 创建索引节点 130 3.3.2 删除索引节点 143 3.4 Ext2数据块分配 144 3.4.1 数据块寻址 145 3.4.2 文件的洞 147 3.4.3 分配数据块 148 4 页面高速缓存 160 4.1 页高速缓存数据结构 160 4.1.1 address_space对象 161 4.1.2 基树 164 4.2 高速缓存底层处理函数 166 4.2.1 查找页 166 4.2.2 增加页 168 4.2.3 删除页 173 4.3 文件系统与高速缓存 175 4.3.1 缓冲头数据结构 175 4.3.2 分配块设备缓冲区页 178 4.3.3 释放块设备缓冲区页 184 4.4 在页高速缓存中搜索块 185 4.4.1 __find_get_block()函数 185 4.4.2 __getblk()函数 188 4.4.3 __bread()函数 190 4.5 把脏页写入磁盘 191 4.5.1 pdflush内核线程 192 4.5.2 搜索要刷新的脏页 193 4.5.3 回写陈旧的脏页 196 5 文件读写 199 5.1 系统调用VFS层的处理 200 5.2 第二扩展文件系统Ext2层的处理 201 5.2.1 Ext2的磁盘布局 202 5.2.2 Ext2的超级块对象 206 5.2.3 Ext2索引节点对象的创建 210 5.2.4 Ext2索引节点对象的读取 218 5.2.5 Ext2层读文件入口函数 225 5.3 页高速缓存层的处理 237 5.3.1 创建一个bio请求 238 5.3.2 得到文件的逻辑块号 244 5.3.3 普通文件的readpage方法 251 5.3.4 块设备文件的readpage方法 252 5.3.5 文件的预读 260 5.4 通用块层的处理 264 5.4.1 块设备的基础知识 265 5.4.2 通用块层相关数据结构 269 5.4.3 提交I/O传输请求 271 5.4.4 请求队列描述符 273 5.5 块设备I/O调度层的处理 281 5.5.1 块设备的初始化 284 5.5.2 建立块设备驱动环境 288 5.5.3 关联block_device结构 295 5.5.4 为设备建立请求队列 306 5.5.5 块设备I/O调度程序 311 5.5.6 真实的I/O调度层处理 321 5.6 块设备驱动层的处理 330 5.6.1 scsi总线驱动的初始化 330 5.6.2 scsi设备驱动体系架构 342 5.6.3 scsi块设备驱动层处理 347 5.6.4 scsi命令的执行 369 5.6.5 scsi命令的第一次转变 372 5.6.6 scsi命令的第二次转变 380 5.7 写文件 384 5.7.1 generic file_write函数 384 5.7.2 普通文件的prepare_write方法 386 5.7.3 块设备文件的prepare_write方法 387 5.7.4 将脏页写到磁盘 388 6 直接I/O与异步I/O 391 6.1 直接I/O 391 6.2 异步I/O 393 6.2.1 Linux 2.6中的异步I/O 394 6.2.2 异步I/O环境 394 6.2.3 提交异步I/O操作 395
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值