read 系统调用与 istream::read 函数有何不同?
How is a read system call different from the istream::read function?
我的操作系统教授今天谈到了读取系统调用是如何无缓冲的,而 istream::read 函数有缓冲。这让我有点困惑,因为你在使用它时仍然为 istream::read 函数创建一个缓冲区。
我唯一能想到的是istream::read函数调用中的缓冲区不止一个。为什么?
istream::read() 函数与 read() 函数系统调用有何不同?
教授说的是 istream
内部的缓冲区,而不是调用代码提供的缓冲区,数据在读取后结束。
例如,假设您正在从 istream
中读取单个 int
对象,istream
可能有一个内部缓冲区,其中存储了一些字节数,并且下一次读出来就可以满足了,而不是去OS。但是请注意,无论 istream
挂钩到什么,很可能也有内部缓冲区。大多数 OSes 有办法执行 zero-copy 读取(即,直接从 I/O 源读取到您的缓冲区),但该设施有严格的限制(读取大小必须是一些特定数量的字节,如果从磁盘文件读取文件指针也必须是该字节数的倍数)。大多数时候,这样的 zero-copy 阅读是不值得的。
我的操作系统教授今天谈到了读取系统调用是如何无缓冲的,而 istream::read 函数有缓冲。这让我有点困惑,因为你在使用它时仍然为 istream::read 函数创建一个缓冲区。
我唯一能想到的是istream::read函数调用中的缓冲区不止一个。为什么?
istream::read() 函数与 read() 函数系统调用有何不同?
教授说的是 istream
内部的缓冲区,而不是调用代码提供的缓冲区,数据在读取后结束。
例如,假设您正在从 istream
中读取单个 int
对象,istream
可能有一个内部缓冲区,其中存储了一些字节数,并且下一次读出来就可以满足了,而不是去OS。但是请注意,无论 istream
挂钩到什么,很可能也有内部缓冲区。大多数 OSes 有办法执行 zero-copy 读取(即,直接从 I/O 源读取到您的缓冲区),但该设施有严格的限制(读取大小必须是一些特定数量的字节,如果从磁盘文件读取文件指针也必须是该字节数的倍数)。大多数时候,这样的 zero-copy 阅读是不值得的。