Важно понимать следующее: нет никакой ложки
С точки зрения Линукса, данные, которые вы якобы пишете на диск - это страницы в памяти, которые помечены как неанонимные (это значит, что на диске есть файл, который с ними связан), и грязные (а это значит, что эти страницы надо сбросить на диск).
Причем момент, когда произойдет сброс, зависит от кучи факторов - программист на это может влиять таким образом:
-он может потребовать, чтобы ядро сбросило данные на накопитель и вернуло управление только после того, как накопитель сообщил, что данные сброшены.
То есть, программист может потребовать, чтобы данные сбросились на диск пораньше, но не попозже.
После сбрасывания страниц на диск, ОС помечает их как чистые. Это значит, что их можно занять под что-то другое. Можете запустить htop и посмотреть на желтую полоску - это как раз те самые страницы кэша, и их может быть очень много.
Для небольших файлов может быть выгоднее использовать отображение файла на память (mmap), вместо ручного ковыряния с записью-чтением.
А теперь важный вопрос - как же понять, остаются ли данные в кэше после записи. Да легко.
-очистите кэш sync; echo 1 > /proc/sys/vm/drop_caches
-посмотрите, что желтая часть на полоске памяти в htop исчезла
-запустите DD, запишите на диск гигабайт. (dd if=/dev/urandom of=test.raw bs=8M count=128 status=progress)
-посмотрите, что у вас нарисовался желтый гигабайт
-можете потом считать этот файл и увидеть офигительную скорость - выше гигабайта в секунду (у меня получается 6, что очевидно говорит о том, что чтение происходило из RAM). Последнее лучше делать, если писали на HDD - потому что хороший SSD может выдать столько же
Объективно, этот тест показывает, что ДА, записанные данные остаются болтаться в памяти.
Но при этом, момент, когда эти данные оттуда уйдут, зависит от множества факторов (скажем, если памяти - в обрез, PageCache пойдет под нож в первую очередь). Так что может оказаться полезным использовать другие стратегии - например, mmap