вопрос про системные вызовы чтения и записи в файл

когда пользовательская программа осуществляет системный вызов для чтения файла с диска или его записи на диск, она сообщает, какой файл ей нужен, предоставляет указатель на буфер данных и сообщает о количестве байтов. затем управление передается операционной системе, которая вызывает соответствующий драйвер. предположим, что драйвер запускает диск и приостанавливает свою работу до тех пор, пока не возникнет прерывание. очевидно, что в случае чтения данных с диска вызывающая программа будет заблокирована (поскольку для нее нет данных). а что произойдет в случае записи данных на диск? нужно ли блокировать вызывающую программу в ожидании завершения переноса данных на диск?

далеко не всегда. современные операционные системы поддерживают интерфейс прикладных программ с медлительными устройствами (в том числе и файловыми хранилищами — дисками). с этой целью в оперативной памяти создаётся буфер чтения-записи, все операции чтения или записи осуществляются с буфером, а операционная система берёт на себя задачу по синхронизации буфера с устройством (файлом на диске). при этом пользовательская программа даже не замечает подмены, поскольку чтение и запись происходят со скоростью озу, а ос может работать параллельно. даже первое чтение из файла можно предвосхитить путём предварительного кэширования данных. что касается приостановки программы после записи в файл (фактически в буфер чтения-записи), то это требуется только в том случае, если к тому же файлу может параллельно обращаться другой процесс, и крайне важно проконтролировать, чтобы реальный файл обновился. в противном случае программа отправила данные в буфер и продолжает выполняться, а за буфером последит система. даже если программа уже завершилась, ос не позволит удалить буфер до окончания последней синхронизации.

а

данные кэшируются операционкой, потом сбрасываются фоном на диск.

нет. данные кэшируются операционкой, потом сбрасываются фоном на диск.

нужно