2. 목차
• 컴퓨터 시스템 9장 : 가상메모리 + OS : 메모리 관리
• 메모리 관리
• 메모리 추상화
• 주소 공간
• 스와핑
• 가용 메모리 공간 관리
• 가상 메모리
• 페이징
• TLB
• 페이지 테이블 종류
• 페이지 교체 알고리즘
• 주요 이슈
• 세그멘테이션
• 부록
• 참고 사이트
• 참고 서적
3. 메모리 관리?
• 우리가 원하는 메모리 – 빠르고, 크고, 비 휘발성
• 비싸다
• 메모리는 언제나 부족한 자원
• 컴퓨터 성능을 높이기 위해 여러 방법들이 생김
• 메모리 계층 구조
• 가상 메모리
• ...
• 공부하는 이유
• 메모리가 어떤 식으로 관리되는지 알아야 좋은 성능의 프로그램을 만들 수 있다.
• 메모리는 컴퓨터의 모든 프로그램이 이용한다.
• 많은 컴퓨터의 개념들이 메모리 개념을 바탕으로 깔고 간다.
• 공부할 것
• OS가 어떻게 메모리를 추상화 하는가
• OS가 어떻게 메모리를 관리 하는가
4. 메모리 관리?
• 메모리 계층구조
• 캐시 : 작고, 빠르고, 휘발성, 비쌈
• DRAM : 중간속도, 휘발성, 중간정도 가격
• 디스크 : 크고, 느리고, 비휘발성, 싸다
• USB, DVD 등도 포함
• 이러한 계층구조를 사용하기 좋은 모델로 추상화하고, 이 추상화된 객체를 관리하는 것이 OS의 역
할이다
• 메모리 관리자가 담당
• 현재 사용중인 메모리 부분 파악
• 프로세스에게 메모리 할당, 해제
• CPU 아래 있는 캐시는 보통 하드웨어에서 담당한다
• 앞으로 주로 DRAM에 관련된 내용을 다룰 것임
6. 메모리 추상화
• 메모리 추상화가 없는 환경에서 메모리는 어떻게 작동할까? 물리 메모리를 그대로 사용하면 어떻
게 될까?
• 다음과 같은 두 프로그램이 있다
• 각각 0번지에는 24번지로 점프하는 코드, 28번지로 점프하는 코드가 있다.
• 맨 오른쪽은 두 프로그램이 메모리에 올라와 있는 상황이다.
• 흰 색 프로그램은 16384주소부터 올라왔다.
• 프로그램을 실행하여 jmp 28 코드를 만난다.
• ??? 28은 회색 프로그램이 올라와 있는 곳이다.
• ->이러한 경우 흰색 프로그램이 이용하는 모든 주소에 16384를 더해주어야 한다.
• 시작 주소가 0이 아니라 16384이기 때문
• 프로그램을 실행할 때마다 자신의 시작 주소를 체크하고 코드를 수정해야 한다.
• 매번 코드를 수정하는 것은 부담이 된다.
?!???
7. 메모리 추상화
• 물리 메모리를 직접 사용하면 생기는 단점
• 프로그램이 물리 메모리의 모든 주소를 접근할 수 있다면 사용자는 실수, 또는 의도적으로OS를 파괴할 수 있다.
• 시스템이 중지될 수도
• 여러 프로그램들을 동시에 실행하는 것이 어렵다
• 서로의 메모리를 침범할 수 있기 때문
• 여러 프로그램들을 동시에 메모리에 적재하고 서로 간섭 없이 실행하고 싶다.
• 그러기 위해서는 보호(protection)와 재배치(relocation)이 필요하다.
• 보호 : 서로 남의 영역을 침범할 수 없도록 한다
• 재배치 : 앞에서 코드의 주소를 수정한 것 처럼, 어느 위치에 올라오든 정상 실행이 되도록 보정해 준다.
• 이를 효과적으로 해결하기 위해 주소 공간(memory space)이라는 메모리 추상화 개념이 도입되었
다.
8. 메모리 추상화
• 주소 공간
• 프로세스가 메모리를 접근할 때 사용하는 주소들의 집합
• 각 프로세스는 자신만의 주소 공간을 갖는다.
• 한 프로세스가 갖는 주소 공간은 다른 프로세스가 갖는 주소 공간과 독립되어 있다
• 프로그램은 한정된 길이의 논리 주소를 이용하고, 그 논리 주소로 표현할 수 있는 크기의 주소공간만을 이용할 수 있다.
• 주소로 만들 수 있는 경우의 수가 주소 공간의 크기이다.
• 주소가 32비트라면 2^32범위의 주소 공간을 이용할 수 있다.
• 주소 공간은 다른 곳에서도 많이 이용되는 개념이다.
• Ex) 휴대폰 전화번호를 위해 11개의 숫자를 이용한다
• 010 1111 1111
• -> 000 0000 0000 ~ 999 9999 9999 사이의 숫자 조합이 가능하다.
• 휴대폰 번호 앞자리는 예약된 규칙이 있다.
• 010, 011 등
• 메모리의 주소에도 규칙이 있다.
프로세스
A
프로세스
B
물리
메모리
주소공간
주소공간
프로세스는
주소공간을 이용
CPU(하드웨어)
가 논리 주소를 물리
주소로 변환
9. 메모리 추상화
프로세스A
주소 1234 값
불러와
프로세스 B
주소 1234 값
불러와
주소공간
주소공간
프로세스는
주소공간의
1234를 요청
A대학 학번
B111111
B대학 학번
B111111
A대학 학번
리스트
B대학 학번
리스트
학번 B111111을
가진 학생에게
편지를 보내려
한다.
각 대학이 가진 학번
리스트를 보고 학생의
정보(주소)를 찾는다.
프로세스 A의
데이터
프로세스 B의
데이터
CPU(하드웨어)가
주소공간의 1234가 실제로 물리메모리
어디에 올라와 있는지 알아내어 작업
보냄
보냄
10. 메모리 추상화
JMP 16412
프로세스
A
프로세스
B
물리
메모리
물리 메모리 주소 직접
이용
-> 프로그램 실행시마다
코드를 매번 바꾸어야 함
프로세스
A
프로세스
B
물리
메모리
주소공간
주소공간
프로세스는
주소공간을 이용
CPU(하드웨어)가 논리
주소를 물리 주소로 변환
->여러 방법이 있음. 살펴볼
것임
11. 메모리 추상화 – Base, limit 레지스터
• 주소 공간을 적용한 예이다.
• 각 프로세스의 코드를 수정하지 않았다.
• 그대로 jmp 28을 이용한다.
• 프로세스는(프로세스의 코드는) 실제로 물리 주소 어디에 올라왔는지 신경 쓰지 않는다.
• base 레지스터와 limit 레지스터가 있다.
• base 레지스터는 코드의 시작 주소를, limit 레지스터는 프로그램의 크기를 저장한다.
• CPU는 주소를 참조할 때마다 base 레지스터에 저장된 값을 이용하여 보정한다.
• 이용하려는 논리 주소가 limit 레지스터에 있는 값보다 큰지 체크한다.
• limit 레지스터 값보다 크다면 메모리 참조는 중단되고, 결함(fault)가 발생한다.
• 논리 주소가 범위 내라면, base 레지스터의 값과 더한 값을 이용하여 메모리에 접근한다
• 이렇게 매번 재배치하는 방식을 동적 재배치라고 한다.
• Base 레지스터와 limit 레지스터를 사용하는 재배치의 단점
• CPU가 모든 메모리 참조마다 덧셈과 비교 연산을 해야 한다.
12. 메모리 추상화
• 여태까지의 예는 물리 메모리의 크기를 고려하지 않았다.
• 실제로는 물리 메모리의 공간이 한정되어 있다.
• 여러 프로그램을 동시에 실행하기 위해서는 물리 메모리에 여러 프로그램을 올려야 한다.
• 여러 프로그램들이 필요로 하는 메모리의 크기를 전부 합치면 물리 메모리의 크기보다 크다.
• 어떻게 여러 개의 프로그램을 좁은 물리메모리에 올릴 수 있을까?
• 스와핑
• 프로세스가 실행되기 위한 데이터 전체를 메모리에 올린다.
• 프로세스가 더이상 실행되지 않을 경우 디스크로 내려 보낸다.
• 가상메모리
• 한 프로세스의 전체 이미지가 아닌, 일부만 메모리에 있어도 그 프로세스의 실행이 가능하도록 한다.
13. 메모리 추상화 – 스와핑
• 스와핑
• 프로그램이 실행되거나 다시 진행될 때는 프로세스 이미지를 통째로 올린다.
• 이를 swap in이라 한다.
• 큰 저장소(하드디스크 등)에 프로세스 이미지를 백업해 두고 메모리에서 내보낸다.
• 이를 swap out이라 한다.
14. 메모리 추상화 – 스와핑
• 이슈
• A가 swap out 했다가 다시 swap in 했을 때, 위치가 변경되었다.
• 재배치가 필요하다.
• base, limit 레지스터를 이용할 수도 있고, 다른 방법을 이용해도 되고..
• 스와핑 결과 여러 개의 분리된 빈 공간들이 만들어진다.
• 이를 external fragment라고 한다.
• (e)에서, 위 아래 빈 공간을 합치면A가 들어올 수도 있을 것 같다.
• 하지만 빈 공간이 쪼개져 있어서A가 올라올 수 없다.
• 이런 문제를 해결하기 위해 빈 공간을 합칠 수 있도록 했다.
• 메모리 조각 모음(Memory Compaction)
• 오버헤드가 커서 잘 안 쓴다.
15. 메모리 추상화 – 스와핑
• 이슈
• 많은 프로그램들은 실행 중에 크기가 커진다.
• 스택, 힙 등
• 주변에 빈 공간이 있다면 그냥 추가하면 된다
• 주변에 빈 공간이 없다면 프로세스 이미지를 충분한 공간이 있는 곳으로 이동하거나 다른 프로세스를 swap out하여 공간을 확보해야 한다.
• 이것이 불가능하다면 프로세스를 잠시 중단하거나 강제 종료 시켜야 한다.
• 커질 것을 대비하여 애초에 넉넉하게 잡아 주기도 한다.
16. 메모리 추상화 – 가용 메모리 공간 관
리
• 메모리를 할당하고 해제하기 위해서는 메모리의 어떤 부분이 사용 중인지 알아야 한다.
• 메모리를 관리할 때 사용하는 대표적인 두 가지 자료구조
• 비트맵(bitmap)
• 메모리를 일정 단위로 자른다.
• n 워드~ n KB까지 할당 단위가 될 수 있다.
• 일정 단위로 나눈 각 구역이 할당되었는지를 체크한다.
• Ex) 0이면 가용, 1이면 이미 할당된 상태
• 리스트(list)
• 할당된 메모리 공간과 가용한 메모리 공간을 연결 리스트로 관리
• 각 엔트리는 할당 여부와 시작하는 주소, 길이, 그리고 다음 엔트리를 가리키는 포인터로 구성
• 이것 역시 메모리를 일정 단위로 잘라 관리한다.
17. 메모리 추상화 – 가용 메모리 공간 관
리
• 위 그림의 눈금은 한 할당 단위이다.
• A 프로세스는 5개, B는 6개, C는 4개, D는 6개, E는 3개 이용한다.
• 빗금 친 부분은 구멍이다.
• 가용한 공간
• external fragment
• 왼 쪽은 비트맵, 오른 쪽은 리스트를 이용하여 관리하는 모습이다.
• 프로세스의 크기가 할당 단위의 정수배가 아니면 마지막 할당 단위의 일부 공간이 낭비된다.
• internal fragment라고 한다.
18. 메모리 추상화 – 가용 메모리 공간 관
리
• 비트맵
• 비트맵의 크기는 메모리의 크기와 할당 단위의 크기에 의해 결정된다.
• 고정된 크기의 공간으로 메모리 사용량을 관리할 수 있다.
• 크기가 늘어나지 않음
• Ex) 할당 단위가 4바이트
• 메모리 4바이트마다 1비트의 비트맵을 요구
• 즉, 32비트마다 1비트를 요구 -> 32n비트에 n비트의 비트맵이 필요
• -> 전체 메모리의 1/33이 비트맵으로 사용됨
• 문제점
• k개의 할당 단위를 요구했을 때, 메모리 관리자가 비트맵에서 연속적인 k개의 0을 찾아야 한다는 점
• 비트맵을 검색하느라 시간을 보낸다.
19. 메모리 추상화 – 가용 메모리 공간 관
리
• 리스트
• 각 엔트리는 프로세스나 구멍의 시작 주소를 가지고 있으므로 관리하기 좋다
• 문제점
• 상대적으로 복잡하다.
• 리스트 크기가 늘어날 수 있다. (고정이 아님)
20. 메모리 추상화 – 가용 메모리 공간 관
리
• 리스트
• 리스트를 돌며 할당할 공간을 찾는 여러 알고리즘이 있다.
• 최초적합(first fit)
• 리스트를 처음부터 검색
• 요청한 공간을 담을 수 있는 크기의 빈 공간이 발견되면 그 공간을 할당한다.
• 다음적합(next fit)
• 자신이 빈 공간을 할당한 위치를 기억해 둔다.
• 리스트를 처음부터 검색하지 않고, 기억해 둔 위치부터 검색한다.
• 최초적합에 비해 성능이 떨어진다고 분석되었다.
• 최적적합(best fit)
• 리스트 전체를 검색한다.
• 요청한 크기와 가장 근접한 크기의 빈 공간을 찾아 할당한다.
• 리스트 전체를 검색해야 하기 때문에 느리고, 최초나 다음적합보다 낭비하는 메모리(fragment)가 많다고 분석되었다.
• 작게 조각난 많은 빈 공간들을 생성하기 때문
• 최악적합(worst fit)
• 항상 가장 큰 빈 공간을 할당해 준다
• 썩 좋은 아이디어는 아닌 것으로 분석되었다.
• 빠른적합(quick fit)
• 자주 요청되는 공통 크기의 빈 메모리 공간들을 서로 다른 리스트로 관리한다.
• 빈 공간을 검색하는 것은 매우 빠르다
• swap out/프로그램 종료될 때, 이웃 엔트리와 통합이 가능한지 확인하는 작업에서 복잡해진다.
• 통합하지 않으면 메모리가 빠르게 단편화 되어 작은 크기의 빈 공간들이 많이 존재하는 상태가 된다.
21. 메모리 추상화 – 가상 메모리
• base, limit 레지스터를 이용하여 주소 공간이라는 추상화를 했지만, 여전히 문제가 있다.
• 메모리의 크기가 증가하는 속도(메모리 발전 속도)보다 소프트웨어의 크기가 증가하는 속도가 빠르다.
• 프로그램이 물리 메모리보다 큰 크기의 공간을 요구하는 경우가 생긴다.
• 각 프로그램의 크기는 메모리보다 작지만 여러 프로그램의 크기를 모두 합치면 메모리의 크기보다 커질 수 있다
• 동시에 여러 프로그램을 실행할 수 있는, 큰 프로그램을 실행할 수 있는 메모리 추상화가 필요하다.
• 스와핑은 프로세스 전부를 올렸다 내렸다 하므로 오버헤드가 크다
• disk 저장은 느리다
• 프로세스 전부를 이동하니 더욱 느리다(많은 양을 이동하니까)
• 그래서 가상 메모리라는 개념을 도입한다.
• 핵심
• 각 프로그램이 자신의 고유한 주소 공간을 가진다
• 주소 공간은 페이지(page)라고 불리는 조각들로 구성된다
• 각 페이지는 연속된 주소를 갖는다
22. 메모리 추상화 – 가상 메모리
• 가상 메모리
• 모든 페이지들이 메인 메모리에 없어도 된다
• 당상 사용하는 페이지만 올려 둔다
• 논리 주소를 이용하여 페이지에 접근하면 하드웨어가 즉시 매핑한다.
• 물리 주소를 얻는다
• 해당 페이지가 물리 메모리에 올라와 있다면 그대로 사용한다.
• 해당 페이지가 물리 메모리에 없다면 OS가 해당 페이지를 메인 메모리에 올린다.
• 그 후 실패했던(메모리에 접근하려 했던) 명령을 다시 실행한다.
• 다시 실행했을 때는 페이지가 올라와 있어 그대로 사용하게 된다.
• -> 프로그램의 일부만 올라와도 실행 가능, disk에 짧게(적은 양의 데이터만 이동하므로) 접근
23. 메모리 추상화 – 가상 메모리
• 페이징
• 대부분의 가상 메모리가 사용하는 기법
• 페이지 : 가상 주소 공간을 나누는 단위. 하드웨어에 의해 결정된다.
• 옆의 그림에서는 4KB가 페이지의 크기이다
• 실제 시스템은 512B에서 몇 기가바이트까지 다양한 크기의 페이지가 이용된다.
• 페이지 프레임 : 메인 메모리 상에 대응되는 단위
• 페이지의 크기와 페이지 프레임의 크기는 같다.
• 메인 메모리의 페이지 프레임에 가상 메모리의 페이지를 넣는다.
• 메인 메모리가 꽉 차면 올라와 있는 페이지를 내보내고 다른 페이지를 올린다
• 어떤 페이지를 내보낼지 정하는 알고리즘들이 있다
• 페이지 교체 알고리즘
• 내보내진 페이지는 디스크에 저장된다.
• 나중에 다시 요청을 받으면 올린다
24. 메모리 추상화 – 가상 메모리
• 페이지 테이블
• 가상 주소와 물리 주소 간의 관계를 표현한다.
• 어떤 페이지가 어느 페이지 프레임에 올라가 있는지 표시한다.
• 프로세스마다 페이지 테이블이 존재하고, context switch마다 페이지 테이블이 교체된다.
• 쓰레드간 switch가 값이 싼 이유이다.
• 가상 메모리를 공유하기 때문에 페이지 테이블을 교체하지 않아도 됨
• 페이지 번호는 페이지 테이블의 인덱스로 사용됨
25. 메모리 추상화 – 가상 메모리
• MMU
• 프로그램이 가상 주소를 이용하여 메모리에 접근 할 때, MMU(Memory Management Unit)라는 하드웨어에 의해 물리 주소로 변환된다.
• 요즘 CPU에는 MMU가 함께 들어가지만, MMU는 CPU와 독립적이며 다른 칩으로 존재할 수도 있다
• 페이지 테이블을 참조하여 물리 메모리로 변환한다.
26. 메모리 추상화 – 가상 메모리
• 예
• 다음과 같은 가상 메모리와 물리 메모리가 있다.
• 이 예에서는 가상메모리가 더 작지만, 설명을 위한 예이므로 개의치 말자
• 2번 페이지가 물리 메모리 어디에 올라왔는지 찾아보자
• 페이지 테이블의 2번 멤버를 보면 1번 페이지 프레임에 올라왔다는 것을 알 수 있다.
• 1번 페이지 프레임에 가 보면 2번 페이지가 올라와 있는 것을 확인할 수 있다.
• i는 페이지 시작으로부터 오프셋 0, j는 1, k는 2, l은 3에 있다.
27. 메모리 추상화 – 가상 메모리
• 예
• 가상 주소 8194에 접근한다 하자.
• 8K = 8*2^10 = 2^13 = 8192이므로, 8K~12K에 해당하는 2번 페이지에 들어있다.
• 2번 페이지의 정보를 담은 페이지 테이블을 찾아보아 6번 페이지 프레임에 있다는 것을 알아냈다.
• 가상주소 8194는 2번 페이지의 3번째 바이트이다.
주소
8192
주소
8193
주소
8194
...
... ... ... ...
주소
12284
주소
12285
주소
12286
주소
12287
(12*2^10 -1)
28. 메모리 추상화 – 가상 메모리
• 예
• 가상 주소 32780에 접근한다 하자.
• 8번 페이지의 12번째 바이트이다. (32 * 2^10 = 32768임)
• MMU 는 페이지 테이블을 보고 해당 페이지가 매핑 되지 않았다는 것을 파악한다.
• CPU에게 트랩을 발생시켜 OS에게 이를 알린다
• 이것을 page fault(페이지 폴트)라고 한다.
• 메모리에 자리가 없다면 페이지 교체 알고리즘에 따라 적절한 페이지를 내보낸다.
• 페이지 내용을 디스크에 기록하고, 해당 페이지의 주인 프로세스의 맵을 수정한다.
• 사용하려는 페이지를 올리고, 현재 프로세스의 맵을 수정하고, 트랩을 야기한 명령을 다시 실행한다.
29. 메모리 추상화 – 가상 메모리
• MMU와 페이지 테이블
• 가상 주소를 이용하여 페이지 번호와 페이지 프레임 내의 위치를 얻는다.
• 그림은 16개의 엔트리를 갖는 페이지 테이블과 4KB 크기의 페이지를 이용하는 예이다.
• 앞의 4비트(0~15 표현 가능)로 페이지 테이블의 인덱스를 얻는다.
• 뒤 12비트로 해당 페이지에서의 위치(오프셋)를 얻는다.
30. 메모리 추상화 – 가상 메모리
• MMU와 페이지 테이블
• 페이지 테이블의 내용으로 null이 있으면 매핑되지 않은 페이지라는 의미이다.
• null이 아닌 값은 페이지 프레임의 번호이다.
• 그림에서 맨 앞 4비트가 0010으로, 2번 페이지에 있음을 의미한다.
• 페이지 테이블의 2번 페이지 정보를 본다.
• 매핑 여부를 적어 두는 1비트가 1이다.
• 매핑이 되어있다는 의미이다.
• 페이지 프레임 번호를 본다.
• 110이다.
• 110과 뒤의 12비트(페이지 내부에서의 위치 오프셋)를 붙여 물리 주소를 생성한다.
• 페이지 프레임 번호의 비트 길이와 페이지 테이블 인덱스의 비트 길이가 다르다?
• 당연하다. 위의 그림에서 보듯, 가상 메모리가 실제 메모리보다 크기 때문
• 이 예에서는 물리 메모리의 크기가 2^15이다.
• 물리 메모리의 크기에 따라 물리 주소가 달라진다. 물리 메모리가 더 크다면 더 긴 주소를 만들 것이다.
• 그러면 가상 메모리도 그에 맞춰 크게 만들 것이니, 가상 주소도 길어지고 페이지 테이블도 커질 것이다.
• 하지만 CPU는 word라는 단위로, 주소가 몇 비트일지를 정해 두었다.
• 하드웨어적인 문제
31. 메모리 추상화 – 가상 메모리
• MMU와 페이지 테이블
• 가상 주소를 이용하여 페이지 테이블에 접근하고, 페이지 프레임에서의 위치를 잡는다
• 페이지의 크기에 따라 페이지 테이블의 크기가 결정된다
• 주소의 길이는 고정이기 때문
• 페이지 크기가 4K라면 0~2^12 범위의 오프셋을 표현해야 하기 때문에 뒤 12비트를 이용해야 한다.
• 주소의 길이가 16비트라 가정하자.
• 한 프로세스가 이용할 수 있는 페이지 수가 32라면?
• 페이지 테이블의 엔트리 수가 32 -> 접근을 위해 5비트가 필요
• 나머지 11비트로 페이지 내용에 접근해야 함
• 11비트로 한 페이지의 처음부터 끝까지 접근할 수 있으려면 페이지의 크기는 2^11가 되어야 함
• 이렇게 가상 주소 길이와 페이지 크기, 페이지 테이블 크기가 연관되어 있다.
32. 메모리 추상화 – 가상 메모리
• MMU와 페이지 테이블
• 만약 프로세스가 6번 페이지는 아예 이용하지 않는다면?
• 이용하지 않는 페이지에 접근하여 하면 segmentation fault로 종료된다.
• 만약 6번 페이지를 사용하지만, 메모리에 올라오지 않았다면?
• 해당 페이지를 하드에서 읽어오고, 메모리 내용을 교체하는 과정을 거친다.
33. 메모리 추상화 – 가상 메모리
• 페이지 테이블 엔트리(PTE)
• 앞의 페이지 테이블은 약식이다.
• 실제로는 해당 페이지가 메모리에 올라와 있는가와 페이지 프레임 번호 외의 정보도 있다.
• 페이지 테이블 엔트리 크기는 시스템에 따라 다르나 일반적으로 32비트 크기를 갖는다
• Caching disabled : 해당 페이지를 캐싱할 것인지 말 것인지
• 민감한 정보나 응답 등은 캐싱해서는 안 된다. (오래된 정보를 이용하지 않도록)
• Referenced : 최근에 이용되었는지 체크하는 비트
• 뒤에서 할 페이지 교체 알고리즘에서 중요하다
• Modified : 수정된 적이 있는지
• 해당 페이지에 내용을 write했다면, 페이지를 메모리에서 내릴 때 변화된 내용을 저장해 주어야 한다.
• 단순히 read만 했다면 보통 디스크에 있는 복사본이 있기 때문에 메모리에서 내릴 때 저장하지 않아도 된다.
• 텍스트 파일에 아무 변화가 없으면 저장하지 않는 것처럼
• dirty bit라고도 함
• Protection : 보통 3비트로, 읽기/쓰기/실행 권한을 표시한다.
• 쓰기 권한이 없는 페이지에 쓰기를 실행하려 하면 에러가 난다.
• Present/absent : 페이지가 물리 메모리에 올라와 있는지 표시
• Page frame number : 페이지 프레임 번호
34. 메모리 추상화 – 가상 메모리
• 페이징
• 장점
• 앞에서의 요구사항을 만족
• 메모리 관리가 간편해 짐
• external fragment가 없다.
• 단점
• 메모리에 접근할 때마다 페이지 테이블에 접근해야 한다.
• internal fragment는 해결되지 않았다.
• 페이지 크기보다 작은 데이터를 이용할 때에도 페이지 단위로 할당해야 한다
• 페이지 크기를 작게 한다면 internal fragment의 크기가 줄겠지만, 페이지 크기가 작다면 그것을 관리하기 위한 페이지 테이블의 크기가 커
진다
• 각 프로세스를 위한 페이지 테이블이 있어야 한다.
• 32bit 가상 주소를 이용하는 환경 -> 2^32 크기의 가상 메모리 이용 -> 페이지가 4KB라면, 총 2^20개의 PTE가 필요
• PTE 하나가 4바이트(32비트)라면, 한 프로세스를 위해 2^22(4MB)크기의 페이지 테이블이 필요함
35. 메모리 추상화 – 가상 메모리
• 페이징 구현
• 1. 페이지 테이블을 레지스터에 저장하자
• 여기서 레지스터는 CPU 내부에서 이용하는 저장장소를 의미한다
• 프로그래밍에 이용한 레지스터 이외에도 CPU는 많은 레지스터를 가지고 있다.
• 프로그래밍에 이용한 레지스터는 ‘레지스터 파일’이라고도 부른다.
• 레지스터에 넣어두면 페이지 테이블에 빠르게 접근할 수 있을 것이다.
• 레지스터는 가격이 비싸다
• 이상일 뿐
• context switching시 모든 레지스터의 값을 수정해야 한다
• 프로세스 실행시에는 오버헤드가 적지만 프로세스가 교환될 때는 오버헤드가 크다
• 2. 페이지 테이블을 메모리에 저장하자
• 페이지 테이블이 저장된 위치만을 레지스터에 저장해 두면 됨
• 페이지 테이블도 물리 메모리에 올라와야 한다.
• 페이지 테이블이 올라와 있지 않다면 페이지 폴트가 날 수 있다
• 메모리를 참조하기 위해 먼저 (또한 메모리에 올라와 있는)페이지 테이블을 참조해야 한다
• 상대적으로 느리다
• 현대의 컴퓨터는 대부분 페이지 테이블을 메모리에 저장한다.
• 그리고 TLB라는 특별한 캐시를 이용하여 속도를 향상시킨다.
36. 배경지식 -Cache
• 캐시
• TLB를 자세히 살펴보기 전에 캐시에 대한 개념을 잡자
• 캐시는 CPU~DRAM 사이에 있는, 빠르게 접근할 수 있으며, 크기가 작은 메모리를 의미한다
• 또한 캐시는 어떤 한 저장 장소보다 상대적으로 빠른 저장장소를 의미한다
• 메모리 계층구조에서, disk의 캐시는 dram이고, dram의 캐시는 L3캐시이고...
• 앞으로 살펴볼 것은 첫번째 의미의, CPU~DRAM사이의 캐시이다.
37. 배경지식 -Cache
• 캐시
• 일반적인 캐시 구조
• 최근에 접근한 데이터의 내용을 저장해 둔다
• 블록 단위로 저장
• 최근 요청 받은 데이터 근처의 것도 함께 저장
• 주소로 접근
• 주소의 앞 t비트는Tag이다
• 주소의 중간 s비트는 캐시의 set를 찾는 인덱스이다
• set를 찾고, 그 set 내에서 해당하는 tag를 가진 line을 찾는다
• 주소의 뒤 b비트는 블록 내에서의 오프셋이다
• 왜 index로 중간 비트들을 사용하는가?
• 상위 비트가 인덱스로 사용된다면, 동일한 연속적인 메모리 블록들은 동일한 캐시 집합으로 매핑될 것이다
• 캐시는 어떤 특정 순간에 한 개의 블록 크기의
38. 배경지식 -Cache
• 캐시 – 직접 매핑 캐시(Direct mapped cache)
• 한 set에 한 line만 갖는 캐시
• 오른쪽 그림은 한 블록의 크기가 8바이트라 가정한 그림이다
• Set을 찾고, tag를 비교하고, 유효한지 체크한다.
• 모든 조건에 맞는 것이 있다면 cache hit, 없다면 cache miss이다
39. 배경지식 -Cache
• 캐시 – 집합 결합성 캐시 (E-way Set Associative Cache)
• 한 set에 여러 라인을 갖는 캐시
• 오른쪽 그림은 한 블록의 크기가 8바이트이고, 2line을 가지는 캐시를 가정한 그림이다
• 먼저 Set을 찾고, 두 line 중 어떤 line에 속하는지 tag를 이용하여 찾는다.
• 두 line 어느 곳에도 없다면 cache miss
• tag를 이용하여 찾을 때, 한 번에 병렬적으로 찾는다
• 두 line을 한 번에 검색한다
40. 배경지식 -Cache
• 캐시 – 완전 결합성 캐시 (Set Associative Cache)
• 하나의 set만 있다(=set 개념이 없다)
• tag를 병렬적으로 검색한다
• 더 비싸고, 만들기 어렵고, 빠르다
• 주로TLB와 같이 작은 캐시에 이용된다
41. 배경지식 -Cache
• 캐시 –결합성 캐시(associative cache)
• 오른쪽은 set associative cache이다
• 어떻게 병렬적으로 체크하는가?
• 논리회로가 병렬적으로 처리하도록 되어있다
• 이런 메모리는 상대적으로 비싸다
• 그리고 빠르다
• set associative cache는 집합 단위로 병렬 검색을 한다
• 색깔이 있는 부분이 한 집합
• fully associative cache는 전체를 병렬 검색을 한다
• 더욱 비싸지만 더욱 빠름
42. 배경지식 -Cache
• 캐시 –Cache miss
• 검색한 위치에 일치하는 캐시가 없을 시
• 메모리에서 데이터를 찾는다
• 찾은 데이터를 캐시에 올린다(블록단위로)
• 만약 자리가 없다면 기존 라인 하나를 내보내고 들어간다
• 내보낸 라인의 내용이 변경된 적이 있다면 (dirty bit가 체크되어 있다면) 메모리 내용을 변경된 내용으로 수정한다
• 찾은 데이터를 이용하여 명령을 실행한다
43. 배경지식 -Cache
• 캐시 – 쓰기와 관련된 이슈
• 메모리에 쓰기 연산을 했을 때, 캐시의 내용 뿐만 아니라 메모리의 내용도 바뀌어야 한다
• 언제 메모리의 내용을 변경할까?가 이슈이다
• write-through
• 쓰기 연산을 하면 Cache 뿐만 아니라 메모리에도 바로 cache의 내용을 복사해 주는 방식
• 단순하다는 장점이 있다
• 쓰기 연산마다 메모리에 접근해야 한다는 단점이 있다
• write-back
• 쓰기 연산을 하면 Cache의 내용만 수정한다
• Cache의 modified bit(dirty bit이라고도 불림)을 1로 설정한다
• 해당 Cache line이 내보내질 때 cache의 내용을 메모리에 복사해 준다
• 쓰기 연산마다 메모리에 접근할 필요가 없다는 장점이 있다
• 복잡하고, dirty bit를 위한 필드가 필요하다는 단점이 있다
• 또한 쓰기 미스를 어떻게 다룰까? 가 이슈이다 (쓰기를 했을 때, 캐시에 없는 경우)
• write-allocate
• 메모리로부터 가져온 후 캐시를 갱신(write)
• 공간 지역성을 활용한다는 장점이 있다
• 모든 미스들은 다음 하위 레벨에서의 캐시로 블록 전송을 발생한다(하위 레벨 메모리에서도 miss가 날 경우 더욱 오래 기다려야 한다. miss가 전파된다)
• no-write-allocate
• 캐시를 통과하고 바로 다음 하위 레벨에 써 준다
• write-through는 전형적으로 no-write-allocate과 함께 쓰이고, write-back은 전형적으로 write-allocate과 함께 쓰인다.
44. 메모리 추상화 – 가상 메모리
• TLB(Translation Lookaside Buffer)
• 연관 메모리(associative memory)라고도 함
• 보통 fully associative memory
• 해당하는 페이지가 있는지 병렬적으로 검색한다
• 페이지 테이블만을 위한 캐시
• 대부분의 프로그램들이 적은 개수의 페이지들을 집중적으로 참조하는 경향이 있다는 관찰에 기반을 둔다.
• 지역성
• 해당 페이지가 수정되면 Modified 비트를 1로 설정한다
• TLB에서 modified 비트가 1이라면TLB에서 나갈 때 메모리에 있는 페이지 테이블의 modified 비트를 1로 설정해준다
• TLB에서 나가기 전까지는 페이지가 수정되어도 메모리에 있는 페이지 테이블의 modified 비트를 설정하기 위해 페이지 테이블에 접근할 필
요가 없다
• write-back
MMU에서 이용하는
cache
45. 메모리 추상화 – 가상 메모리
• TLB(Translation Lookaside Buffer)
• TLB에 찾고자 하는 페이지 테이블 엔트리(PTE)가 없다면TLB miss가 난다.
• TLB miss가 나면 메모리의 페이지 테이블에 접근한다.
• 찾고자 했던 PTE를 찾고, 방금 찾은 PTE를TLB에 올린다.
• 올리기 전,TLB에 자리가 없다면TLB에 올라온 PTE 하나를 내리고 그 자리에 새로운 PTE를 올린다.
• TLB의 modified 비트가 설정되어 있다면 페이지 테이블에서 해당 PTE의 modified 비트를 체크한다.
• context switching 시 이TLB도 비워주어야 한다
• 비워진TLB는 교체된 프로세스의 페이지 테이블을 위한 정보로 채워진다
• TLB가 채워질 때까지는 cache miss가 나므로, 처음 한동안은 성능이 떨어질 것임
46. 메모리 추상화 – 가상 메모리
• 가상 메모리를 이용하는 시스템에서의 메모리 참조 과정
47. 메모리 추상화 – 가상 메모리
• 페이지 테이블 종류
• 기존 32비트 시스템에서는 페이지 테이블의 크기가 수용 할 만 했다. 64비트에 들어오며 가상 메모리의 크기가 너무나도 커졌다.
• 페이지 테이블의 크기도 커졌다
• 따라서 큰 가상 공간을 효과적으로 관리하는 방법이 필요해졌다.
• 여러 종류의 페이지 테이블이 생겼다
• 다단계 페이지 테이블(multilevel page table)
• 해시 페이지 테이블(hash page table)
• 역 페이지 테이블(inverted page table)
• ..
48. 메모리 추상화 – 가상 메모리
• 페이지 테이블 종류
• 다단계 페이지 테이블(multilevel page table)
• Ex) 지구의 지역을 multilevel로 분류해 보자
• 대륙 단위 – 아시아, 북아메리카, 남아메리카, 유럽 ...
• 아시아는 여러 국가들로 이루어져 있다
• 한국, 중국, 일본...
• 한국은 여러 지역으로 이루어져 있다
• 서울, 경기 ...
• 큰 범위로 자르고, 그 안에서 작은 범위로 잘라서, 층별로 관리하는 것을 multi level 이라고 한다
• 페이지를 여러 레벨로 나누어 관리한다
• Ex) 가상 주소 10 000000001 000000010 000000000100
• page-directory-pointer table에서 2번 엔트리에 적힌 page directory의 포인터를 얻는다
• 해당 포인터가 가리키는 page directory에서 1 번 엔트리에 적힌 page table의 포인터를 얻는다
• 해당 포인터가 가리키는 page table에서 2번 엔트리에 적힌 페이지 프레임의 번호를 얻는다
• 해당 페이지 프레임에서 오프셋 4에 위치한 데이터를 얻는다
• 다단계 페이지 테이블의 핵심은 모든 페이지 테이블을 항상 메모리에 유지할 필요가 없다는 것
• 특히 주소 공간에 비어 있는 부분은 전혀 유지할 필요가 없다
• 3단계 이상일 경우 복잡도가 커져서 가치가 떨어진다
49. 메모리 추상화 – 가상 메모리
• 페이지 테이블 종류
• 해시 페이지 테이블(hash page table)
• 페이지 번호를 해시 function에 넣는다.
• 얻은 해시 값을 인덱스삼아 hash table에서 리스트의 배열에 접근한다
• 리스트의 시작 부분을 모아 놓은 배열
• 페이지 번호를 비교하며 리스트를 순회한다
• 원하는 페이지가 나올 때까지
• 장점
• 상대적으로 작은 페이지 테이블만 유지한다
• 실제로 이용하는 가상 메모리 영역의 페이지 테이블만을 유지한다
50. 메모리 추상화 – 가상 메모리
• 페이지 테이블 종류
• 역 페이지 테이블(inverted page table)
• 지금까지는 각 프로세스가 페이지 테이블을 가지고 있었다.
• 각 페이지 테이블에는 해당 페이지가 어느 페이지 프레임에 올라와 있는지를 기록했다
• 이와 반대로 생각해 보자
• 페이지 테이블의 각 인덱스는 페이지 프레임 번호에 해당한다
• 각 페이지 프레임에 어떤 프레임이 있는지를 저장한다
• logical address와 PID 를 함께 봄
51. 메모리 추상화 – 가상 메모리
• 페이지 테이블 종류
• 역 페이지 테이블(inverted page table)
• 일반적으로 hash table과 함께 적용된다
• 찾기 쉽도록
• PID와 페이지 번호를 hash에 넣은 결과값을 인덱스로 하여 리스트의 배열에 접근한다
• 리스트를 순회하며 PID와 페이지 번호가 일치하는 노드를 찾는다
• 장점
• 물리 메모리 크기의 페이지 테이블 하나만 있어도 된다
• 단점
• 페이지 폴트 뿐만 아니라 모든 메모리 참조 시 페이지 테이블에 접근해야 한다
• 검색에 시간이 든다
• 그래서 해시 테이블과 함께 이용함
+PID
PID
52. 메모리 추상화 – 가상 메모리
• 페이지 교체 알고리즘
• 페이지 폴트가 발생하면 물리 메모리에서 어떤 페이지를 내보낼지 선택해야 한다.
• 최적 페이지 교체 알고리즘
• NRU(Not Recently Used) 페이지 교체 알고리즘
• FIFO(First In First Out) 페이지 교체 알고리즘
• Second-Chance 페이지 교체 알고리즘
• 클록 페이지 교체 알고리즘
• LRU(Least Recently Used)알고리즘
• Work set 페이지 교체 알고리즘
• WSClock 페이지 교체 알고리즘
• ...
53. 메모리 추상화 – 가상 메모리
• 페이지 교체 알고리즘
• 최적 페이지 교체 알고리즘
• 이상의 알고리즘
• 최고 성능, 목표
• 다른 알고리즘의 성능을 평가할 때만 쓰임
• 가장 늦게 참조될 페이지를 교체한다
• 8백만 명령어 뒤에 참조되는 페이지와 6백만 명령어 뒤에 참조되는 페이지가 메모리에 있다면, 전자를 내린다.
• 단점
• 구현이 불가능하다
54. 메모리 추상화 – 가상 메모리
• 페이지 교체 알고리즘
• NRU(Not Recently Used) 페이지 교체 알고리즘
• 페이지를 4개의 그룹으로 분류
• R
• referenced 비트
• 해당 페이지가 이용될 때 1로 설정해준다
• OS가 주기적으로 0으로 초기화 해 준다
• 주기동안 이용된 적이 있다면 1, 없다면 0
• M
• modified 비트
• 페이지의 내용이 수정된 적이 있는지 표시
• 페이지가 수정되었다면 메모리에서 내릴 때 변경 사항을 적용해야 한다
• 페이지를 내리는 데 오래 걸린다
• 주기동안 이용된 적도, 수정된 적도 없는 페이지는 class 0
• 주기동안 이용된 적은 없지만 수정된 적은 있는 페이지는 class 1
• 주기동안 이용된 적은 있지만 수정되지는 않은 페이지는 class 2
• 주기동안 이용된 적도 있고 수정된 적도 있는 페이지는 class 3
• 0, 1, 2, 3 클래스 순서로 페이지를 내린다
55. 메모리 추상화 – 가상 메모리
• 페이지 교체 알고리즘
• FIFO(First In First Out) 페이지 교체 알고리즘
• 먼저 올라간 페이지를 먼저 내림
• 단점
• 먼저 올렸지만 자주 쓰이는 페이지가 내보내질 수 있음
• Second-Chance 페이지 교체 알고리즘
• FIFO 알고리즘을 보완한 것
• 기본적으로 FIFO
• 큐에 있는 페이지 중, 맨 먼저 들어온 페이지의 R비트가 1이면 큐의 맨 뒤로 보냄
• R비트를 0으로 초기화
• 마치 가장 최근에 사용한 것과 같이 됨
• 한 번 더 기회를 주는 것(second chance)
• 그 다음으로 오래된 페이지를 살펴봄
• 모든 페이지의 R이 1이라면, 한바퀴 돌아 모두 R이 0이 된 채로 처음 상태가 됨 -> 원래 맨 앞에 있던 페이지가 교체됨
56. 메모리 추상화 – 가상 메모리
• 페이지 교체 알고리즘
• 클록 페이지 교체 알고리즘
• Second-chance 알고리즘을 보완한 것
• Second-chance는 큐의 맨 앞에 있는 것의 R비트가 1이라면 큐의 맨 뒤로 보내야 한다
• 괜히 번거로우니 보완하여 원형 큐를 만들어 이용
• 화살표가 가리키는 것이 가장 오래된 페이지
• R비트가 1이리면 단지 다음 것을 가리키게 하면 된다
• R비트가 0이라 교체해야 한다면 그 자리에 새 페이지를 넣고, 화살표는 다음 것을 가리키도록 하면 된다
57. 메모리 추상화 – 가상 메모리
• 페이지 교체 알고리즘
• LRU(Least Recently Used)알고리즘
• 최근에 가장 적게 이용된 페이지를 교체한다
• 이용됐냐 안 됐냐 뿐만이 아니라 얼마나 자주 이용됐는 가도 고려하는 알고리즘
• NRU는 LRU의 가장 대충 만든 형태이다
59. 메모리 추상화 – 가상 메모리
• 스래싱(Thrashing)
• 계속 페이지 폴트가 나서 정상적으로 프로그램을 실행할 수 없는 것
• 원인
• 물리 메모리가 너무 작음
• 너무 많은 프로그램들을 동시에 실행했음
• 올려 둔 페이지를 자꾸 다른 프로세스가 내려놓으니까
• 해결법
• 더 큰 메모리를 산다
• 다른 프로그램을 스왑해 둔다
• 프로세스에게 CPU를 할당해주는 시간을 늘린다
• 더 오래 한 프로세스를 실행해 줌
• context switching되어 다른 프로세스가 내 페이지를 내리는 상황을 줄임
60. 메모리 추상화 – 가상 메모리
• 주요 이슈
• 지역/전역 할당 정책
• 페이지를 내릴 때, 자신이 이용하는 페이지 중에서 내릴 것인가, 남의 것을 포함해서 내릴 것인가
• 부하 제어
• 스래싱 예방
• 페이지 크기
• 너무 크면 internal fragment, 너무 작으면 스래싱이 일어날 수 있다
• 적절한 페이지 크기를 결정해야 한다
• 백킹 스토어
• 교체된 페이지들을 저장해 둘 공간
• 어떤 방식으로 저장할지
• ...
61. 메모리 추상화 – 세그멘테이션
• 세그멘테이션
• 지금까지 이야기한 가상 메모리는 1차원 적이었다
• 가상 주소는 0부터 시작하여 특정 크기만큼 자라며, 주소는 순차적으로 증가한다
• 하지만 두 개 또는 그 이상의 서로 분리된 가상 주소 공간을 갖는 것이 하나의 주소 공간보다 더 편리한 경우가 많다
62. 메모리 추상화 – 세그멘테이션
• 세그멘테이션
• 위 그림은 어떤 컴파일러 프로그램이 이용하고 있는 가상 주소 공간이다
• 1차원적 가상 주소 공간을 이용한다면 충돌할 수 있다
• 아래 그림은 세그먼트를 나눈 가상 주소 공간이다
• 각 세그먼트마다 독립적인 가상 주소 공간을 갖는다
• 충돌이 나지 않는다
• 각자의 가상 주소 공간은 동적으로 증가, 감소가 가능하다
• Ex) 스택이 자라 더 많은 주소 공간을 필요로 할 때 그냥 증가시키면 된다
• 세그먼트의 최대 크기 이상으로는 자랄 수 없다(주소 길이 한정)
• 세그멘테이션을 구현하기 위해서는 2차원적인 주소가 필요하다
• <세그먼트 번호 : 가상 주소> 쌍이 필요하다
63. 메모리 추상화 – 세그멘테이션
• 세그멘테이션
• 각 세그먼트를 따로 관리한다
• Ex) x86의 segment register
• 하지만 사실 더이상 이용하지 않음
• 호환을 위해 있음
• 장점
• 공유가 쉽다
• 공유용 세그먼트를 만들면 되니까
• 권한을 나누기 쉽다
• 코드 세그먼트에만 실행 권한을 주는 등
• 단점
• 순수 세그먼트는 세그먼트 단위로 관리하기 때문에 External fragment가 생김
64. 메모리 추상화 – 세그멘테이션
• 페이징 vs 세그멘테이션
고려 사항 페이징 세그멘테이션
프로그래머가 이 기술이 사용되는 것
을 알아야 하는가?
No Yes
얼마나 많은 선형 주소를 지원하는가? 1 다수
전체 주소 공간의 크기가 물리 메모리
보다 클 수 있는가?
Yes Yes
함수와 데이터가 구분되고 분리되어
보호되는가?
No Yes
크기가 자주 변하는 테이블을 적절하
게 지원하는가?
No Yes
공유가 쉽게 되는가? No Yes
이 기술이 발명된 이유는? 물리 메모리를 더 구입하지 않고 더 큰
선형 주소를 제공하기 위하여
프로그램을 논리적인 작은 주소 공간
들로 구분하고, 공유/보호하기 위하여
65. 메모리 추상화 – 세그멘테이션
• 세그멘테이션 + 페이징
• 세그먼트의 크기가 크다면 이를 모두 메모리에 적재하는 것은 어렵다(불가능할 수도 있다)
• 그렇다면 세그먼트에 페이징 개념을 도입하자
• 각 세그먼트를 위한 페이지 테이블이 존재
• 각 세그먼트를 관리하기 위한 descriptor가 있다
• 아래가 세그먼트 디스크립터의 구조
67. 참고 사이트
• 메모리 관리 방법들 설명
• https://www2.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/8_MainMemory.html
• http://cse.csusb.edu/tongyu/courses/cs460/notes/memory.php
• 스래싱
• http://cokooni.tistory.com/15
68. 참고 서적
• 운영체제론 3rd edition
• 밑 책 번역본
• chapter 3 메모리 관리
• Modern Operating System 4th edition
• 전공 교재
• chapter 3 Memory Management
• 컴퓨터 시스템
• 9장 가상메모리
• 뇌를 자극하는 윈도우즈 시스템 프로그래밍
• chapter 16 컴퓨터 구조에 대한 네 번째 이야기