• Mindscape 🔥
    • Playlist 🎧
  • Algorithm

    • 1018번: 체스판 다시 칠하기
    • 1966번: 프린터 큐
    • Python 시간 초과 방지를 위한 팁
    • C++ std::vector 사용법 정리
    • Vim 사용 매뉴얼
  • Ubuntu

    • 리눅스 우분투 GRUB 폰트 변경
    • 우분투 이미지 비디오 썸네일(미리보기) 안 보임 문제 해결
    • Wine 환경에서 카카오톡 실행 시 explorer.exe 뜨지 않게 하는 법
    • 우분투 Wine 카카오톡 사진 이미지 스크린샷 붙여넣기
    • Wine 카카오톡 이모지 깨짐 문제 해결
    • Ubuntu 윈도우 애니메이션 끄기
  • Wellness

    • 차전자피 (Psyllium Husk)
    • 엑스트라 버진 올리브유 (Extra Virgin Olive Oil)
    • 자가비강세척 (Nasal Irrigation)
    • QCY HT08 (MeloBuds Pro Plus)
    • 콘서타 (Concerta)
    • 인데놀 (Inderal)
    • 설트랄린 (Sertraline)
    • 멜라토닌 (Melatonin)
    • 치경부 마모증
    • 바벨 스쿼트 (Barbell Squat)
  • Humanities

    • Nordvik, Russia
    • North Sentinel Island
    • 롱고롱고(Rongorongo)
    • 바로크 음악 (Baroque Music)
  • Design

    • 구글의 아이콘 대개편 — 6년 만의 실수 인정
    • 제럴드 젠타 — 럭셔리 스포츠 워치의 창시자
    • 바우하우스 — 현대 디자인의 원점
  • Brands

    • NOMOS Glashütte
    • Frédérique Constant
    • KZ (Knowledge Zenith)
    • 에스트라 (AESTURA)
    • JINHAO (金豪)
    • Herman Miller
    • 데스커 (DESKER)
    • 무신사 스탠다드 (Musinsa Standard)
  • Finance

    • 현대카드 ZERO — Edition2 vs Edition3 비교
    • 신한카드 처음
    • S&P 500 ETF 투자 가이드
    • 파킹통장 vs CMA 통장
    • 버크셔 해서웨이 (Berkshire Hathaway)
    • 비트코인(Bitcoin)
  • Products

    • 오디오 인터페이스 (Audio Interface)
    • 쿠루토가 (KURUTOGA)
    • CX31993 DAC 동글
    • 클렌징 밀크 (Cleansing Milk)
    • 피젯 토이 (Fidget Toy)
    • ThinkPad
  • Programming Languages

    • 8.0. Statement Level Control Structures
    • 8. Subprogram
    • 9. Implementing Subprogram
    • 10.1. Abstract Data Types and Encapsulation Constructs
    • 10.2. Support for Object Oriented Programming
    • 11. Concurrency
    • 12. FPL (1)
    • 13. FPL (2)
    • 14. Exception Handling and Event Handling
    • Final Exam

프로젝트 03

작성 2026. 6. 12.·수정 2026. 6. 12.

가상 메모리 & 파일 시스템

제출 기한: 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개 단일 간접
    • 현대 애플리케이션에 불충분함
  • 해결책: 이중 간접 블록
    • 최대 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 게시판을 이용하거나 이메일로 보내주세요.
최근 수정: 26. 6. 12. 오후 3:28
Contributors: kmbzn, Claude Sonnet 4.6

BUILT WITH

CloudflareNode.jsGitHubGitVue.jsJavaScriptVSCodenpm

All trademarks and logos are property of their respective owners.
© 2026 kmbzn · MIT License