![Linux 上磁盘的字符设备](https://linux22.com/image/110083/Linux%20%E4%B8%8A%E7%A3%81%E7%9B%98%E7%9A%84%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87.png)
为什么其他 UNIX 系统需要字符设备作为存储设备,而 Linux 不需要?
其他 UNIX 操作系统(AIX、HPUX、Solaris 和 macOS)使用类似“/dev/rdisk#”和“/dev/disk#”的存储设备。
答案1
我认为这篇维基百科文章https://en.wikipedia.org/wiki/Raw_device解释得很好:
在计算中,特别是在 Unix 和类 Unix 操作系统中,原始设备是一种与字符设备文件关联的特殊逻辑设备,它允许直接访问硬盘驱动器等存储设备,绕过操作系统的缓存和缓冲区(尽管仍可能使用硬件缓存)。像数据库管理系统这样的应用程序可以直接使用原始设备,使它们能够管理数据的缓存方式,而不是将此任务推迟给操作系统。
在 FreeBSD 中,所有设备文件实际上都是原始设备。 FreeBSD 4.0 中删除了对非原始设备的支持,以简化缓冲区管理并提高可扩展性和性能。1
在 Linux 内核中,原始设备已被弃用并计划在某一时刻删除,因为可以使用 O_DIRECT 标志来代替。
答案2
在块设备接口时可能希望使用原始接口的原因是原始接口通常更快。操作系统仅对块特殊文件执行缓冲区高速缓存。
当从磁带等介质读取或写入非常大的文件时,操作系统的缓冲区缓存不会提供任何好处,因为不会多次读取任何块。使用原始设备接口可以避免这种多余的系统活动。
在磁介质上处理非常大的流文件时使用原始设备接口的另一个原因是原始接口可以支持非常大的块大小,从而允许实现非常高的数据传输速率。当使用块设备接口访问设备时,所有读取和写入都必须通过系统缓冲区,因此仅限于文件系统块大小(通常为 1K 或 2K 字节)。使用原始设备时,可以使用 32K 或更大的块大小。 ——约翰·J·瓦利,UNIX 程序员参考; 1991 年编辑。
除了性能提升之外,出于缓存一致性的原因,还需要卸载通过块接口访问的文件系统。系统缓存的块在写回磁盘时可能会破坏通过块设备所做的更改。在 fschk 之前拆卸是一个小麻烦;如果需要直接访问的应用程序是系统的主要用途,那就更糟糕了。
在回答你原来的问题时,许多问题很大程度上都是历史问题。在当代系统中,设备缓冲区大于系统缓冲区的情况并不常见。 (您最后一次使用连接到高速打印机且缓冲区大于工作站内存的工作站是什么时候?)