SSD の場合、行デバイスを開き、ioctl()
withBLKDISCARD
コマンドを使用してページの範囲を破棄できます。
私の質問は
開いているファイルの場合、データの範囲を破棄するにはどうすればよいですか? また、それは基盤となるファイルシステムの実装に依存しますか?
答え1
あなたが探していますfallocate
のFALLOC_FL_PUNCH_HOLE
それらのブロックを破棄/トリム/アンマップするのはファイルシステム次第です。ext4 はそうすると思います。
たとえば、1MiB から 2MiB を破棄するには、次のようにします。
err = fallocate(fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, 1048576, 2097152);
if (0 != err) {
/* handle error */
}
成功した場合、それらのバイトの今後の読み取りでは 0 が返されるはずです。
[注: POSIX にはこれを行う方法がありません。上記の fallocate は Linux 固有です。ただし、質問に Linux のタグを付けているので、問題ないと思います。]