系统IO
IO
冯诺依曼结构:计算器 控制器 主存储器 输入设备 输出设备
Linux -> 类Unix -> VFS(Virtual Filesystem Switch)虚拟文件系统转换 -> 统一文件模型
df
查看文件挂载情况
一切皆文件
lsof
(list open files)查看进程打开的文件的工具。常根参数进程id
mount
挂载
常见文件类型
符号表示 | 含义 |
---|---|
- | 普通文件(可执行、图片、文本)REG |
d | 目录 |
l | 链接 |
b | 块设备 |
c | 字符设备 CHR |
s | socket |
p | popeline 管道 |
eventpoll | ... |
输入输出重定向
# 重定向符号 <(输入) >(覆盖输出) >>(追加输出)
# 0: 标准输入; 1: 标准输出; 2: 错误输出
# command > file 已覆盖的方式将command的正确输出输出到file文件中,如
ls -l > out.txt
# command >> file 已追加的方式将command的正确输出输出到file文件中
# 将正确信息输出到out.txt, 错误信息输出到err.txt
command >out.txt 2>err.txt
# 将正确与错误信息都输出到out.txt
# 注意:command 2>$1 1>out.txt 是不行的。因为2先重定向到1的具体位置任然是屏幕
# command >file 2>file 不推荐会导致 file 被打开两次,引起资源竞争
command >out.txt 2>&1
注意:
文件描述符代表打开的文件,有inode号和seek偏移指针的概念
文件描述符(FD)与重定向符号之间不能有空格
测试管道文件类型
输入如下
{ echo $BASHPID ; read x; } | {cat ; echo $BASHPID ; read y; }
另启一个shell,执行lsof
跟上上面输出的进程id号。如 lsof -op 5068
示例:
shell1
< { echo $BASHPID ; read x; } | {cat ; echo $BASHPID ; read y; }
> 5068
<
shell2
< lsof -op 5068
COMMAND PID USER FD TYPE DEVICE OFFSET NODE NAME
bash 5068 root cwd DIR 253,0 9438269 /root/io
bash 5068 root rtd DIR 253,0 64 /
bash 5068 root txt REG 253,0 25382708 /usr/bin/bash
bash 5068 root mem REG 253,0 25382699 /usr/lib/locale/locale-archive
bash 5068 root mem REG 253,0 15691 /usr/lib64/libnss_files-2.17.so
bash 5068 root mem REG 253,0 15673 /usr/lib64/libc-2.17.so
bash 5068 root mem REG 253,0 15679 /usr/lib64/libdl-2.17.so
bash 5068 root mem REG 253,0 18434 /usr/lib64/libtinfo.so.5.9
bash 5068 root mem REG 253,0 15666 /usr/lib64/ld-2.17.so
bash 5068 root mem REG 253,0 18403 /usr/lib64/gconv/gconv-modules.cache
bash 5068 root 0u CHR 136,0 0t0 3 /dev/pts/0
bash 5068 root 1w FIFO 0,9 0t0 37283 pipe
bash 5068 root 2u CHR 136,0 0t0 3 /dev/pts/0
bash 5068 root 255u CHR 136,0 0t0 3 /dev/pts/0
可以看见倒数第三行name:pipe
测试socket文件类型
命令参考 https://www.cnblogs.com/pengsay/p/14903145.html
# exec 命令用于调用并执行指定的命令。
#含义: /dev/tcp/www.baidu.com/80:与百度的80端口通过socket技术建立了tcp连接,用8去指向了这个连接,从连接中可以拿到输入流和输出流 # 8<> 相当于是一个输入输出流的channel(通道),8就是文件描述符.
# exec [-cl] [-a 名称] [命令 [参数 ...]] [重定向 ...] 这个用法会用指定命令去替换shell.只不过上面那句话中没有[命令]这个选项,只是添加了一个重定向.可以通过cd /proc/
# 命令解释:
# 8:新建的文件描述符
# <>:既要发送请求,又要接收响应数据
# /dev/tcp:这个目录看不到,但内核确实有
# 一旦执行该命令,就会新建一个socket连接
# 删除文件描述符:
# exec 8<& -
[root@centos-module io] exec 8<> /dev/tcp/www.baidu.com/80
[root@centos-module io] lsof -op $$
COMMAND PID USER FD TYPE DEVICE OFFSET NODE NAME
bash 5247 root cwd DIR 253,0 9438269 /root/io
bash 5247 root rtd DIR 253,0 64 /
bash 5247 root txt REG 253,0 25382708 /usr/bin/bash
bash 5247 root mem REG 253,0 15701 /usr/lib64/libresolv-2.17.so
bash 5247 root mem REG 253,0 15689 /usr/lib64/libnss_dns-2.17.so
bash 5247 root mem REG 253,0 25382699 /usr/lib/locale/locale-archive
bash 5247 root mem REG 253,0 15691 /usr/lib64/libnss_files-2.17.so
bash 5247 root mem REG 253,0 15673 /usr/lib64/libc-2.17.so
bash 5247 root mem REG 253,0 15679 /usr/lib64/libdl-2.17.so
bash 5247 root mem REG 253,0 18434 /usr/lib64/libtinfo.so.5.9
bash 5247 root mem REG 253,0 15666 /usr/lib64/ld-2.17.so
bash 5247 root mem REG 253,0 18403 /usr/lib64/gconv/gconv-modules.cache
bash 5247 root 0u CHR 136,1 0t0 4 /dev/pts/1
bash 5247 root 1u CHR 136,1 0t0 4 /dev/pts/1
bash 5247 root 2u CHR 136,1 0t0 4 /dev/pts/1
bash 5247 root 8u IPv4 39145 0t0 TCP bogon:52010->220.181.38.150:http (ESTABLISHED)
bash 5247 root 255u CHR 136,1 0t0 4 /dev/pts/1
# 命令解释:
# -e:使其识别\n为换行符
# GET:请求方式
# /:请求内容为主页
# HTTP/1.0:HTTP协议1>& 8将标准输出重定向到 8(上面的文件描述符代表的socket)
# 执行该命令则立马向百度发送请求,百度响应的数据存在文件描述符8中
[root@centos-module io] echo -e "GET / HTTP/1.0\n" 1>& 8
# 读取响应信息
[root@centos-module io] cat 0<& 8
pagecache
Linux内核管理的内存区域。
图片来源https://spongecaptain.cool/SimpleClearFileIO/1.%20page%20cache.html
vm.dirty_background_ratio = 0
vm.dirty_background_bytes = 1048576
vm.dirty_ratio = 0
vm.dirty_bytes = 1048576
vm.dirty_writeback_centisecs = 5000
vm.dirty_expire_centisecs = 30000
保持微笑,时刻冷静,相信自己也相信队友,坚持信念