问问题描述
存储读取数据的缓冲区是什么意思,这个怎么解决啊?快急疯了?
答精选答案

一般打开并读取一个文件,传统方法就是两个系统调用,对吧:
这里 read 有一个 buf 缓冲区,这个是由你的应用程序控制的,在你的应用程序虚拟内存地址空间中,究竟是 堆,还是栈,这个看你声明 buf 时候是怎么做的。不过,内核中,也会有一个缓冲区,这个你的应用程序是看不见的,当你读取时,内核会将数据放入自己的缓冲区,然后 copy 到用户态你程序的缓冲区中。这个东西,在内核叫做 buffer cache,由IO 子系统管理,对于 Unix 系统来说,一般会预留最多 10% 作为 buffer cache 使用。如果你使用的是 mmap 方法,则会有:这一套过程与上面的 openead 不同,是由内核分页子系统管理的,说白了,就是用虚拟内存调页的方式,将文件直接 map 到程序的地址空间中,这个 map 也是靠内核实现的,这东西叫做 page cache,你也知道虚拟内存限制少很多,可以 map 直到占用全部内存。传统 read/write buffer cache 有个问题,就是一旦固定后,大小没法调节,这样分配多了就是浪费,分配少了就会造成很多的上下文切换做 copy 而且这个东西与分页系统割裂。所以后来就出现了 Unified Buffer Cache,统一用 Page Cache 解决以上问题。所以你指的缓冲区,那是在内核里的,不是栈,也不是堆,而是使用如 SLOB/SLAB/SLUB 分配器分配的 VMObjects本文来自作者[霜打的鞋子125]投稿,不代表公众科技网立场,如若转载,请注明出处:https://www.cpst.net.cn/changshijingxuan/202609/2155347.html
评论列表(4条)
我是公众科技网的签约作者“霜打的鞋子125”!
希望本篇文章《存储读取数据的缓冲区是什么意思》能对你有所帮助!
本站[公众科技网]内容主要涵盖:教育咨询,知识百科
本文概览:一般打开并读取一个文件,传统方法就是两个系统调用,对吧:这里 read 有一个 buf 缓冲区,这个是由你的应用程序控制的,在你的应用程序虚拟内存地址空间中,究竟是 堆,还是栈,这个看你声明 buf 时候是怎么做的。不过,内核中,也会有一个缓冲区,这个你的应用程序是看不见的,当你读取时,内核会将数据放入自己的缓冲区,然后 copy 到用户态你程序的缓冲区中。这个东西,在内核叫做 buffer cache,由IO 子系统管理,对于 Unix 系统来说,一般会预留最多 10% 作为 buffer cache