第一次听到这个词,当然也是一脸懵.
裸I/O 是什么东西呢?
裸I/O又称为直接I/O和非直接I/O相反,这不是“”废话“”么?
可是书上还真是这么写的。
究竟是什么呢?
直接 I/O(裸I/O),是指跳过操作系统的页缓存,直接跟文件系统交互来访问文件。
非直接 I/O 正好相反,文件读写时,先要经过系统的页缓存,然后再由内核或额外的系统调用,真正写入磁盘。
磁盘是一个存储设备(确切地说是块设备),可以被划分为不同的磁盘分区。而在磁盘或者磁盘分区上(lvm是直接可以基于磁盘直接做成lv的),还可以再创建文件系统,并挂载到系统的某个目录中。这样,系统就可以通过这个挂载目录,来读写文件。
换句话说,磁盘是存储数据的块设备,也是文件系统的载体。所以,文件系统确实还是要通过磁盘,来保证数据的持久化存储。
Linux 中一切皆文件,块设备、套接字、管道... 都是文件
通过相同的文件接口,来访问磁盘和文件(比如 open、read、write、close 等)
在读写普通文件时,I/O 请求会首先经过文件系统,然后由文件系统负责,来与磁盘进行交互。而在读写块设备文件时,会跳过文件系统,直接与磁盘交互,也就是所谓的“裸I/O”
sda是一个物理磁盘属于块设备
servers]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 5M 0 loop /mnt sda 8:0 0 558.9G 0 disk ├─sda1 8:1 0 500M 0 part /boot/efi ├─sda2 8:2 0 500M 0 part /boot └─sda3 8:3 0 557.9G 0 part ├─rootvg-rootlv (dm-0) 253:0 0 5G 0 lvm / ├─rootvg-swaplv (dm-1) 253:1 0 16G 0 lvm [SWAP] ├─rootvg-homelv (dm-2) 253:2 0 15G 0 lvm /home ├─rootvg-varlv (dm-3) 253:3 0 80G 0 lvm /var ├─rootvg-locallv (dm-4) 253:4 0 2G 0 lvm /usr/local ├─rootvg-optlv (dm-5) 253:5 0 12G 0 lvm /opt ├─rootvg-usrlv (dm-6) 253:6 0 10G 0 lvm /usr ├─rootvg-tmplv (dm-7) 253:7 0 15G 0 lvm /tmp └─rootvg-gpmasterlv (dm-8) 253:8 0 400G 0 lvm /gpmaster servers]# ll /dev/sda brw-rw---- 1 root disk 8, 0 Dec 12 2019 /dev/sda
lv 是一个链接文件,指向dm2
servers]# ll /dev/mapper/rootvg-homelv lrwxrwxrwx 1 root root 7 Mar 27 11:06 /dev/mapper/rootvg-homelv -> ../dm-2
dm2还是块设备。
servers]# ll /dev/dm-2 brw-rw---- 1 root disk 253, 2 Mar 27 11:06 /dev/dm-2
类似于这种就是裸I/O
dd if=/dev/sdb of=/dev/null bs=1M count=1024
如果if后面是一个有文件系统的目录则就是非直接I/O。先要经过系统的页缓存,然后再由内核或额外的系统调用,最后写入磁盘的。