我的操作系统教授今天谈到了当istream::read函数有缓冲区时,read系统调用是如何被解除缓冲的。这让我有点困惑,因为在使用istream::read函数时,您仍然为其制作缓冲区。
我唯一能想到的是istream::read函数调用中有多个缓冲区。为什么?
istream::read((函数与read(((函数系统调用有什么不同?
教授谈论的是istream
内部的缓冲区,而不是调用代码提供的缓冲区。
举个例子,假设您正在从istream
中读取单个int
对象,istream
可能有一个内部缓冲区,其中存储了一些字节数,并且可以从中满足下一次读取,而不是进入操作系统。然而,请注意,无论istream
挂接到什么,都很可能有内部缓冲区。大多数操作系统都可以执行零拷贝读取(也就是说,直接从I/O源读取到缓冲区(,但这种功能有严格的限制(读取大小必须是某个特定字节数的倍数,如果从磁盘文件读取,文件指针也必须是该字节计数的倍数(。大多数时候,这样的零拷贝阅读不值得这么麻烦。