A.3. Fsync
Fsync
I/O 비용이 많이 드는 작업으로 알려져 있지만 완전히 사실이 아닙니다.
Firefox 는 사용자가 링크를 클릭하여 새 페이지로 이동할 때마다 sqlite 라이브러리를 호출하는 데 사용되었습니다. SQLite는
fsync
이라고 하며 파일 시스템 설정(데이터 정렬 모드가 있는 그대로 ext3) 때문에 아무 일도 없을 때 지연 시간이 길어졌습니다. 다른 프로세스가 대용량 파일을 동시에 복사하는 경우 시간이 오래 걸릴 수 있습니다(최대 30초).
그러나
fsync
이 전혀 사용되지 않은 다른 경우에는 ext4 파일 시스템으로 전환하면 문제가 발생했습니다. Ext3은 몇 초마다 메모리를 플러시하고 디스크에 저장하는 데이터 정렬 모드로 설정되었습니다. 그러나 ext4 및 laptop_mode를 사용하면 저장 간격이 길고 시스템이 예기치 않게 꺼지면 데이터가 손실될 수 있습니다. 이제 ext4가 패치되어 있지만 애플리케이션의 설계를 신중하게 고려하고 fsync
를 적절하게 사용해야 합니다.
구성 파일을 읽고 쓰는 간단한 예는 파일의 백업 또는 데이터 손실 방법을 보여줍니다.
/* open and read configuration file e.g. ./myconfig */ fd = open("./myconfig", O_RDONLY); read(fd, myconfig_buf, sizeof(myconfig_buf)); close(fd); ... fd = open("./myconfig", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR); write(fd, myconfig_buf, sizeof(myconfig_buf)); close(fd);
더 나은 접근 방식은 다음과 같습니다.
/* open and read configuration file e.g. ./myconfig */ fd = open("./myconfig", O_RDONLY); read(fd, myconfig_buf, sizeof(myconfig_buf)); close(fd); ... fd = open("./myconfig.suffix", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR write(fd, myconfig_buf, sizeof(myconfig_buf)); fsync(fd); /* paranoia - optional */ ... close(fd); rename("./myconfig", "./myconfig~"); /* paranoia - optional */ rename("./myconfig.suffix", "./myconfig");