系统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 ...

输入输出重定向

Linux Shell重定向(输入输出重定向)精讲

# 重定向符号 <(输入) >(覆盖输出) >>(追加输出)
# 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内核管理的内存区域。
img
图片来源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
posted @ 2023-05-08 16:52  我见青山应如是  阅读(16)  评论(0编辑  收藏  举报