[크래프톤 정글 3기] 12/15(금) TIL

ClassBinu·2023년 12월 15일
0

크래프톤 정글 3기 TIL

목록 보기
62/120

09:50 입실
pintos gitbook 살펴보기
OS 교재 나머지 읽기
유튜브 OS 강의 해당 부분 보기


요구 페이징

만약 dirty bit가 0이면 해당 페이지를 스왑 아웃 하지 않고 그냥 메모리에서 지움.
그리고 나중에 필요하면 다시 파일에서 로드하면 됨.

요구 페이징에는 두 가지 알고리즘이 필요하다.
1. 페이지 교체 알고리즘: 스왑 인/아웃 시 어떤 프레임 교체할지
2. 프레임 할당 알고리즘: 각 프로세스에 얼만큼의 프레임 할당할지

  • 균등 할당
  • 비례 할당(프로세스 크기 비례): 근데 크기 알기가 어려움
  • 우선순위 할당

페이지 교체는 진짜 물리 메모리가 가득 찼을 때 일어나는 게 아니라 운영체제는 어느 정도 여유 공간을 확보함.
여유 공간의 최댓값과 최솟값을 설정하여 교체 알고리즘 작동에 활용한다.
여유 공간 크기가 최솟값보다 작아지면 여유 공간 확보 쓰레드가 백그라운드에서 실행된다.
이 쓰레드가 여유 공간이 최댓값이 될때까지 페이지를 제거한다.
이 백그라운드 쓰레드를 스왑 데몬, 또는 페이지 데몬이라고 한다.
메모리가 확보되면 이 쓰레드는 슬립 모드로 들어간다.

(참고. 데몬은 어떤 동작은 백그라운드에서 하는 걸 의미함.)


쓰기 시 복사(Copy on Write)

데이터를 복사할 필요가 있을 때, 실제 데이터 쓰기 작업을 수행할 때까지 복사를 지연
fork시 자식은 부모의 페이지 테이블을 전체 복사하지 않고,
자식은 우선 부모의 페이지 테이블을 참조하고 있다가,
페이지 테이블의 변경이 생기면 변경된 부분만 복사해서 자식만의 페이지 테이블로 가지고 있음.
(변경이 발생한 페이지 테이블 엔트리를 복사하는 개념)


스왑

운영체제는 스왑 공간에 있는 모든 페이지들의 디스크 주소를 기억해야 함.
스왑 공간에서만 스왑을 할 수 있는 건 아님.
디스크에 존재하는 프로그램은 굳이 스왑으로 넣지 않아도 됨.
즉, 코드가 저장되어 있는 파일 시스템 영역에서 스왑-인 가능

주소 변환

가상 주소는 VPN + Offset이다.
1. 먼저 가상 주소에서 VPN을 추출한다.
2. TLB 체크
3-1. (TLB 히트) 물리 주소 변환 후 메모리 접근 -> 종료
3-2. (TLB 미스) 페이지 테이블 베이스 레지스터로 페이지 테이블 메모리 주소 파악
4. 페이지 테이블 엔트리 추출
5. PTE에서 PFN 추출 후 TLB 탑재
6. 명령 재실행 -> TLB 히트

  • 근데 여기서 페이지 폴트가 발생할 수도 있음. 그때는 페이지 폴트 핸들러 작동
  • 근데 또 물리 메모리가 가득차면 페이지 교체가 일어나야 함.

이때 물리 메모리 적재 여부를 체크하는 비트가 present bit
(1이면 적재, 0이면 미적재)
0이면 메모리에 없고 디스크에 있다는 뜻이고,
이때에는 물리 메모리에 없는 페이지에 접근하는 거니까 페이지 폴트가 발생
페이지 폴트가 발생하면 제어권이 운영체제로 넘어가고 페이지 폴트 핸들러가 실행

페이지 폴트는 메모리 미적재 페이지 접근시에도 발생하지만,
불법적인 메모리 접근에서도 사용된다.(오류라고 하지 않고 그냥 페이지 폴트라고 함.)

TLB와 페이지 폴트에 이어지는 일련의 과정 정리해보기!

페이지 폴트

TLB가 있어도 페이지 폴트는 운영체제가 소프트웨어적으로 처리한다.

TLB 미스 시 발생할 수 있는 경우의 수

  1. 페이지가 존재하며 유효한 경우.(즉시 접근 가능)
  2. 페이지가 유효하지만 존재하지 않음.(스왑 인 필요)
  3. 페이지가 유효하지 않음.(잘못된 주소 참조) -> 트랩 핸들러 작동 -> 프로세스 종료 가능

물리 메모리 크기 극복 정책

빈 메모리 공간이 거의 없는 상황을 메모리 압박(memory pressure)라고 함.
이때 페이지 아웃을 통해 공간 확보를 함.

페이지 교체 관점에서 물리 메모리가 일종의 캐시 역할을 한다고 볼 수도 있음.
목적은 최대한 캐시 히트(페이지 히트)를 최대한으로 하는 것!


지역성의 종류

공간 지역성(spatial locality): 페이지 p가 접근되었다면 그 주변 페이지가 참조되는 경향이 있음
시간 지역성(temporal locality): 가까운 과거에 참조된 페이지는 가까운 미래에 다시 접근되는 경향이 있음

이 원칙이 절대적인 건 아님. 그런 경향이 있다 정도의 원칙


더티 비트가 교체에 미치는 영향

수정 이력이 있는 페이지는 디스크에 쓰기를 해야 한다.
수정 이력이 없으면 스왑 아웃이 아니라 그냥 메모리에서 지워도된다.
같은 조건이라면 수정 이력이 없는 페이지를 교체하는 게 리소스가 절약된다.


80386 CPU 구조

(오래된 CPU, 참고만 하기)

https://youtu.be/VwR4pb7lwew?si=LJ6JiqXWsOglByBf

응? 저기요..?


Pintos VM

초기 테스트 실행

FAIL tests/userprog/args-none
FAIL tests/userprog/args-single
FAIL tests/userprog/args-multiple
FAIL tests/userprog/args-many
FAIL tests/userprog/args-dbl-space
FAIL tests/userprog/halt
FAIL tests/userprog/exit
FAIL tests/userprog/create-normal
FAIL tests/userprog/create-empty
FAIL tests/userprog/create-null
FAIL tests/userprog/create-bad-ptr
FAIL tests/userprog/create-long
FAIL tests/userprog/create-exists
FAIL tests/userprog/create-bound
FAIL tests/userprog/open-normal
FAIL tests/userprog/open-missing
FAIL tests/userprog/open-boundary
FAIL tests/userprog/open-empty
FAIL tests/userprog/open-null
FAIL tests/userprog/open-bad-ptr
FAIL tests/userprog/open-twice
FAIL tests/userprog/close-normal
FAIL tests/userprog/close-twice
FAIL tests/userprog/close-bad-fd
FAIL tests/userprog/read-normal
FAIL tests/userprog/read-bad-ptr
FAIL tests/userprog/read-boundary
FAIL tests/userprog/read-zero
FAIL tests/userprog/read-stdout
FAIL tests/userprog/read-bad-fd
FAIL tests/userprog/write-normal
FAIL tests/userprog/write-bad-ptr
FAIL tests/userprog/write-boundary
FAIL tests/userprog/write-zero
FAIL tests/userprog/write-stdin
FAIL tests/userprog/write-bad-fd
FAIL tests/userprog/fork-once
FAIL tests/userprog/fork-multiple
FAIL tests/userprog/fork-recursive
FAIL tests/userprog/fork-read
FAIL tests/userprog/fork-close
FAIL tests/userprog/fork-boundary
FAIL tests/userprog/exec-once
FAIL tests/userprog/exec-arg
FAIL tests/userprog/exec-boundary
FAIL tests/userprog/exec-missing
FAIL tests/userprog/exec-bad-ptr
FAIL tests/userprog/exec-read
FAIL tests/userprog/wait-simple
FAIL tests/userprog/wait-twice
FAIL tests/userprog/wait-killed
FAIL tests/userprog/wait-bad-pid
FAIL tests/userprog/multi-recurse
FAIL tests/userprog/multi-child-fd
FAIL tests/userprog/rox-simple
FAIL tests/userprog/rox-child
FAIL tests/userprog/rox-multichild
FAIL tests/userprog/bad-read
FAIL tests/userprog/bad-write
FAIL tests/userprog/bad-read2
FAIL tests/userprog/bad-write2
FAIL tests/userprog/bad-jump
FAIL tests/userprog/bad-jump2
FAIL tests/vm/pt-grow-stack
FAIL tests/vm/pt-grow-bad
FAIL tests/vm/pt-big-stk-obj
FAIL tests/vm/pt-bad-addr
FAIL tests/vm/pt-bad-read
FAIL tests/vm/pt-write-code
FAIL tests/vm/pt-write-code2
FAIL tests/vm/pt-grow-stk-sc
FAIL tests/vm/page-linear
FAIL tests/vm/page-parallel
FAIL tests/vm/page-merge-seq
FAIL tests/vm/page-merge-par
FAIL tests/vm/page-merge-stk
FAIL tests/vm/page-merge-mm
FAIL tests/vm/page-shuffle
FAIL tests/vm/mmap-read
FAIL tests/vm/mmap-close
FAIL tests/vm/mmap-unmap
FAIL tests/vm/mmap-overlap
FAIL tests/vm/mmap-twice
FAIL tests/vm/mmap-write
FAIL tests/vm/mmap-ro
FAIL tests/vm/mmap-exit
FAIL tests/vm/mmap-shuffle
FAIL tests/vm/mmap-bad-fd
FAIL tests/vm/mmap-clean
FAIL tests/vm/mmap-inherit
FAIL tests/vm/mmap-misalign
FAIL tests/vm/mmap-null
FAIL tests/vm/mmap-over-code
FAIL tests/vm/mmap-over-data
FAIL tests/vm/mmap-over-stk
FAIL tests/vm/mmap-remove
FAIL tests/vm/mmap-zero
FAIL tests/vm/mmap-bad-fd2
FAIL tests/vm/mmap-bad-fd3
FAIL tests/vm/mmap-zero-len
FAIL tests/vm/mmap-off
FAIL tests/vm/mmap-bad-off
FAIL tests/vm/mmap-kernel
FAIL tests/vm/lazy-file
FAIL tests/vm/lazy-anon
FAIL tests/vm/swap-file
FAIL tests/vm/swap-anon
FAIL tests/vm/swap-iter
FAIL tests/vm/swap-fork
FAIL tests/filesys/base/lg-create
FAIL tests/filesys/base/lg-full
FAIL tests/filesys/base/lg-random
FAIL tests/filesys/base/lg-seq-block
FAIL tests/filesys/base/lg-seq-random
FAIL tests/filesys/base/sm-create
FAIL tests/filesys/base/sm-full
FAIL tests/filesys/base/sm-random
FAIL tests/filesys/base/sm-seq-block
FAIL tests/filesys/base/sm-seq-random
FAIL tests/filesys/base/syn-read
FAIL tests/filesys/base/syn-remove
FAIL tests/filesys/base/syn-write
pass tests/threads/alarm-single
pass tests/threads/alarm-multiple
pass tests/threads/alarm-simultaneous
pass tests/threads/alarm-priority
pass tests/threads/alarm-zero
pass tests/threads/alarm-negative
pass tests/threads/priority-change
pass tests/threads/priority-donate-one
pass tests/threads/priority-donate-multiple
pass tests/threads/priority-donate-multiple2
pass tests/threads/priority-donate-nest
pass tests/threads/priority-donate-sema
pass tests/threads/priority-donate-lower
pass tests/threads/priority-fifo
pass tests/threads/priority-preempt
pass tests/threads/priority-sema
pass tests/threads/priority-condvar
pass tests/threads/priority-donate-chain
FAIL tests/vm/cow/cow-simple
123 of 141 tests failed.

gitbook 살펴보기

0개의 댓글