프로젝트 03
가상 메모리 & 파일 시스템
제출 기한: 2025. 06. 10. (화) 24:00 운영체제
개요
- 쓰기 시 복사 (Copy-on-Write) Fork
- 지연 할당을 통한 메모리 관리 최적화
- 대용량 파일
- 이중 간접 블록을 이용한 파일 시스템 확장
- 심볼릭 링크
- 고급 파일 참조 및 경로 해석
쓰기 시 복사 (Copy-on-Write) Fork
개요
- 문제점:
fork()에서의 비효율적인 메모리 복사- 현재
fork()는 부모의 모든 메모리를 즉시 복사함- 비효율적이고 시간이 많이 소요됨
- 메모리 부족으로 실패할 수 있음
- 현재
- 해결책: 쓰기 시 복사 (Copy-on-Write, COW)
- 초기에는 부모와 자식 간에 페이지를 공유
- 페이지가 수정될 때만 복사
COW Fork 구조
- 초기 상태
- 자식의 페이지 테이블이 부모의 물리 페이지를 가리킴
- 쓰기 접근을 트랩하기 위해 부모의 PTE를 읽기 전용으로 표시
- RSW (소프트웨어 예약) 비트를 사용하여 COW 비트를 설정
- 쓰기 접근
- 쓰기 시도 시 페이지 폴트 발생
- 커널이 새로운 물리 페이지를 할당
- 원본 페이지를 새 페이지로 복사
- PTE를 쓰기 권한으로 업데이트
- 참조 카운팅
- 각 페이지를 공유하는 프로세스의 수를 추적
- 참조 카운트가 0이 될 때만 페이지를 해제
구현 과제
- 수정할 핵심 함수
uvmcopy(): 복사 대신 페이지 공유usertrap(): COW 페이지 폴트 처리kfreevm(): 커널 작업에 COW 로직 적용fork()/wait()/exit(): 참조 카운팅 구현
- 주요 과제
- COW 폴트와 다른 페이지 폴트 구분
- 페이지 참조 카운터의 적절한 관리
- 메모리 부족 상황 처리
- 기존 코드와의 호환성 유지
Cow 테스트 결과
simplest(): 기본적인 COW 메모리 할당 및 동작 검증threetest(): 다중 프로세스 COW 스트레스 테스트filetest(): COW와 시스템 콜 연동 (copyout()호환성)
...
simple: ok
threetest: ok
filetest: ok
...
ALL COW TESTS PASSED
대용량 파일
개요
- 문제점: xv6의 제한된 파일 크기
- 현재 한계: 268 블록 (268 KB)
- 12개 직접 + 1개 단일 간접
- 현대 애플리케이션에 불충분함
- 현재 한계: 268 블록 (268 KB)
- 해결책: 이중 간접 블록
- 최대 12 + 256 + 256*256 블록 (~66 MB) 지원
- 구조: 11개 직접 + 1개 단일 간접 + 1개 이중 간접
- 하위 호환성 유지
현재 블록 주소 지정 계층 구조
블록 주소 지정 계층 구조
구현 과제
- 상수 및 구조체
- FSSIZE를 2000에서 262656으로 변경
- NINODE와 NFILE 수정
- 디스크 상의 구조체 업데이트
- inode의
addrs배열 및 inode 구조 수정
- 핵심 함수
bmap(): 이중 간접 주소 변환 구현itrunc(): 모든 직접 및 간접 블록 해제create(): 새로운 파일/구조 생성을 지원
대용량 파일 테스트 결과
- 대용량 파일 생성 및 순차적 쓰기
- 파일 크기 검증
- 데이터 무결성 검증
심볼릭 링크
개요
- 문제점: xv6의 경직된 파일 참조
- 하드 링크만 사용 가능 (inode 기반)
- 디렉토리를 링크하거나 파일 시스템을 넘나들 수 없음
- 끊어지거나 유연한 링크를 지원하지 않음
- 해결책: 심볼릭 링크
- 대상 경로를 파일 데이터로 저장
- 존재하지 않는 파일을 가리킬 수 있음
- 더 유연한 링크 및 참조 가능
- 시스템 유연성 향상
심볼릭 링크 구조
- 파일 타입 확장
T_SYMLINK파일 타입 추가
- 대상 경로는 inode의 데이터 블록에 저장됨
- 새로운 시스템 콜:
symlink(target, path) - 시스템 콜 인터페이스
sys_symlink(): (1단계) 심볼릭 링크 파일 생성
- 수정된
open(): (2단계) 심볼릭 링크를 직접 따라감- 상대/절대 경로, 링크 순환 처리
- 경로 해석
- 중첩된 링크에 대한 재귀적 해석
- 무한 루프 방지를 위한 순환 감지
- 끊어진 링크에 대한 적절한 오류 처리
구현 과제
- 새로운 구성 요소
kernel/fs.h에T_SYMLINK파일 타입 추가sys_symlink()시스템 콜 구현symlink(2)사용자 수준 시스템 콜 래퍼
- 수정된 함수
open(): 경로 해석 로직 구현create(): 심볼릭 링크 생성 지원
심볼릭 링크 테스트 결과
testsymlink()- 핵심 기능 테스트- 심볼릭 링크 생성 및 접근
- 상대 경로 처리
- 순환 참조 감지
- 끊어진 심볼릭 링크 테스트
- 연쇄 링크 해석
concur()- 동시성 테스트
...
Start: test symlinks
test symlinks: OK
Start: test concurrent symlinks
test concurrent symlinks: OK
...
평가
- 완성도 xv6 운영체제는 명세서 요구사항에 따라 정확하게 동작해야 합니다.
- 위키 & 커밋 기록 채점은 위키 문서를 기반으로 하므로, 위키는 가능한 한 상세하게 작성해야 합니다.
- 제출 기한 제출 기한을 반드시 엄수해야 합니다. 마감 기한 이후에는 0점 처리되며, 점수가 수정됩니다.
- 어떤 복사본도 표절하지 마십시오!!!
위키
- 설계 프로젝트 요구사항을 충족하기 위한 구현 접근 방식을 간략하게 설명하세요.
- 구현 원본 xv6에서의 변경 사항에 초점을 맞춰 주요 코드 수정 사항과 그 목적을 설명하세요.
- 결과 다음을 포함하여 성공적인 구현의 증거를 보여주세요
- 완료 과정, 작동하는 코드의 스크린샷, 프로그램 흐름 설명
- 문제 해결 발생한 문제, 적용된 해결책 및 미해결 문제를 설명하세요.
- 관련이 있는 경우 추가 내용을 포함할 수 있습니다.
제출
- 구현한 코드와 위키를 GitHub를 통해 제출하세요.
- 제출 브랜치를 만들고 리포지토리를 제출하세요.
- 리포지토리의 이름은 'os_project03_[학번]'입니다.
- 위키 파일의 이름은 'os_project03_[분반]_[학번].pdf'이어야 합니다.
- 제출 마감일: 2025년 6월 19일 23:59
- 지각 제출(2025년 6월 19일 23:59 마감 이후 제출) 시에는 취득 가능 점수의 50%만 받게 됩니다.
Q&A
- 프로젝트 관련 질문은 LMS의 'Project 03 질문 게시판'을 이용해 주세요.
- 이메일로 보낸 질문에는 답변하지 않습니다.
- 프로젝트와 관련 없는 질문은 Q&A 게시판을 이용하거나 이메일로 보내주세요.

