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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值