存儲讀取數(shù)據(jù)的緩沖區(qū)是什么意思?
一般打開并讀取一個文件,傳統(tǒng)方法就是兩個系統(tǒng)調(diào)用,對吧:
這里 read 有一個 buf 緩沖區(qū),這個是由你的應(yīng)用程序控制的,在你的應(yīng)用程序虛擬內(nèi)存地址空間中,究竟是 堆,還是棧,這個看你聲明 buf 時候是怎么做的。不過,內(nèi)核中,也會有一個緩沖區(qū),這個你的應(yīng)用程序是看不見的,當(dāng)你讀取時,內(nèi)核會將數(shù)據(jù)放入自己的緩沖區(qū),然后 copy 到用戶態(tài)你程序的緩沖區(qū)中。這個東西,在內(nèi)核叫做 buffer cache,由IO 子系統(tǒng)管理,對于 Unix 系統(tǒng)來說,一般會預(yù)留最多 10% 作為 buffer cache 使用。如果你使用的是 mmap 方法,則會有:這一套過程與上面的 open/read 不同,是由內(nèi)核分頁子系統(tǒng)管理的,說白了,就是用虛擬內(nèi)存調(diào)頁的方式,將文件直接 map 到程序的地址空間中,這個 map 也是靠內(nèi)核實現(xiàn)的,這東西叫做 page cache,你也知道虛擬內(nèi)存限制少很多,可以 map 直到占用全部內(nèi)存。傳統(tǒng) read/write buffer cache 有個問題,就是一旦固定后,大小沒法調(diào)節(jié),這樣分配多了就是浪費(fèi),分配少了就會造成很多的上下文切換做 copy 而且這個東西與分頁系統(tǒng)割裂。所以后來就出現(xiàn)了 Unified Buffer Cache,統(tǒng)一用 Page Cache 解決以上問題。所以你指的緩沖區(qū),那是在內(nèi)核里的,不是棧,也不是堆,而是使用如 SLOB/SLAB/SLUB 分配器分配的 VMObjects