fsync()
와 O_SYNC
는 파일 시스템에서 데이터를 안전하게 디스크에 기록하기 위한 동기화 메커니즘입니다. 두 가지 모두 데이터를 안정적으로 저장하기 위한 중요한 역할을 하지만, 사용하는 방식과 동작 방식에 차이가 있습니다.
1. fsync()
fsync()
는 파일 시스템에서 파일의 데이터를 디스크에 강제로 기록(플러시)하는 시스템 호출입니다. 이는 데이터를 디스크에 안전하게 저장하기 위한 함수로, 운영 체제의 캐시 또는 버퍼에 저장된 데이터를 디스크로 내보내고, 해당 데이터가 실제 디스크에 완전히 기록될 때까지 기다립니다.
사용 이유:
- 일반적인 파일 쓰기 작업에서는 데이터가 먼저 메모리나 캐시에 저장되며, 디스크에 기록되는 작업은 운영체제에 의해 지연될 수 있습니다.
- 시스템이 갑자기 종료되거나 충돌할 경우, 메모리나 캐시에 남아있던 데이터는 손실될 수 있습니다.
fsync()
는 메모리에 있는 변경된 데이터(Dirty 데이터)를 즉시 디스크에 기록하여 데이터를 안전하게 보관하는 데 사용됩니다.
사용 방법:
int fd = open("file.txt", O_WRONLY);
write(fd, "Hello, world", 12);
fsync(fd); // 데이터를 즉시 디스크에 기록
close(fd);
특징:
- 특정 파일에 대해 호출:
fsync()
는 특정 파일의 파일 디스크립터를 대상으로 하므로, 파일에 대한 데이터만 디스크로 플러시합니다. - 파일 시스템 메타데이터 동기화는 제외: 파일의 데이터는 디스크에 기록되지만, 파일 크기나 타임스탬프와 같은 파일 시스템 메타데이터는 보장되지 않습니다. 메타데이터를 동기화하려면
fdatasync()
와 같은 다른 시스템 호출을 사용해야 합니다.
성능:
fsync()
는 디스크에 데이터를 쓰는 작업을 강제하므로, 성능에 영향을 미칠 수 있습니다. 하지만 데이터 안정성을 보장하기 위한 필수적인 동작입니다.
2. O_SYNC
O_SYNC
는 파일을 열 때 사용하는 파일 모드 플래그입니다. 이 플래그를 사용하여 파일을 열면, 모든 쓰기 작업이 즉시 디스크에 동기화되도록 보장합니다. 즉, 파일에 데이터를 쓰는 모든 호출(write()
)이 데이터가 디스크에 안전하게 기록될 때까지 반환되지 않습니다.
사용 이유:
- 파일을 열 때
O_SYNC
플래그를 사용하면, 파일에 대한 모든 쓰기 작업은 자동으로 동기화됩니다. write()
호출 후 별도로fsync()
를 호출할 필요가 없어, 데이터가 즉시 디스크에 쓰이는 것을 보장합니다.
사용 방법:
int fd = open("file.txt", O_WRONLY | O_SYNC); // O_SYNC 플래그로 파일 열기
write(fd, "Hello, world", 12); // 데이터가 디스크에 즉시 기록됨
close(fd);
특징:
- 동기화된 쓰기:
O_SYNC
모드로 파일을 열면, 모든 쓰기 작업이 즉시 디스크에 기록됩니다.write()
함수는 데이터가 디스크에 실제로 기록될 때까지 블로킹되며, 디스크에 안전하게 기록되었을 때만 반환됩니다. - 쓰기 성능 저하:
O_SYNC
모드는 모든 쓰기 작업마다 디스크에 기록되므로, 성능이 저하될 수 있습니다. 특히 빈번한 쓰기 작업을 수행하는 경우 성능 저하가 두드러질 수 있습니다.
fsync()
와 O_SYNC
비교
특징 | fsync() |
O_SYNC |
---|---|---|
동작 시점 | 파일을 열고 쓰기 작업 후 명시적으로 호출 | 파일을 열 때 설정하면 모든 쓰기 작업이 동기화 |
동기화 범위 | 특정 파일의 데이터만 플러시 | 모든 쓰기 작업을 디스크에 즉시 기록 |
성능 | 필요한 시점에만 호출하므로 성능 영향을 줄임 | 모든 쓰기가 즉시 기록되므로 성능 저하가 있을 수 있음 |
사용 방식 | 파일을 다 쓴 후 fsync() 호출 |
파일 열 때 O_SYNC 플래그 설정 |
결론
fsync()
는 파일을 쓰고 나서 명시적으로 호출하여 데이터가 디스크에 안전하게 기록되도록 하는 함수입니다. 필요한 시점에만 호출하면 되므로 성능 부담이 적을 수 있지만, 쓰기 작업 후마다 호출해야 합니다.O_SYNC
는 파일을 열 때 설정하면 모든 쓰기 작업이 자동으로 동기화되지만, 성능에 더 큰 영향을 미칠 수 있습니다.
둘 다 데이터의 무결성을 보장하기 위한 중요한 방법이지만, 어떤 것을 사용할지는 성능 요구 사항과 안정성에 대한 요구 사항에 따라 결정됩니다.
'Database Study' 카테고리의 다른 글
뮤텍스(Mutex)와 세마포어(Semaphore) (0) | 2024.08.16 |
---|---|
데이터베이스 트랜잭션에서 ACID (0) | 2024.08.14 |
CRUD 작업(커밋하는 순간 어떤일이 일어나나) (0) | 2024.08.14 |
FileReader와 BufferedReader (0) | 2024.08.12 |
UML(Unified Modeling Language) (0) | 2024.08.05 |