8장 - 가상메모리

CHO·2022년 12월 25일
0

OS(운영체제)

목록 보기
9/18

페이징, TLB, 페이지 보호와 공유, 페이징에서 사상테이블의 구성, 세그멘테이션(보호+공유)
페이징을 사용하는 세그먼테이션?

8.1 가상메모리를 위해서는

실주소, 가상주소 존재
가상주소(virtual address) : 프로그램에서 참조하는 주소인 가짜주소
실주소 : 실제 메모리상의 주소를 의미

가상주소와 실제 주소가 다르면, 주소의 사상(mapping)이 필요하다!!

실주소 지정시점 : 컴파일시(프로그램 실행될 때 참조하는 주소가 실제 주소, 메모리를 항상 지정된 곳에서만 적재된다), 재배치할 때 사용함(실행시 재배치 레지스터에 프로그램이 적재되는 시작주소를 넣어서 실제 주소를 구할 수 있다. mapping+offset)

offset이 뭐더라...??!!?


전체 프로그램은 디스크 안에 있다!
몇개의 프로세스가 메모리에 올라가있다. 메모리를 보면 사용자의 것이 3개 올라가 있다는 거임.
순서 상관없이 막 섞여서 올라가져있음. 사용자 a,b,z의 메모리가 적재되어있음
모든프로그램은 조각이나서 일부분이 메모리에 올라가고, 순서와 상관없이 흩어져서 올라간다

-> 가상메모리로 관리될 때, 프로그램들은 디스크에 조각난 모야으로 저장되고 이 주 ㅇ몇개가 메모리에 비연속적으로 다른 프로그램의 조각드로가 섞여서 적재된다!!!!!!

8.2 페이징(Paging)

페이징 : 같은 크기의 조각들로 나눔, 이때 한 조각을 페이지라고 함!!

메모리 역시 프레임이라 불리는 페이지와 같은 크기로 나뉘어짐. 일련의 번호가 매겨짐.
한 프로세스의 전체 페이지들은 디스크에 저장되어있음, 이 주 ㅇ몇개가 메모리에 비연속적으로 다른 프로세스 페이지들과 섞여서 메모리에 올라가짐. 프로세스 실행 진행되는 과정에 따라서 디스크와 메모리 오가면서~~교체되는 단위가 페이지인 거!!!

그럼, 페이지 사상테이블은?(Page Map Table)??

  • 매핑을 하기위한 놈!(가상주소와 실주소 일치시켜주기 위함)
    이건, 운영체제 속성부터 봐야함
    운영체제는 가상주소를 실주소로 변환하기 위해서 프로세스당 하나의 페이지 테이블을 만들어둔다
    테이블 크기는 해당 프로세스의 페이지 갯수에 비례하는데~
    한 프로세스에서 나뉘는 페이지들은 일련의 번호를 갖는다.
    페이지 테이블은 이 번호 순서대로 엔트리???를 배치한다.
    테이블에서 첫번째 엔트리는 프로세스의 첫번째 페이지를 위한 매핑정보를 갖는다!

사용자 b: 0,1,2,3으로 페이지 나뉨 -> 매핑테이블에서도(o,1,2,3 엔트리를 가짐)

엔트리에 들어있는 정보는 이 페이지가 메모리에 있는 경우 1, 없을경우 0의 값을 가짐
존재 비트에 따라 1의 경우, 적재되어있는 프레임 번호를 가짐.
0을 가지면 이 페이지에 저장되어있는 디스크 주소 가짐

주소사상 방식??(address mapping?)
: paging, segmentation 둘 다 유사함! 첫단추를 잘 꿰어야해!!!!

가상주소 <p(페이지넘버),d(페이지넘버에서 얼마나 떨어져있는가)>
a = b + c
라고한다면

페이지테이블에서 페이지 넘버를 본다. 그리고 메모리에 적재된 페이지를 보는데, 여기서 메모리가 페이지 시작점 기준에서 얼마나 떨어져있는지를 보고 이를 가상주소로 지정해준다. 즉, 실주소와 가상주소를 맞춰주는(매핑)해주는 과정에 대한 그림이다.

페이지맵테이블도 메모리에 보관됨
: 맵테이블의 스타트는 기준레지스터가 갖고있다. 알파를 봐야해
알파를 찾기위해 go to 10을 통해서 가상주소에 생긴 페이징 넘버<3>을 페이지 테이블 안에서 찾아간다.
(4번째 페이지로 감) -> 3번 페이지가 메모리 어딘가에 있는데, 그걸 프레임넘버라고 함. 프레임넘버 10이라고 하면, 이건 11번째 프레임을 의미하니까,프레임 첫주소를 알려면 앞의 10개의 프레임 건너뛰어야함. px10을 진행한다. 5만큼 떨어져있으면 10이 있는거다?
px10+5가 됨

가상주소에서 실주소를 찾아가기 위해서 '기준레지스터(알파있는 곳)'과 '페이지 테이블'이 필요하다. 페이지 테이블은 매핑의 전부를 담고있다.

virtual address에서 real address를 얻는 과정 = mapping 과정을 정확히 알아야해!!!!!!!!

+디맨트 패치과정도 설명해주심 (요구패치? = demand paging도 설명함) 암튼 이거는 하게되면, 메모리에 적재되지 않으면 0으로 표시 -> 프로세스 끌어다가 메모리에 적재시키고 1로 바꾸고 거기에 해당하는 번호(프레임넘버)를 옆에다 써주는 방식이라고 함

추가내용!
각 프로세스의 pcb에는 자신의 페이지 테이블 주소가 저장되어있다.
PCB란 운영체제가 프로세스에 대한 중요한 정보를 저장해 놓을 수 있는 저장 장소
이 프로세스가 cpu를 받아 실행상태가 되면, 이 주소를 기준 레지스터에 넣어준다
한 번의 메모리 접근을 위해서는 실제로 두 번의 메모리 접근을 해야한다 (단점임. 이걸 어떻게 보완할까)

어떻게하면 두 번의 메모리접근을 빠르게 해치울 것인가????

그러기위해서!! 바로 tlb를 사용한다!!!

8.2.1 TLB(Translation Lookaside Buffer)dml tkdyd
: 고속캐시의 일종
: 키 값으로 찾고자 하는 워드 동시에 접근하는 연관메모리이다
: 검색이 빠르다, 비싼 하드웨어다
: TLB에서의 검색 성공확률 적중률을 hit ratio 라고 함

tlb가 없다면, 메모리 접근하려면 200나노초가 걸림 (사상테이블접근+실주소접근 2번 접근하니까)

tlb가 있어서 tlb 검색과 메모리 접근을 각각 20과 100나노초가 걸리고, 적중률 90%라고하면, 메모리 접근하는데 걸리는 시간은

0.9x120(tlb접근+실주소접근) + 0.1x220(tlb접근은 함+사상테이블접근+실주소접근) = 130 나노 초
가 되므로 tlb를 사용하지 않을 경우의 200나노 초보다 빠르다.

0.1 : portable miss가 난 상황을 의미

8.2.2 페이지 보호와 공유
: 페이지보호 - 접근하고자 하는 페이지에 대해 읽기 쓰기 작업을 어떻게 제한할 것인지? 또한 다른 프로세스 주소공간 침범하지 못하게 하는 걸 의미
이는 페이지 테이블마다 각 엔트리에 보호비트를 두어 허용되는 접근을 설정하면 됨

:페이지 공유 - 공유되어질 프로그램들은, 그 프로그램 하나만 메모리위에 올려둔다. 그러면 여러 사용자들이 이를 같이 실행하는데 각자의 사용자들 메모리에서 내용이 실행되므로 메모리 공간에서의 절약이 가능해진다. 또한 공유되고있는 프로그램은 다른 사용자들에게 동일하게 보여져야하기 때문에 코드가 동일해야한다. / 보통 프로그램은 '명령어 페이지'와 '데이터페이지'로 나뉜다. 이 중 '명령어페이지'를 공유해야 사용이 가능하다.

a<3,0> = b<2,3> + c<3,2> 이런식으로 매핑이되는거...!(진짜예시니까 대충만들었음)
이런게 명령어페이지임! 왜 이렇게 생겼냐면, 실행도중에 메모리 주소를 참조하기 때문이다.(가상의 주소를 내놓기 때문임)

데이터페이지는 진짜 순수하게 데이터만 저장되어있는 페잊

예시) goto<2,0> : 명령어페이지
결론 : 페이지 공유를 위해서는 각자의 페이지테이블의 위치가 똑같다. goto<2,0>라는 공유되어지는 페이지를 가기 위해서는 각자의 페이지 테이블에서 같은 위치에 있아애 동일한 페이지를 공유받을 수 있다.

8.2.3 페이징에서 사상테이블의 구성!?
tlb: 메모리접근 시간을 빨리 하기 위한 hw캐시

: 여기서의 메인ㅇ느!! 공간을 어떻게하면 줄일 수 있을까?이다.
: 페이지테이블의 엔트리 하나의 크기를 4바이트로 잡으면, 각각 앤트리갯수가 많이 마오는데 ㄱ그러면 4mbyte가 된다?

:32비트를 사용해 주소를 표현하는 시스템에서 하위 12비트를 offset으로 사용한다면, 페이지크기는 4kbyte(2^12)가 되고 사상테이블은 최대 100만개(2^20)의 엔트리를 가질 수 있다.
: 엔트리 크기를 4byte로 잡더라도 페이지 테이블의 크기는 4mbyte가 된다. 매우 큰 크기가 되므로 메모리를 모두 저장하기엔 꽤나 큰 메모리 사이즈이기 때문에, 페이지 테이블을 작게 나눠 필요한 부분만을 메모리에 적재할 수 있게 "계층구조"를 갖도록 구성할 수 있다.

그래서 20비트를 또다시 10비트로 나눠준다
: 10비트는 바깥(루트) 페이지 테이블 엔트리 위치로, 하위 10비트는 나누어지는 테이블 내의 엔트리 위치를 나타내도록 해본다!! 2^10 = 1024개의 entry가 생긴다! 루트 테이블에서

페이지테이블에서 몇 개만 골라서 메모리에 올리겠다는 의미
루트테이블은 기본적으로 필요하되, 페이지 테이블의 스타트 부분들 참조함

2번 프로세스의 3번 페이지는 메모리에 있다?

역페이지 사상테이블을 보면, 페이징은 고정 크기 페이지로 메모리 관리와 구현이 쉽다

왼쪽에 프로세스, 페이지가 없으면 각각 null값을 갖고, 프레임에도 올라가있지 않다

만약 프로스, 페이지가 번호를 부여받으면 프레임 i번째 위에 적재되어있다
+내부단편화가 일어남

8.3 세그먼테이션(segmentation)

: 프로그램의 논리적단위를 의미
: 서로 다른 크기의 세그먼트들이 모여 전체 프로그램을 구성한다.
: 세그먼트 개수만큼 엔트리를 갖는 세그먼트 테이블이 필요하겠다. 또한 가상주소는 세그먼트 번호(s)와 세그먼트 내에서의 위치값(d)로 표현한다.
:존재 비트의 값에 따라 유효한 디스크 주소와 메모리 주소를 갖는 필드들이 있다
: 페이징과 다른 점은 메모리 주소 필드에 적힌 값 = 실주소임

: 세그먼테이션은 내부단편화 없음, 매모리 적재는 7장 가변분할에서의 배치기법을 사용한다 + 외부단편화가 발생한다
: 세그먼테이션 테이블을 위해 tlb를 사용할 수 있다

8.3.1 세그먼트의 보호와 공유
보호 : d값이 세그먼트의 길이를 초과하면 안된다. d값보다 크면 트랩으로 막아야함, 접근제어키를 사용하면 (비트를 이용해서, read, write 등을 지정해주는 키를 의미) 세그먼트 별로 혀용되는 작업을 제어하 ㄹ수 있다. 이를통해 사용자의 잘못된접근에서 보호한다

공유 : 페이징과 같이 엔트리에 같은 주소값을 갖게끔 한다!

세그먼테이션과 페이징의 매핑방식은 다음과 같다. (엑세스 3번하는 꼴)
1차적으로 세그먼트로 나눠지고 2차적으로 페이지로 나눔 -> 메모리를 찾아간다.
결론!
메모리는 프레임 단위로 나뉘어져있어야한다.

virtual address : using segmentation or paging 기법 : 매핑과정을 사용함

profile
매일 개념 익히고 적용합니다

0개의 댓글