[英]FreeBSD ftruncate()+mmap() big hole warning
FreeBSD 13.1 手冊頁mmap()有以下警告:
警告,使用 ftruncate(2) 擴展文件,從而創建一個大洞。 然后通過修改共享的 mmap() 來填補漏洞會導致嚴重的文件碎片。 為了避免這種碎片,在通過 mmap() 修改區域之前,您應該始終通過將零寫入新擴展區域來預先分配文件的后備存儲,碎片問題對 MAP_NOSYNC 頁面特別敏感。 因為頁面可能以完全隨機的順序刷新到磁盤。
問題:
ftruncate()
具有創建它的效果; 為什么write()
是該問題的建議解決方案?ftruncate()
之后和mmap()
之前有效地零填充孔? 重復調用write()
聽起來可能需要更多的系統調用。您可以通過使用posix_fallocate
預分配所需區域來避免此問題。
創建這個洞是因為文件可能很稀疏,只占用實際使用的區域所需的空間,所以當只使用ftruncate
時,新區域的支持是虛擬的,它不會保留在磁盤上,直到你分配它或寫入給它。
它也適用於 Linux,只是沒有提到。 您可以期望大多數文件系統實現都做類似的事情; 通常他們確實會嘗試變得聰明,並且如果在時間上彼此接近,則會對您的寫入進行碎片整理,但無法發揮作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.