Tôi rất nghi ngờ rằng có thể không bị lợi dụng bởi bất kỳ hệ điều hành, nhưng nó sẽ có thể cho một hệ điều hành để ý tối ưu hóa cho:
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
}
Những lý do mà một hệ điều hành thể có thể tận dụng lợi thế của điều này là cho đến khi bạn viết vào một trang cụ thể (và không ai khác đã làm một trong hai) hệ điều hành có lẽ sẽ chỉ sử dụng trang của tập tin thực tế tại vị trí đó như là trao đổi cho trang đó.
Sau đó, khi bạn đã viết thư cho một số thiết lập của các trang hệ điều hành sẽ Sao chépOnViết những trang cho quá trình của bạn, nhưng vẫn giữ các trang bất thành văn được sao lưu bởi các tập tin gốc. Sau đó, khi gọi write
hệ điều hành có thể nhận thấy rằng việc ghi được chặn liên kết cả trong bộ nhớ và trên đĩa, và sau đó nó có thể nhận thấy rằng một số trang bộ nhớ nguồn đã được đồng bộ với các trang hệ thống tệp chính xác mà chúng đã được viết và chỉ viết ra các trang đã thay đổi.
Tất cả điều đó được nói, nó sẽ không làm tôi ngạc nhiên nếu tối ưu hóa này không được thực hiện bởi bất kỳ hệ điều hành nào, và loại mã này kết thúc lên rất chậm và gây ra nhiều ghi đĩa khi bạn gọi 'viết'. Sẽ rất tuyệt nếu nó bị lợi dụng.
Không cần để đồng bộ hóa quá trình này. Đó là một bản sao lưu. Tôi cũng muốn tránh làm bất kỳ loại sao chép nào nếu có thể. Dữ liệu cũng ít nhất 50MB. – arsenm