2020-11-27 운영체제 기초(12) 메모리 할당
Allocation of Physical Memory
- 메모리는 OS상주영역과 사용자 프로세스 영역으로 나누어진다.
- OS상주 영역 : 낮은 주소를 사용
- 사용자 프로세스 영역 : 높은 주소 영역 사용
- 사용자 프로세스의 영역할당
- 연속할당(Contiguous allocation) : 각각의 프로세스가 메모리의 연속적인 공간에 적재
- fixed partition allocation
- variable partition allocation
- 비연속할당(Noncontiguout allocation) : 하나의 프로세스가 메모리의 여러 영역에 분산되어 올라간다.
- paing
- segmentation
- paged segmentation
- 연속할당(Contiguous allocation) : 각각의 프로세스가 메모리의 연속적인 공간에 적재
연속할당
- 연속할당도 고정분할 방식과 가변분할 방식으로 나눈다.
- 낭비되는 조각을 외부조각과 내부조각으로 부른다.
- 외부조각(external fragmentation) : 프로그램 크기보다 분할의 크기가 작은 경우, 아무 프로그램에도 배정되지 않은 빈공간인데도 프로그램이 올라갈 수 없는 작은 분할
- 내부조각(Internal fragmentation) : 프로그램의 크기보다 분할의 크기가 큰 경우, 하나의 분할 내부에서 사용되지 않는 메모리조각, 특정 프로그램이 배정되었지만 사용되지 않은 공간
- 고정분할(Fixed Partition)방식
- 물리적 메모리를 몇개의 영구적 분할(partition)으로 나눈다.
- 분할의 크기가 모두 동일한 방식과 서로 다른 방식이 존재
- 분할당 하나의 프로그램 적재
- 융통성이 없다 => 동시에 메모리에 로드되는 프로그램수가 고정, 최대 수행 가능 프로그램 제한
- 내부조각, 외부조각 둘 다 발생
- 가변분할 방식
- 프로그램의 크기를 고려해서 할당
- 분할의 크기, 갯수가 동적으로 변한다.
- 기술적 관리 필요
- external fragmentation발생
가변분할 방식을 사용하게 되면 프로그램 실행과 종료 사이에 Hole이 여러개 생긴다. 생긴 hole중에 어떤 hole에 프로세스를 할당할지 Dynamic Storage-Allocation Problem을 통해 찾는다.
- First-fit : size가 n이상인 것 중에 최초로 찾아지는 hole에 할당
- best-fit : size가 n이상인 가장 작은 hole을 찾아서 할당
- hole들의 리스트가 크기순으로 정렬되지 않을 경우 모든 hole의 리스트를 탐색
- 많은 수의 아주 작은 hole들이 생성
- worst-fit : 가장 큰 hole에 할당, 모든 리스트를 탐색, 상대적으로 아주 큰 hole들이 생성
- first-fit과 best-fit이 worst-fit보다 속도와 공간 측면에서 효과적이다.
-
hole들을 모아서 compaction을 할수도 있다.
- compaction : 외부조각 문제를 해결하는 방법
- 사용중인 메모리 영역을 한군데로 몰고, hole들을 다른 한곳으로 몰아서 큰 block을 만든다.
- 매우 비용이 많이 든다 => 바인딩을 다 관리해야되서
- 최소한의 메모리 이동으로 compaction을 하는 방법 => 매우 복잡한 문제
- compaction은 프로세스의 주소가 실행 시간에 동적으로 재배치 가능한 경우에만 수행될 수 있다.
실제 컴퓨터 시스템은 불연속할당 방식을 사용한다
불연속할당
- paging : 프로세스의 가상 메모리를 동일한 사이즈의 페이지로 나눈다
- 가상메모리의 내용이 페이지 단위로 불연속하게 저장된다
- 일부는 backing store에 일부는 물리메모리에 저장
- Basic method : 물리 메모리를 동일한 크기의 frame으로 나눈다.
- 논리 주소를 동일 크기의 page로 나눈다(frame과 같은 크기)
- 모든 가용 frame 들을 관리
- 페이지 테이블을 사용하여 논리 주소를 물리주소로 변환
- External Fragmentation 발생안하고, internal fragmentation 발생가능
Paging
- 논리적인 메모리를 동일한 크기의 page로 자르고 각 페이지를 물리메모리에 비어있는 위치가 있으면 올린다.
- 페이지 테이블을 사용. 각각의 논리적인 페이지들이 메모리 어디에 올라가있는지 확인. 논리적인 페이지의 갯수만큼 페이지 테이블이 생성
- 물리메모리에서 페이지가 들어가는 공간을 페이지프레임이라고 부르고, 프레임은 페이지와 동일한 크기
- Page Table : main memory에 상주한다.
- page-table base register(PTBR)가 page table을 가리킨다
- page-table length register(PTLR)이 테이블의 크기를 보관
- 모든 메모리 접근 연산에는 2번의 메모리 접근이 필요 => 페이지테이블 1번, 실제 data 1번
- 속도향상을 위해 associative register 혹은 translation look-aside buffer(TLB)라 불리는 고속의 캐시를 사용한다.
- TLB는 페이지테이블에서 자주 접근되는 페이지들을 캐싱한다. 일부만 담고 있다.
- 메모리에 접근할때 우선 TLB부터 확인. TLB에 있으면 TLB를 통해 접근하고, TLB에 없으면 페이지 테이블을 통해 접근한다. 이때 TLB 전체를 탐색한다. 시간이 오래걸리기때문에 TLB는 병렬 탐색이 가능한 associative register를 함께 사용한다.
- 페이지테이블은 각각의 프로세스마다 존재
- Associative Register : TLB에서 병렬 탐색을 가능하게 한다.
- Address translation : 페이지 테이블의 일부가 associative register에 보관되있다.
- 만약 page #이 associative register에 보관되있으면 곧바로 frame #을 얻는다 그렇지 않으면 메인메모리에 있는 페이지 테이블로 부터 frame #을 얻는다
- TLB는 context switch 때 flush(오래된 엔트리를 비운다)
Effective Access Time
- associative register에서 찾는 시간e, 메인메모리에 접근하는 시간 , tlb로 주소변환이 되는 비율 a
- 메모리접근 시간 : (1+e)a + (2+e)(1-a) => 2+e-a
Two-Level Page table
- 2단계 페이지테이블을 사용하면 속도가 줄어들지 않고, 공간이 줄어든다.
- 현대 컴퓨터는 address space가 크다. 32-bit address사용시 2^32 => 4gb 주소공간이 필요
- 32비트 주소를 사용하면 각 프로그램은 최대 4GB만큼 가상메모리를 쓸 수 있다.
- page size가 4kb일시 1M개의 페이지 테이블 엔트리가 필요
- 각 페이지 엔트리가 4byte라면 프로세스당 4mb의 페이지 테이블이 필요하다. 하지만 4g의 주소공간 중 일부만 쓰기 때문에 페이지 테이블 공간이 심하게 낭비된다.
- 페이지 테이블 자체를 페이지로 구성하고, 사용되지 않는 주소공간에 대한 outer page table의 엔트리 값을 null로 처리한다.
-
- 논리주소에서 20bit는 page number, 12bit는 page offset으로 구성
- 페이지 테이블 자체가 페이지로 구성되기 때문에 pagenumber는 10bit의 page number와 10bit의 page offset으로 구성된다.
- p1은 outer table의 index이고, p2는 outter page table에서의 변위.
Written on November 27, 2020