对带缓存区的标准IO的理解

最近在看CSAPP上的系统级IO这一张,在看了RIO以及网上一些大神的博客之后,稍微有些心得,在此记录下来。

首先,系统本上是提供了内核级别的IO操作,这些IO操作虽然普遍被归为无缓冲的IO接口,但是这个缓冲是指在用户层是否有缓冲,内核提供的IO接口函数是在内核中有操作缓冲的。

例如,内核中提供了100个字节的缓存,但是如果每次我们调用IO的write只写入10个字节,那么要等10次循环将内核的缓存填满以后,内核才会将100个字节写入实际的磁盘上的文件里面。

另外,调用内核函数的开销是比较大的(至少要比调用用户模式下的函数),因此,对于内核函数的多次调用会在性能方面有所影响。

而带缓存的标准IO要解决的就是减少过对于内核IO函数的调用次数,通过大的用户缓存,然后调用系统IO函数,可以实现单次读入大量的磁盘文件内容到用户缓存或者等用户缓存满了一次只需单次调用系统IO函数即可完成磁盘文件的内容写入。

通过自带的容量较大的用户缓存,非标准IO(即带缓存的IO)函数可以有效减少对于系统IO函数的调用次数。

例如,用户需要读取一个磁盘上的文件,可以这次调用只读取了10个字节,但是调用带缓存的IO可以一次调用系统的read函数读入100个字节到用户缓存,接下去的98个字节的读取,用户就完全是读取缓存理的内容,而不用再去调用系统IO10个字节10个字节一读了。

你可能感兴趣的:(CSAPP,C++)