簡體   English   中英

FreeBSD ftruncate()+mmap() 大洞警告

[英]FreeBSD ftruncate()+mmap() big hole warning

FreeBSD 13.1 手冊頁mmap()有以下警告:

警告,使用 ftruncate(2) 擴展文件,從而創建一個大洞。 然后通過修改共享的 mmap() 來填補漏洞會導致嚴重的文件碎片。 為了避免這種碎片,在通過 mmap() 修改區域之前,您應該始終通過將零寫入新擴展區域來預先分配文件的后備存儲,碎片問題對 MAP_NOSYNC 頁面特別敏感。 因為頁面可能以完全隨機的順序刷新到磁盤。

問題:

  1. 這個大洞是什么? 為什么ftruncate()具有創建它的效果; 為什么write()是該問題的建議解決方案?
  2. 如何在ftruncate()之后和mmap()之前有效地零填充孔? 重復調用write()聽起來可能需要更多的系統調用。
  3. 其他操作系統是否存在同樣的問題? 我在 macOS 或 Linux 上沒有發現這樣的警告。

您可以通過使用posix_fallocate預分配所需區域來避免此問題。

創建這個洞是因為文件可能很稀疏,只占用實際使用的區域所需的空間,所以當只使用ftruncate時,新區域的支持是虛擬的,它不會保留在磁盤上,直到你分配它或寫入給它。

它也適用於 Linux,只是沒有提到。 您可以期望大多數文件系統實現都做類似的事情; 通常他們確實會嘗試變得聰明,並且如果在時間上彼此接近,則會對您的寫入進行碎片整理,但無法發揮作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM