如何通过 sync() 方法实现 FileDescriptor 文件描述符的内核缓冲区与物理磁盘同步?
- 内容介绍
- 相关推荐
本文共计1466个文字,预计阅读时间需要6分钟。
plaintextsync() 方法本身不操作 FileDescriptor(文件描述符),也不直接作用于某个具体文件或 FileDescriptor 实例。它是一个全局、无参的系统调用。
作用对象是整个内核的 页缓存(page cache) 和 块设备缓冲区(buffer cache),而非某个打开的文件句柄。
下面从底层逻辑讲清楚它到底做了什么、为什么和 FileDescriptor 无关,以及它真正同步的是哪些“内核缓冲区变量”。
sync() 不接收 FileDescriptor,也不按文件粒度工作
-
sync()是 POSIX 定义的系统调用(#include <unistd.h>),原型为:void sync(void);
它没有参数,无法指定文件、路径或
int fd。 - Java 的
FileDescriptor.sync()是对fsync(fd)的封装(针对单个 fd),不是sync();而 Linux 命令行里的sync命令调用的正是sync()系统调用——二者常被混淆,但语义完全不同。
本文共计1466个文字,预计阅读时间需要6分钟。
plaintextsync() 方法本身不操作 FileDescriptor(文件描述符),也不直接作用于某个具体文件或 FileDescriptor 实例。它是一个全局、无参的系统调用。
作用对象是整个内核的 页缓存(page cache) 和 块设备缓冲区(buffer cache),而非某个打开的文件句柄。
下面从底层逻辑讲清楚它到底做了什么、为什么和 FileDescriptor 无关,以及它真正同步的是哪些“内核缓冲区变量”。
sync() 不接收 FileDescriptor,也不按文件粒度工作
-
sync()是 POSIX 定义的系统调用(#include <unistd.h>),原型为:void sync(void);
它没有参数,无法指定文件、路径或
int fd。 - Java 的
FileDescriptor.sync()是对fsync(fd)的封装(针对单个 fd),不是sync();而 Linux 命令行里的sync命令调用的正是sync()系统调用——二者常被混淆,但语义完全不同。

