int open (const char ‘*path‘, int ‘oflag‘, .../*,mode_t ‘mode‘ */);
ssize_t read(int fd, void *buf, size_t count);
void * mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
这一套过程与上面的 open/read 不同,是由内核分页子系统管理的,说白了,就是用虚拟内存调页的方式,将文件直接 map 到程序的地址空间中,这个 map 也是靠内核实现的,这东西叫做 page cache,你也知道虚拟内存限制少很多,可以 map 直到占用全部内存。
传统 read/write buffer cache 有个问题,就是一旦固定后,大小没法调节,这样分配多了就是浪费,分配少了就会造成很多的上下文切换做 copy 而且这个东西与分页系统割裂。所以后来就出现了 Unified Buffer Cache,统一用 Page Cache 解决以上问题。
对于使用C语言标准IO函数,将文件抽象为 流 的概念,当打开一个流时,返回指向FILE对象的指针。该对象通常是一个结构,包括用于实际IO的文件描述符,指向用于该流缓冲区的指针,缓冲区的长度,当前在缓冲区的字符数和出错标志。