回覆列表
  • 1 # 使用者7187350822507

    一般開啟並讀取一個檔案,傳統方法就是兩個系統呼叫,對吧:

    這裡 read 有一個 buf 緩衝區,這個是由你的應用程式控制的,在你的應用程式虛擬記憶體地址空間中,究竟是 堆,還是棧,這個看你宣告 buf 時候是怎麼做的。不過,核心中,也會有一個緩衝區,這個你的應用程式是看不見的,當你讀取時,核心會將資料放入自己的緩衝區,然後 copy 到使用者態你程式的緩衝區中。這個東西,在核心叫做 buffer cache,由IO 子系統管理,對於 Unix 系統來說,一般會預留最多 10% 作為 buffer cache 使用。如果你使用的是 mmap 方法,則會有:這一套過程與上面的 open/read 不同,是由核心分頁子系統管理的,說白了,就是用虛擬記憶體調頁的方式,將檔案直接 map 到程式的地址空間中,這個 map 也是靠核心實現的,這東西叫做 page cache,你也知道虛擬記憶體限制少很多,可以 map 直到佔用全部記憶體。傳統 read/write buffer cache 有個問題,就是一旦固定後,大小沒法調節,這樣分配多了就是浪費,分配少了就會造成很多的上下文切換做 copy 而且這個東西與分頁系統割裂。所以後來就出現了 Unified Buffer Cache,統一用 Page Cache 解決以上問題。所以你指的緩衝區,那是在核心裡的,不是棧,也不是堆,而是使用如 SLOB/SLAB/SLUB 分配器分配的 VMObjects

  • 中秋節和大豐收的關聯?
  • 這個“穗”字讀做什麼是shui還是hui。多謝?