面试-操作系统篇:文件系统与I/O
WX PUB:「曹当家的」
文件系统与 I/O 操作相关的原理基本上也是面试常问的类型了,这次我准备了几个非常高频的相关问题,相信你消化完这些会有一定的收获。废话不多说,来,发车!
1. 文件系统和磁盘有什么关系?
2. 文件系统有哪些结构?
3. 什么是虚拟文件系统,有什么作用?
4. 同步IO和异步IO,阻塞和非阻塞IO有什么区别?
5. 什么是DMA技术?
6. 什么是零拷贝技术?
7. 磁盘的分类,都有什么特点?
8. IO调度算法有哪几种?
1. 文件系统和磁盘有什么关系?
磁盘属于硬件,是一种为系统提供了基本的持久化存储的设备。
文件系统属于操作系统的功能,以磁盘为载体,提供了一个用来管理文件的树状结构。
2. 文件系统有哪些结构?
文件系统主要由索引节点、目录项、超级块、逻辑块组成。
- 索引节点:记录了文件的元信息,包括文件权限、文件大小、创建时间、数据的索引位置等等。索引节点是文件的唯一标识,和文件一一对应,它和文件内容一样会持久化到磁盘中保存。
- 目录项:用来记录文件的名字、索引节点的指针以及与其他目录项的关联关系。多个关联的目录项组成了文件系统的目录结构。目录项对象不会存储到磁盘中,而是被缓存起来,便于快速的解析目录。
- 超级块:存储了整个文件系统的状态,如索引节点、逻辑块的使用情况。
- 逻辑块:文件系统用来存储数据的最小单位,大小为 4 KB,一般由 8 个连续的扇区组成(磁盘读写的最小单位是扇区,大小为 512B),多个逻辑块组成了文件系统的数据块区。
3. 什么是虚拟文件系统,有什么作用?
虚拟文件系统(VFS)是操作系统在用户层与文件系统之间引入的一个抽象层,屏蔽了不同文件系统之间的差异,定义了一组标准的系统调用接口,为用户提供了统一访问文件的方式。
VFS 定义了一组所有文件都支持的数据结构和标准接口,这样,用户和其他内核子系统只需要跟 VFS 提供的统一接口交互就可以了,而不需要关心底层各种文件系统的实现细节。
4. 同步 I/O 和异步 I/O,阻塞和非阻塞 I/O 有什么区别?
两种是不同角度的 I/O 划分方式。
根据是否等待系统的 I/O 请求响应,可以分为同步 I/O 和异步 I/O,关注对象是I/O 的执行者(系统),比如系统调用 read 是同步读,在没有得到磁盘数据前不会响应应用程序,而 aio_read 是异步读,系统收到 I/O 请求后不等待处理就立即返回了,而读取的结果通过回调的方式异步通知给应用程序。
根据应用程序是否阻塞自身运行,可以分为阻塞 I/O 和 非阻塞 I/O,针对的 I/O 的调用者(应用程序)。比如在套接字接口中,使用 send 向套接字接口发送数据时,如果套接字没有设置 O_NOBLOCK 标识,那么 send 操作会一直阻塞,而如果使用了 epoll,系统会告诉套接字的状态,就可以使用非阻塞的方式读写套接字。
5. 什么是 DMA 技术?
一种内存访问技术。DMA(Direct Memory Access,直接存储器访问)可以在不需要 CPU 参与的情况下实现内存的读取或写入,因为不依赖 CPU 的大量中断负载,因而可以实现数据的快速传送,提高系统的并发性能。
DMA 的传输过程必须经过 DMA 请求,DMA 响应,DMA 传输,DMA 结束 4 个步骤:
- DMA 请求:CPU 对 DMA 芯片进行设置,说明需要传送的字节数,有关的设备和内存地址,然后启动 DMA;
- DMA 响应:DMA 向 CPU 请求总线控制权,CPU 处理完当前总线数据后就让出总线;
- DMA 传输:DMA 控制器 直接控制内存与 I/O 接口进行数据传输;
- DMA 结束:DMA 传输结束后,把总线控制权交还给 CPU,并向 I/O 接口发送结束信号.
6. 什么是零拷贝技术?
零拷贝指计算机不需要先将数据从一个内存区域复制到另外一个内存区域,从而减少系统调用切换、减少拷贝次数,从而减少 CPU 的执行时间和负载。
实现零拷贝主要用到的是 DMA 数据传输技术和内存映射技术。
传统的 I/O 方式需要经过四次拷贝才能把磁盘上的数据输出到网络端口:
-
执行 read 系统调用,从用户态切换到内核态,CPU 向 DMA 控制器芯片下发指令,将磁盘数据通过直接内存访问的方式拷贝到内核缓冲区中;
-
CPU 接收到 DMA 结束拷贝的信号,将内核缓冲区的数据拷贝到用户缓冲区中,read 调用结束,返回到用户态;
-
用户程序执行 write 系统调用,从用户态切换到内核态,CPU 将数据从用户缓冲区中拷贝到Socket 发送缓冲区中;
-
CPU 下发指令,让 DMA 控制器来处理数据,将 Socket 发送缓冲区的数据拷贝到网卡进行网络传输,write 调用结束。
零拷贝有几种实现方式,如下:
- mmap + write:mmap 是一个系统调用,主要作用就是将用户缓冲区与内核中的读缓冲区进行映射,映射后这一步就不需要进行数据拷贝了,而 write 操作实际上是从内核读缓冲区中把数据拷贝到 Socket 发送缓冲区,整个过程减少了一次拷贝操作,但是系统调用切换没有减少。
- sendfile:sendfile 同样省去了将数据在内核和用户空间中拷贝,与 mmap 不同的是,sendfile 不需要借助 write 调用,而是一次完整的内核拷贝过程,减少了两次 CPU 上下文切换。
- sendfile + DMA gather copy:对 sendfile 系统调用做了修改,引入了 gather 操作,不需要将内核缓冲区的数据拷贝到 Socket 中,而是将它对于的数据描述信息(内存地址、文件描述符,文件长度等)记录到 Socket 缓冲区中,最后由 DMA 根据这些文件描述信息从内核读缓冲区中找到数据,直接拷贝到网卡设备中。
- splice:splice 系统调用可以在内核空间的读缓冲区和网络缓冲区之间建立管道(pipeline),从而避免了两者之间的 CPU 拷贝操作。
无论是传统 I/O 拷贝方式还是引入零拷贝的方式,2 次 DMA Copy 是都少不了的,因为两次 DMA 都是依赖硬件完成的。下面从 CPU 拷贝次数、DMA 拷贝次数以及系统调用几个方面总结一下上述几种 I/O 拷贝方式的差别。
| 拷贝方式 | CPU拷贝 | DMA拷贝 | 系统调用 | 上下文切换 |
|---|---|---|---|---|
| 传统方式(read + write) | 2 | 2 | read / write | 4 |
| 内存映射(mmap + write) | 1 | 2 | mmap / write | 4 |
| sendfile | 1 | 2 | sendfile | 2 |
| sendfile + DMA gather copy | 0 | 2 | sendfile | 2 |
| splice | 0 | 2 | splice | 2 |
7. 磁盘的分类,都有什么特点?
常见的磁盘有机械磁盘和固态硬盘:
- 机械磁盘:也叫磁盘驱动器(HDD),带有旋转臂和磁头,由电机驱动带动盘片旋转,顺序读取的速度较快,随机读取较慢,因为要经常旋转磁头进行磁道寻址。最小读写单位是扇区,一般是 512 字节大小
- 固态硬盘:SSD,控制闪存颗粒进行数据的读写,属于完全的电子操作。最小操作单位是页,通常是 4KB。
8. I/O 调度算法有哪几种?
NOOP:电梯调度,最简单一种调度算法,维护一个先进先出的队列,只做一些基本的请求合并,常用于 SSD。
CFS:完全公平的调度器,一般是默认的调度算法,类似于进程调度,为每个 I/O 进程维护一个队列,并按照时间片均匀分布每个进程的 I/O 请求。适合运行大量进程的场景。
DeadLine:截止时间请求调度,分别为每个读写请求都维护一个调度队列,以提高磁盘的吞吐量,并确保达到最终极限的请求得到优先处理。适用于 I/O 比较重的场景,如数据库。
END
今天的分享就到这了,对这个系列感兴趣可以点击话题 #程序员面试系列 专辑查看前面分享的几期内容,也欢迎关注我后面的持续更新。

欢迎关注「曹当家的」,订阅最新文章推送

浙公网安备 33010602011771号