728x90
fsync와 sync
컴퓨터의 디스크 I/O 연산은 커널 안의 버퍼 캐시나 페이지 캐시를 거칩니다.
따라서 프로세스가 파일에 데이터를 기록하면, 커널은 그 데이터를 커널의 버퍼들 중 하나에 복사해서 내부적인 대기열에 등록해 두고, 적당한 시점이 되면 디스크에 기록합니다.
이 과정에서 데이터가 버퍼에만 있고 디스크에는 아직 기록되지 않은 상태가 될 수 있다. 그러한 경우, 다음과 같은 상황에 문제가 일어날 수 있습니다.
- 디스크에 순서대로 기록해야되는 경우.
- 시스템이 비정상 종료될 경우.
→ 우리는 이러한 디스크 상의 파일 시스템과 버퍼 캐시의 내용의 불일치를 해결하기 위해 sync, fsync, fdatasync 함수를 사용합니다.
두 함수는 모두 파일 시스템의 데이터를 디스크에 안전하게 기록하기 위한 시스템 호출입니다. 운영체제의 파일 시스템 계층과 스토리지 계층 간의 일관성 보장에 중요한 역할을 합니다.
그러나 이 둘은 범위와 동작 방식에서 차이가 있습니다.
sync()
- 정의: 시스템에 열린 모든 파일의 데이터를 커널 버퍼에서 디스크로 밀어넣는 시스템 호출입니다.
- 범위: 시스템 전체 — 모든 프로세스의 모든 파일에 영향을 줍니다.
- 역할: 커널이 보유하고 있는 페이지 캐시(page cache)와 메타데이터 캐시를 디스크로 flush합니다.
- 비용: 상대적으로 무겁습니다. 모든 열린 파일을 대상으로 하기 때문에 성능에 영향이 있을 수 있습니다.
- 비유: 건물 전체의 저장고를 한 번에 청소하고 다른곳으로 옮기는 느낌입니다.
#include <unistd.h>
sync();
fsync(int fd)
- 정의: 특정 파일 디스크립터
fd
에 대해, 해당 파일의 데이터를 디스크에 강제로 기록합니다. - 범위: 지정된 하나의 파일
- 역할: 그 파일에 대해 메모리에 있는 변경 내용을 물리 디스크에 동기화합니다.
또한 시스템이 예기치 않게 중단되더라도 데이터의 무결성을 보장합니다. - CS 관점: 이 호출은 파일 시스템 캐시 → 디스크 드라이브 캐시까지의 경로를 따라 강제 동기화를 합니다. 단, 일부 시스템에서는 디스크 드라이브의 캐시(flush 명령)를 생략할 수도 있음.
- 성능: 사용시 디스크 I/O 작업이 증가하여 시스템의 전반적인 성능 저하가 발생할 수 있습니다. 이로 인해 시스템의 반응 속도를 늦출 수 있습니다.
- 비유: 노트 하나만 따로 저장하는 느낌.
#include <unistd.h>
#include <fcntl.h>
int fd = open("example.txt", O_WRONLY);
write(fd, "data", 4);
fsync(fd); // example.txt 파일에 대해서만 동기화
close(fd);
한 눈에 보기
항목 | sync() | fsync(fd) |
---|---|---|
대상 | 전체 시스템 | 특정 파일 |
사용 예시 | 시스템 종료 전, 백업 | 중요한 로그, DB 파일 저장 시 |
비용 | 큼 | 상대적으로 적음 |
일관성 보장 | 시스템 전반 | 파일 단위 |
→ fsync와 sync는 컴퓨터 시스템의 데이터 일관성과 안전성을 확보하기 위해 반드시 필요한 함수 입니다.
특히나 DB, 저널링 파일 시스템, 트랜잭션 처리 등에 있어서 핵심적인 역할을 합니다.
추가로, 리눅스에서 fdatasync()
라는 함수도 있는데, 이는 fsync()
와 비슷하지만 메타데이터는 제외하고 데이터만 동기화합니다. 더 빠른 성능이 필요한 경우 사용됩니다.
728x90
'크래프톤 정글(PintOS WEEK 9 ~ 14)' 카테고리의 다른 글
11주차 퀴즈 복습 (0) | 2025.05.29 |
---|---|
WEEK 11 PintOS TIL(5월28일 수요일) (4) | 2025.05.29 |
WEEK 11 PintOS TIL(5월27일 화요일) (1) | 2025.05.28 |
WEEK 11 PintOS TIL(5월26일 월요일) (0) | 2025.05.28 |
WEEK 11 PintOS TIL(5월25일 일요일) (1) | 2025.05.26 |