Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 4기
- Flutter
- 모션비트
- 나만무
- 코드트리
- 핀토스
- HTML
- 백준
- defee
- CSS
- 스택
- Java
- pintos
- 오블완
- 사이드프로젝트
- 리액트
- 알고리즘
- 자바스크립트
- 시스템콜
- 자바
- 큐
- 소켓
- corou
- Vue.js
- JavaScript
- userprog
- 크래프톤정글
- 티스토리챌린지
- TiL
- 크래프톤 정글
Archives
- Today
- Total
미새문지
크래프톤 정글 week09, day70 - fsync(), Crash Consistent, 시스템 콜 구현 에러 해결 본문
크래프톤 정글/TIL
크래프톤 정글 week09, day70 - fsync(), Crash Consistent, 시스템 콜 구현 에러 해결
문미새 2024. 3. 17. 22:32728x90
fsync()
- 프로그램이 파일 시스템에 데이터를 안전하게 저장하도록 보장하는 데 사용되는 시스템 호출 중 하나이다.
- 이 함수는 특정 파일의 변경 사항이 디스크에 완전히 쓰여지도록 하여, 시스템 충돌이나 전원 문제 등 예기치 않은 상황에서도 데이터의 손실을 방지하는데 중요한 역할을 한다.
fsync()의 작동 원리
- 호출과 실행
- 프로그램이 fsync() 함수를 호출하면, 해당 함수는 인자로 받은 파일 디스크립터가 가리키는 파일에 대한 모든 미완성 I/O 작업(입력/출력 작업)을 완료시킨다.
- 데이터 및 메타 데이터의 동기화
- fsync()는 파일의 데이터 뿐만 아니라 메타 데이터(예 : 파일의 수정시간)까지 디스크에 쓰도록 보장한다. 이는 파일 시스템의 일관성을 유지하는 데 중요하다.
- 성공 및 실패
- 작업이 성공적으로 완료되면, fsync()는 0을 반환하여 성공을 알린다. 만약 오류가 발생하면, -1을 반환하고 errno 변수에 오류 코드를 설정해 프로그램이 오류의 원인을 알아낼 수 있게 한다.
fsync()의 사용 사례
- 데이터베이스 시스템
- 데이터베이스는 데이터의 정확성과 일관성을 유지하기 위해 fsync()를 사용해 트랜잭션 로그와 같은 중요한 정보를 디스크에 안전하게 저장한다.
- 파일 시스템의 데이터 무결성 금지
- 파일을 수정한 후, 프로그램이 fsync()를 호출하여 변경 사항이 디스크에 반영되도록 함으로써, 파일 시스템의 데이터 무결성을 유지할 수 있다.
- 안전한 파일 업데이트
- 파일을 업데이트할 때, 먼저 임시 파일에 변경 사항을 쓴 후 fsync()를 사용해 디스크에 변경 사항을 반영하고, 마지막으로 원본 파일을 임시 파일로 대체함으로써, 데이터의 안전한 업데이트를 보장할 수 있다.
주의 사항
- 성능 저하
- fsync()는 디스크에 데이터를 쓰기 위해 I/O 작업을 수행해야 하기 때문에, 호출 시점에 따라 시스템의 성능 저하를 일으킬 수 있다. 따라서, 성능과 데이터 안정성 사이에서 적절한 균형을 찾는 것이 중요하다.
- 대안 기술
- 일부 상황에서는 fsync()의 비용이 너무 높을 수가 있어, fdatasync()같은 메타데이터의 동기화를 제외하고 데이터만 디스크에 쓰는 방식이기 때문에 상황에 따라 성능을 향상 시킬 수 있다.
Crash Consistent(충돌의 일관성)
- 시스템이 예기치 않게 충돌하거나 다운됐을 때, 시스템이나 데이터가 일관된 상태로 유지되는 것을 의미한다.
- 여기서 일관된 상태란, 시스템이 정상적으로 복구 될 수 있고, 데이터가 손상되지 않으며, 모든 데이터가 마지막으로 알려진 유효한 상태에 있음을 뜻한다.
Crash Consistent의 중요성
- 데이터 무결성
- 시스템이 갑자기 중단되더라도 데이터 무결성을 유지할 수 있어야 한다.
- Crash Consistent 상태를 유지하면, 데이터가 일관되게 유지되어 데이터 손상의 위험을 줄일 수 있다.
- 빠른 복구
- 시스템이 충돌 후에도 데이터가 일관된 상태로 유지되면, 시스템 복귀 시간을 단축 시킬 수 있다.
Crash Consistency를 확보하기 위한 기술
- 트랜잭션 로깅
- DBMS 같은 일부 시스템은 트랜잭션 로깅을 사용해 데이터의 일관성을 보장한다.
- 각 트랜잭션은 로그에 기록되며, 시스템이 충돌한 경우 이 로그를 사용하여 데이터를 마지막 일관된 상태로 복구할 수 있다.
- 저널링 파일 시스템
- 파일 시스템 레벨에서는 저널링이라는 기술을 사용하는데, 이는 파일 시스템의 변경 사항을 저널(로그)에 먼저 기록하고, 실제 파일 시스템에 적용하기 전에 이러한 변경 사항을 추적하는 방식이다.
- 시스템 충돌 시, 저널을 사용해 파일 시스템을 안정적인 상태로 복구할 수 있다.
- 파일 시스템 레벨에서는 저널링이라는 기술을 사용하는데, 이는 파일 시스템의 변경 사항을 저널(로그)에 먼저 기록하고, 실제 파일 시스템에 적용하기 전에 이러한 변경 사항을 추적하는 방식이다.
- 스냅 샷
- 일부 스토리지 시스템은 시스템의 일관된 상태를 정기적으로 캡처하는 스냅샷 기능을 제공한다.
- 이 스냅샷은 시스템이 충돌한 후 데이터를 복구하는데 사용될 수 있다.
- 동기화 기술
- 데이터를 디스크에 쓸 때 fsync()와 같은 동기화 호출을 사용해 데이터와 메타 데이터가 디스크에 안전하게 저장되도록 하는 것도 중요하며, 이는 데이터의 일관성을 유지하는 데 도움이 될 수 있다.
Crash Consistency 상태는 시스템이나 데이터의 복구를 위한 기본적인 보호 수단을 제공하지만, 특정 애플리케이션의 요구 사항을 완벽히 충족시키기 위해서는 application-consistent 백업과 같은 보다 세밀한 접근 방법이 필요할 수 있다.
드디어 시스템 콜 에러를 해결했다. 다른 코드에서도 바뀐 부분이 있을 수도 있지만 일단 확실한 부분은 각 테스트 항목을 테스트할 때 입력되는 printf 메세지를 통해 테스트의 성공 실패를 좌우하는 데, 그 부분이 빠져있었다. 분명 기본 코드에 작성이 되있는데, 코드를 건들다가 실수로 지워진 것 같다.
이거 때문에 또 이틀 이상을 날린 것 같긴 하지만, 잃었던 의욕을 다시 일으켜줘서 강민님한테 감사하다. 다시 마음을 잡고 몇몇 공부 키워드만 학습하고 다시 시스템콜 남은 부분 통과를 목표로 잡았다.
< 강민 블로그 홍보 >
https://erin-loft.tistory.com/
학습 시간 : 12 ~ 23시
728x90
'크래프톤 정글 > TIL' 카테고리의 다른 글
크래프톤 정글 week09, day72 - 32bit OS vs 64bit OS, Segmentation Fault, Interrupt, 시스템 콜 도돌이표 (3) | 2024.03.20 |
---|---|
크래프톤 정글 week09, day71 - Journaling(저널링), Protection(보호) & Isolation(격리), 시스템 콜 순항 중 (3) | 2024.03.19 |
크래프톤 정글 week09, day69 - VFS Layer, Generic Block Layer, 시스템 콜 무한 에러 중 (1) | 2024.03.17 |
크래프톤 정글 week09, day68 - 시스템 콜 구현 막혀있는 중 (2) | 2024.03.16 |
크래프톤 정글 week09, day67 - 시스템 콜 함수 간단정리 (1) | 2024.03.15 |