Я очень подозреваю, что ни одна ОС не может воспользоваться этим, но ОС могла бы заметить оптимизацию для:
int fd = open("file", O_RDWR | O_SYNC | O_DIRECT);
size_t length = get_lenght(fd);
uint8_t * map_addr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
...
// This represents all of the changes that could possibly happen before you
// want to update the on disk file.
change_various_data(map_addr);
if (is_time_to_update()) {
write(fd, map_addr, length);
lseek(fd, 0, SEEK_SET);
// you could have just used pwrite here and not seeked
}
Причины, по которым ОС могла возможно, вы воспользуетесь тем, что до тех пор, пока вы не запишете на определенную страницу (и никто другой этого не сделал), ОС, вероятно, будет просто использовать реальную страницу файла в этом месте в качестве подкачки для этой страницы.когда вы записываете на какой-то набор этих страниц, ОС копирует вкл записывает эти страницы для вашего процесса, но при этом сохраняет неписанные страницы, сохраненные оригиналомфайл.
Затем при вызове write
ОС может заметить, что запись была выровнена по блокам как в памяти, так и на диске, а затем заметить, что некоторые страницы памяти источника уже синхронизированы с этими.точные страницы файловой системы, на которые они были записаны, и записывают только те страницы, которые изменились.
С учетом всего сказанного, меня не удивит, еслиего оптимизация не выполняется ни одной ОС, и этот тип кода оказывается очень медленным и вызывает много записи на диск, когда вы вызываете «write».Было бы здорово, если бы этим воспользовались.