프로그램이 컴파일 되면, 주소공간을 할당받는다. 이는 실제 메모리에 올라간것이 아니다.
저번에 메모리에서 설명했듯, 물리적으로 바로 올라가는것이 아닌 가상 메모리에 한번 탑재된다.
이때 가지는 주소를 Logical address(virtual address)라고 한다.
이후 메모리에 탑재되면 그제서야 Physical address를 부여받는다.
CPU는 물리적 메모리가 아닌, Logical address를 바라본다!
OS에서 메모리 주소를 바인딩하는 방법엔 3가지가 있다.
요즘은 대부분 런타임 바인딩을 사용한다!
런타임 바인딩이 되려면, 하드웨어적 지원이 필요하다.
동적으로 메모리를 관리하는 기법들을 소개하겠다.
다음 목차에 나올 Dynamic-Memory-Allocation을 포괄하는 개념같다.
요즘은 운영체제가 dynamic loading을 지원한다.
언뜻 보면 dynamic loading과 비슷한 개념이다.
하지만 메모리의 크기가 아주 작을때 유용하다. 또한 운영체제나 라이브러리의 지원이 없기때문에 코딩을 통해 메모리를 관리해야한다.
preempitve와 비슷하다. 프로세스를 일시적으로 보조기억장치로 쫓아낸다.
swapping은 저~번 시간에 설명한 중기 스케줄러에서 쓰이는 swap개념과 일치한다.
swapping을 효율적으로 사용하려면, run time바인딩이 좋다.
다른 두가지 바인딩은 쫓아냈다 불러올때, 같은 주소에 올려야 함.
메모리는 보통 두영역으로 나뉘어서 사용.
OS공간과 사용자 공간. OS공간은 낮은주소, 사용자공간은 높은주소를 쓴다.
프로세스는 메모리에 이렇게 적재된다.
실제론, 이렇게 관리되진 않는다. 보통 잘개 쪼개서 올라감.
사용자 영역에서 프로세스영역을 할당하는 법은 두가지로 나뉜다.
1. Contiguous allocation (연속, 인접 할당) : 프로세스를 연속된 메모리 공간에 적재하는것이다.
2. Noncontiguous allocation (불연속, 불인접 할당) : 프로세스를 연속된 메모리 공간이 아닌, 여러 영역에 분산해서 올리는 기법이다.
연속적으로 탑재하니까, 메모리에 적재된 프로세스가 빠져나가면 Hole이 생긴다.
운영체제는 할당공간과 이 Hole을 기억해야한다.
=> 다음 프로세스의 크기가 Hole에 맞으면 넣어야함
Hole엔 두가지종류의 Fragmentation(단편화)가 존재한다.
연속 할당기법의 가변 분할 기법에서 어떤 hole에 프로세스가 탑재되어야 하는지를 찾는 알고리즘이다.
연속 할당 기법에서 외부 단편화 문제를 해결하는 방법 중 하나다.
사용중인 메모리 영역을 한군데로 몰아, hole을 작게, 작게 만드는 것이다!
하지만 비용이 많이 든다. 또한, 프로세스의 주소가 런타임에 동적재배치(런타임 바인딩)가 가능해야한다.
프로세스를 메모리에 불연속 할당하는 기법엔 세가지가 있다.
1. Paging : 프로세스를 구성하는 주소공간을 페이지(잘게)쪼개 적재함. 같은 크기를 가짐.
2. Segment : 페이징처럼 쪼개지만, 크기가 각각 다르다.
3. Paged Segmentaion : ?
페이징 기법은 잘개 쪼개는것. 잘개 쪼겐 프로세스의 위치를 알기 위해선, 탑재하기 전에 페이지와 실제 주소를 매핑해야한다.
아래는 조금 더 자세히 설명한 페이징 기법의 실행 순서다.
페이징 기법에서 사용하는 page table은 결국 각 프로세스 별로 가져야한다.
MMU에서처럼 레지스터에 적재할 순 없다. 용량이 너무 크기 때문이다.
따라서 page table은 메모리에 적재한다.
=> 한번 접근하려면, 두번의 메모리 접근을 거쳐야함
MMU에서 사용한 두가지의 레지스터를, page table주소와 크기를 가리키는 레지스터로 바꿔서 사용한다.
=> 두번 접근해야하니까, 속도향상을 위해 하드웨어 캐시를 사용한다
(빈번히 참조되는 page table을 캐시해놓음)
그걸 바로 TLB라고 한다.
현대의 컴퓨터에서 돌아가는 프로세스(프로그램)은 메모리 사용 용량이 큼.
따라서 page table을 메모리에 넣게되면, 공간 낭비가 심해진다.
=> page table도 page화 시켜서 공간 낭비를 최소화 함.
two-level page table은 아래와 같은 방식으로 작동한다.
1. 바깥 page table주소를 찾는다.
2. 거기서 내부 page table주소를 찾는다.
3. 물리적 주소를 찾는다.
어떻게 보면 외부 테이블 => 내부 테이블 과정만 하나 추가되서 간단하다.
반효경님의 운영체제 강의를 듣다보니 의문이 생겼다. 명확히 설명 안해주고 넘어가신 부분이라...나 혼자 찾아봄
물리적 메모리를 나눈 단위가 F(frame). 가상메모리를 나눈 단계가(page)
그래, 생각해보면 물리적 메모리를 나누는게 아니라, 가상메모리를 나눠서 탑재하는거다.
page offset이란?
=> page offset을 설명하려면, page entry를 자세히 짚고 넘어가야 한다.
보통 하나의 page는 4KB의 크기를 가진다. 즉, 이는 한덩어리.
4Kb는 2의 12승. 따라서 page는 메모리에서 2의 12승만큼의 주소를 가진다.
=> 결국, 하나의 page 내부 주소를 구분지으려면 2의 12승만큼의(12bit)offset이 필요함.
page entry란?
=> page 내부에 있는 최소 단위.
page table은 어디있지?
=> 메모리 안에 있다. 그리고 MMU안에 page table 주소를 가리키는 레지스터가 존재(포인터).
메모리 한칸은 1byte이다, 32bit면 메모리 하나당 32bit === 4byte.
페이지 크기가 4kb고, 메모리 크기가 256kb인 시스템이 있다. 최대 페이지 개수는?
=> 4kb * 64 = 256kb. 따라서 64개
이 페이지의 offset 크기는?
=> 4kb는 약 2^12. 따라서 12비트 or 메모리 크기 2^18에서 page의 최대 갯수인 2^6을 나눠주면 된다
메모리 주소를 표현하는데 필요한 크기
=> 256Kb는 약 2^18 byte이다. 따라서 18비트만 있으면, 256kb메모리의 모든 주소를 표현할 수 있다.
이번 시간에는 physical memory와 virtual memory, 그리고 메모리 관리에 대해 배웠다.