PintOS_3 | Virtual Memory | Memory Management

wony·2022년 6월 26일

메모리 관리

‏‏‎ ‎#1

메모리 : 주소를 통해 접근하는 매체

메모리는 주소가 매겨짐

  1. 논리적인 주소
    1. 프로그램이 실행될때 독립적으로 가지게 되는 주소 공간(가상주소공간)
    2. 각 프로세스마다 0부터 시작
    3. cpu가 보는 주소는 논리주소
  2. 물리적인 주소
    1. 실제 메모리에 올라가는 위치
    2. 아래부분에 커널이 위에 여러가지가 섞여서 올라감
    3. 실행되려면 여기 올라가야하고 주소변환을 해야함(바인딩:물리주소 어디로 올라갈지 결정하는 것)

바인딩 : 주소를 결정

언제하는가? 3가지가 있음

symbolic -> logical -> physical

프로그래머 입장에서 주소에 대한 개념은 숫자가 아니라 변수같은 심볼

컴파일하면서 숫자주소가 될거고

실행이 되려면 물리주소로 변환이 돼야함

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/1c05c99f-5cbd-416d-9b0c-adb631087019.png

언제 되는가

  1. 컴파일 타임 바인딩
  2. 로드 타임 바인딩
  3. 런 타임 바인딩 - mmu필요

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/392bfd44-1de7-4c51-8b9a-f457a890ff18.png

cpu가 아는 건 logical

주소변환을 해줘야함

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/4698cccc-d2a8-45d9-a229-30ae554f2f06.png

주소변환을 해주는 하드웨어, mmu

‏‏‎ ‎

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_markup_images/583c0b45429c430bb41f3d16bd656fa3/8594af89-1087-478d-a931-edd58ce145f5.png

가장 단순한 방법이 레지스터 두개로

논리주소를 요청하면 물리주소로 변환해서 해당되는 위치로 감

지금은 0부터 3000이 14000부터 17000인거

혹시 이때 4000을 요청하면?

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/12eea378-a180-4047-913c-085456c20261.png

트랩이 발생(sw interrupt)

cpu제어권이 os에 넘어가게됨

잘못된 주소를 참조하려했음 그에 따른 로직이 실행될거

‏‏‎ ‎

Dynamic Loading

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/9e1632fd-bb39-4da4-a3f6-2d16037335f1.png

프로그램을 메모리에 동적으로 올림

  • 그때그때 필요할때마다 메모리에 load
  • 일반적인 페이징은 os가 해주는거고
  • 지금 말하는건 사용자가 구현
  • 라이브러리 형태로 운영체제가 지원해줌
  • 올려놓고 쫓아내고..?

Overlays

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/8da40578-f14b-4a87-ab7b-20ee3e86aa19.png

프로그래머가 직접

‏‏‎ ‎

Swapping

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/f9c70864-7c94-4e37-97f8-26ce5cecd80e.png

프로세스를 메모리에서 통째로 쫓아내는거 하드디스크로

이렇게 쫓아내는 곳을 backing store 혹은 swap area라고 부름

쫓겨나는게 swapout 다시들어오는게 swapin

swapper(중기스케줄러)가 판단해서 쫓아냄

  • cpu 수행가능성이 낮은걸 swap out 시킴
  • 바인딩과 연결해서 생각해보면
  • 컴파일 , 로드 방식이면 쫓겨났다 올라오려면 원래자리로 와야함
  • 스와핑의 효과를 발휘하기 위해선 런타임 바인딩이 지원되어야함
  • 쫓겨났다 올라올때 어디든 갈수 있도록

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/01386038-0510-4e8c-92a0-fc94c73b864b.png

파일 입출력과 다르게 옮길 양이 많음

swap time은 양에 비례함

seek타임은 헤더를? 옮길때 드는 시간 이게 대부분임

근데 swap에서는 transfer time도 중요하긴함?

원래 스와핑은 통째로 쫓겨나는건데

부분부분 일부페이지만 쫓겨났다 들어왔다 하는 것도 스왑아웃이라고 함

‏‏‎ ‎

dynamic linking

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/da052fe2-25a8-4335-87e9-1979c51edd46.png

‏‏‎ ‎

컴파일하고 링킹해서 실행파일을 만드는데

따로 코딩해서 링킹하기도하고

원래 있는거 라이브러리를 링킹하기도 함

라이브러리를 찾을 수 있는 포인터만 코드에 있고

라이브러리 자체는 포함이 안됨

보통 파일 형태로 존재

‏‏‎ ‎

이제 물리적인 메모리를 어떻게 관리할 것인가

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/c825225d-36c7-4b32-9a35-dfdd5856f7f6.png

‏‏‎ ‎

메모리는 일반적으로 두 영역으로 나뉨

  • 낮은 주소에 os영역이 있고
  • 높은 주소에 사용자 프로세스 영역이 있음

사용자 영역 관리방법

  • 연속할당 - 통째로 올리는거, 주소변환도 비교적 간단
  • 불연속 할당 - 주소공간을 잘게 쪼개서 일부는 여기 일부는 저기 가 가능해짐
  • 현대 시스템은 불연속이고 그중에도 페이징기법(주소공간을 같은크기의 페이지로 잘라서 할당)을 사용

연속할당

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/8359e175-c8f4-4c89-9ada-07a0f967aaeb.png

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/53222106-58c0-440a-9d5a-79dc21f11d61.png

  • 고정분할 : 사용자 프로그램이 들어갈 메모리를 미리 나누어 놓음
    • A를 통째로 메모리에 올림
    • B가 커서 2에는 안들어감 -> 외부조각
    • 3에 넣음 근데 남는공간이 있음 -> 내부조각
    • 더 자세한 내용이 있지만 가볍게 개념은 그럼.
  • 가변분할 : 프로그램이 실행될때마다 차곡차곡 올림
    • B가 끝나고 D가 들어오려니까 B나온 자리는 작아서 못들어감 -> 외부조각
    • 밑에 넣고 남는 공간도 작음 -> 외부조각

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/eeed9c5f-e303-4f0a-80f9-9602b3771011.png

가변분할을 쓰게 되면 Hole이 생김

이게 산발적으롱 생김

그럼 운영체제는 어디는 쓰고 안쓰고를 관리해야겠죠 // 할당기?

프로그램이 실행될때 어디다 새로운 프로그램을 넣을 것인가 - 동적 할당

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/8f7507ba-3a73-48cd-ad06-e7108ff1b032.png

어느 홀에 사이즈n인 프로그램을 넣을 것인가

: hole이 n보다 커야함

세가지 알고리즘이 있음

  • first-fit : 먼저 찾은 홀
  • best-fit : 다 뒤져서 n이상 중에 가장 작은 홀
  • worst-fit : 가장 큰 홀에 할당

-> first, best가 속도와 공간 이용률 측면에서 낫더라

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/85ccdf49-7844-4982-a72a-0d2a2806ef98.png

‏‏‎ ‎

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/65c1c12e-e549-4bfb-b67e-ecfa20668fd5.png

외부조각들을 한데 모아서 큰 홀을 만듦

비용이 많이 드는 작업

런타임 바인딩이 지원돼야 가능

효율은 작은 애들을 옮기는게 낫겠죠

어떤 걸 이동시킬 것인가를 결정하는 문제도 있음

실제 사용되는건 불연속 할당임

  • 페이징기법 : 하나의 프로그램을 구성하는 주소공간을 같은 크기로 자름
    • 물리적인 메모리도 같은 크기로 잘라놓음(페이지프레임)
    • 메모리 효율은 좋아지는데 주소변환이 복잡해짐
  • 세그멘테이션기법
    • 같은 크기 아니고 의미있는 단위로 자르는거
    • 코드, 데이터, 스택 세그먼트로 자름
    • 필요시 물리메모리 다른 위치에 올려놓을 수 잇도록 함
    • 더 잘게 자를 수도 있음
    • 각각의 함수를 다른 세그먼트로 만들수도 있겠지
    • 이거도 세그먼트 단위로 주소변환을 해줘야함
    • 크기가 균일하진 않음
  • 통째로 올리지 않은 기법들

‏‏‎ ‎

0608

페이징 기법

사용자 영역을 관리하는 기법중 불연속할당 방식의 하나

페이지 별로 주소변환을 해야하니 이제 단순하진 않음

페이징 기법은

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/0220c8d3-6346-464f-907f-0b34d9044888.png

프로그램을 구성하는 논리적인 메모리를 동일한 크기의 페이지로 잘라서 페이지 별로 물리적인 메모리에 자리가 있으면 올라갈 수 있게 됨

논리->물리 주소변환을 위해 페이지 테이블이 필요

페이지 테이블 : 논리적이 페이지가 물리적인 어느페이지 프레임에 들어가는지 1번이 어디있는가 하는 테이블, 페이지 개수만큼의 엔트리가 들어있음

* 테이블이나 배열 : 인덱스를 이용해 접근할 수 있는 자료구조

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/75338b87-4de9-40d6-b858-2447aa278b45.png

논리적인 주소가 들어오면 앞부분은 주소, 뒷부분은 오프셋을 나타냄

테이블 내에 p번째에 저장된 f 프레임번호를 찾고 그 안에서 d를 찾음

d : 상대적인 내부주소, 변환해도 바뀌지 않음

앞에서는 레지스터로 변환을 했었는데 그러기에 용량이 너무큼

프로그램마다 별로도 테이블을 가지므로 대강 백만개의 테이블이 필요함

그래서 페이지테이블은 메모리에 저장

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/e6c0f919-e5b7-48bb-b81b-1d1eac8aba76.png

메모리에 접근하려면 두번의 접근이 필요함

  • 주소변환을 위해,
  • 메모리 접근을 위해.
  • 두개의 레지스터는 메모리상의 테이블 위치와 테이블의 크기를 위해 사용됨

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/a4efb034-6b4a-4dfc-bcb0-a2654eca333b.png

tlb에 캐싱

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/04e18cf8-d211-49bc-8bef-6d2b3ee2caba.png

2단계방식

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/c82c2442-fad0-4ccd-bea7-2a511d546a77.png

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/8e6e7384-6376-4dfd-a4ad-effea3f0e92a.png

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/08058e0c-0c5f-4684-81a5-a75d2ea55d5f.png

페이지테이블도 계층적으로 관리

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/eb527cd6-4115-4db6-b940-3207870d0504.png

쫓아들어가서 데이터를 찾음

페이지가 4kb니까 안에들어가는 페이지테이블도 4kb짜리

엔트리는 4바이트 그럼 테이블 하나에 1k개의 엔ㄴ트리를 넣을 수 있음

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/8a155402-ecf1-4e6c-8035-0c526ce2fb4d.png

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/435c2416-0df1-4526-b76f-c2d31e680a18.png

오프셋 : 2의 12승 바이트 4k바이트를 구별하려면 12비트가 필요함

단계별 페이지테이블을 찾아들어가려면 테이블이 어디있는지도 나눠서 적히겠지

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/0ec1b147-fe07-41b2-be5e-5de3ec483b70.png

똑같이 10칸씩 주나봄

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/29a8f9b9-c84a-46ce-afd9-900d003dc7d1.png

32가 아니라 64비트라면??

..

2단계 페이지 테이블

페이지테이블도 자리를 차지하는데 왜쓰냐

안쓰는 공간도 다 엔트리로 바꿔야함

최대 논리주소크기만큼 그걸 다 만들어야함

단계를 두면 사용되는 것들에 대해서만 안쪽 테이블이 만들어짐

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/583c0b45429c430bb41f3d16bd656fa3/391c4245-9cf9-420b-8cd8-d8d092eccc87.png

안쓰이는 건 null로 들어있음

‏‏‎ ‎

‏‏‎ ‎

#3

→ 슬리드로 보기


‏‏‎ ‎

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/5fd33e516b7a4dac9ed34c661cd1bf80/2ac44c99-f0a5-4c32-ba66-1b9e69fd6d58.png

‏‏‎ ‎

페이지테이블을 두개보다 많이 쓸수 있지

2,3,4단계 이렇게 하면 테이블을 위한 메모리를 덜 쓸수있는데

한번 주소변환을 할때 여러번 접근해야하는 상황이 생김

tlb : 주소변환을 전담해주는 일종의 캐시 메모리

‏‏‎ ‎

‏‏‎ ‎‏‏‎ ‎

#4

→ 슬리드로 보기


https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/e5165616847a4ecf8b6d39dfa03ab174/879244d8-6c2a-4756-b8f4-65c043360b05.png

의미있는 덩어리

‏‏‎ ‎

세그먼트 테이블을 통해 물리주소로 변환

이 테이블은 엔트리개수가 세그먼트 개수가됨

세그먼트 내에서의 오프셋

오프셋이 세그먼트테이블길이보다 작아야함

벗어나면 폴트

‏‏‎ ‎

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/e5165616847a4ecf8b6d39dfa03ab174/d01b12e6-c44a-4e65-9723-c98205d0acfc.png

레지스터두개

하나는 테이블의 위치

하나는 엔트리의 개수

번호랑 오프셋이 잘못된 곳을 참조하지 않는지 확인해야함

‏‏‎ ‎

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/e5165616847a4ecf8b6d39dfa03ab174/515fa1c2-bfe3-46db-8050-f77a4a12fcf4.png

의미단위로 하는일은 세그멘테이션이 유리하고

크기가 균일하지 않아서 홀이 생김,

페이징은 균일한 크기로 나눔

테이블을 위한 메모리낭비가 있음

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/e5165616847a4ecf8b6d39dfa03ab174/90ea952e-488e-4d03-aba5-daa753061d86.png

각각의 프로세스가 세그먼트를 공유

코드는 공유하고 private한건 따로씀?

‏‏‎ ‎

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/e5165616847a4ecf8b6d39dfa03ab174/dafee04a-f738-46f7-aa09-cce5459ee659.png

세그먼트+페이지

세그먼트안에 페이지테이블도있음

‏‏‎ ‎

이 챕터의 메인은 주소변환

운영체제는 주소변환을 하지 않음 ; 하드웨어(mmu)가 해줌

cpu가 논리주소를 주면 물리주소를 돌려줌

os는 하는게 없음

‏‏‎ ‎

https://slid-users-assets-v1-seoul.s3.ap-northeast-2.amazonaws.com/public/capture_images/e5165616847a4ecf8b6d39dfa03ab174/f82bda8e-754e-45e9-ae45-17c168e3df86.png

중간에 운영체제가 개입하려면 중간에 또 제어권이 넘어가야함

하드웨어가 해주는 주소변환을 통해 이뤄짐

그래서 여기까진 운영체제가 하는 일이 없음

‏‏‎ ‎

‏‏‎ ‎

0개의 댓글