[OS] 메모리 관리_방통대 교재 정리
#####. 메모리 관리
###. 메모리 관리
#. 메모리(주기억장치, main memory)의 구성과 관리는 운영체제의 설계에 가장 중요한 영향을 미치는 요인 중 하나로 실제로 시스템 성능은 사용 가능한 메모리의 용량과 프로세스 처리 중 메모리를 얼마나 효과적으로 사용하는가와 관련이 크다.
###. 프로세스와 메모리
#. 프로세스가 동작하기 위해서는 CPU, 메모리, 입출력, 파일 등의 자원을 할당받아야 하는데, 그중에서도 CPU와 메모리는 필수요소이다. 프로세스가 실행상테에서 하는 동작은 프로그램 카운터를 참조하여 수행될 명령을 읽어와서 CPU의 해당 명령을 수행하는 것인데, 이때 프로그램 카운터가 가리키는 주소라는 것이 결국 메모리상의 특정 위치가 되는 것이다.
#. 메모리(main memory)는 데이터나 프로그램, 프로세스를 메모리에 할당해도 모자란 경우 SSD 같은 보조 기억장치를 활용하여 필요한 순간만 메로리로 가져오고 그렇지 않은 떄는 다시 보조 기억장치로 옮기는 형태로 사용한다.
#. 보조기억장치는 일반적으로 메모리에 비해 접근 속도가 느리지만 저렴하고 용량이 크다.
#. 캐시 메모리는 메모리에 비해 비싸고 용량이 작지만 빠르다.
$$.참고) 주기억장치, 보조기억장치를 헷갈려하는 사람이 많은데, 주기억장치란 CPU가 주로 쓰는 기억장치이고, 보조기억장치란 주기억장치가 모자랄때 보조로 쓰는 기억장치라고 생각하면 되겠다. SSD(or hardDisk)가 파일을 저장해서 기억장치라는 생각은 버리도록하자.
#. 기억장치의 계층구조
- CPU (레지스터) < = > 캐시 메모리 < = > 메모리 < = > 보조기억장치
- 왼쪽부터 빠른 순서
###. 단일 프로그래밍 환경
#. 초기의 시스템은 오직 하나의 프로세스만 메모리를 전용으로 사용했기 때문에 나머지 사용자는 기다려야 했다.
#. 이때 프로세스는 하나의 연속된 블록으로 메모리에 할당되는 연속 메모리 할당 (continuous memery allocaion) 방식을 이용했다. 이는 단순하며 이해하기 쉽지만 메모리의 용량을 초과하는 프로세스는 실행될 수 없다. 또한 지속적으로 사용되지 않는 프로세스도 메모리에 계속 적재되어 있어야 하므로 메모리 낭비가 심하고, 한 명의 사용자가 메모리를 전용하므로 주변장치 등 자원의 낭비가 심하다. 즉, CPU 작업 중에는 입출력 장치가 대기하고, 입출력을 수행하는 중에는 CPU가 대기해야한다.
###. 다중 프로그래밍 환경
#. 다중 프로그래밍 (multiprogramming)이란 여러개의 프로세스가 메모리에 동시에 적재되는 것으로, 현재 실행중인 프로세스가 입출력대기를 해야 한다면 실행을 기다리고 있는 다른 프로세스에 CPU를 할당할 수 있다.
#. 처음 프로세스 1이 CPU를 이용중일 떄는 프로세스2가 준비 상태로 기다리지만 프로세스1이 입출력 대기를 하는 동안 프로세스 2가 CPU를 이용하게 되고 입출력기 끝난 프로세스 1이 준비상태로 기다린다. 이후 프로세스2가 입출력 대기를 하는 동안 다시 프로세스 1이 CPU를 이용하게 된다. 결국 CPU 연산과 입출력을 동시에 함으로써 CPU 이용도와 시스템 처리량이 증가하게 된다.
###. 메모리 분할
#. 메모리 분할은 여러 프로세스를 메모리에 적재하기 위해 고안된 방법으로, 하나의 분할에 하나의 프로세스가 적재되는 방식이다. 이는 다시 고정 분할 방식과 동적 분할 방식으로 나눌 수 있다.
#. 고정 분할
- 고정 분할은 메모리를 여러개의 고정된 크기의 영역으로 분할하는 방식이다.
- 분할된 영역에서 프로세스를 배치하는 방법은 2가지
- 첫번째
: 각 분할 영역마다 큐를 두고 큐에 들어온 프로세스는 해당 분할영역에만 적재되도록 하는 것
: 이는 프로그램 컴파일 시 프로그램 내의 주소를 절대주소로 번역하여 해당되는 특정 분할영역에만 적재되어야하는 방식
: 단점 : 운영체제의 구현은 용이하나 큐가 빈 분할이 있더도 다른 큐의 프로세스는 적재할 수 없어 효율성이 좋지 않다.
- 두번째
: 메모리 전체에 하나의 큐만 두고 모든 프로세스를 하나의 작업 큐에 넣어서 어느 분할에서든지 실행 가능하게 하는것
- 프로그램 컴퍼일 시 프로그램 내의 주소를 상대주소로 번역하여 어디든 적재가 가능한 방식
- 이때 분할에 적재될 작업의 주소 지정 등의 문제는 재배치 컴파일러, 어셈블러, 로더 등으로 해결
- 이 방법은 절대번역 및 적재보다 기억장치의 낭비를 줄이지만 재배치 가능 번역기와 로더는 절대번역기보다 더 복잡하다.
- 고정 분할 방식에서 프로세스의 크기가 적재된 분할영역의 크기보다 작아서 분할 영역 내에 남게 되는 메모리는 경국 낭비되는 부분이 된다.
- 이를 내부 단편화(fragmentation) 이라고 한다.
#. 동적 분할
- 동적 분할은 메모리의 분할경계가 고정되지 않고 각 프로세스에 필요한 만큼의 메모리만 할당하는 방식
- 필요한 시점에 필요한 만큼의 메모리만 할당받기 떄문에 고정 분할에서 발생하는 내부 단편화의 문제는 일어나지 않는다.
- 외부 단편화 문제가 발생!
- 외부 단편화 : 메모리의 할당과 반환이 계속 반복됨에 따라 작은 크기의 공백 메모리 공간에 흩어져 생기는 것
- 중간중간 외부 단편화 발생한 곳이 생긴다.
- 이때 공백보다 큰 프로세스가 메모리 할당을 요청하는 경우 대기할 수 밖에 없다.
- 외부 단편화를 해결하는 방법 : 통합과 집약
- 통합(coalescing)
: 인접된 공백을 더 큰 하나의 공백으로 만드는 과정
: ㅇㅇㅇ 의 메모리 공간을 차지하는 프로세스는 못들어옴
: ㅁㅁㅇㅇㅁㅇ => ㅁㅁ(ㅇㅇ)ㅁㅇ
- 집약(compaction)
: 메모리내의 모든 공백을 하나로 모으는 작업
: ㅇㅇㅇ의 메모리 공간을 차지하는 프로세스가 들어올 수 있다.
: ㅁㅁㅇㅇㅁㅇ => ㅁㅁㅁ(ㅇㅇㅇ)
###. 메모리 보호
#. 여러 프로세스가 동시에 메모리에 상주해야 하므로 메모리의 보호가 필요
#. 연속 메모리 할당 방식에서는 프로세스가 사용할 수 있는 주소 범위를 하한-상한 레이즈서 쌍 또는 하한-크기 레지스터 쌍의 값으로 제한함으로써 다른 할당 영역을 침범하지 않게 한다.
#. 만약 프로세스가 이 제한을 넘어 운영체제를 호출하려면 시스템 호출을 통해서만 가능하다.
###. 메모리 배치기법
#. 동적 분할 다중 프로그래밍에서 새로 반입된 프로그램이나 데이터를 메모리의 어느 위치에 배치할 것인가를 결정하는 것
#. 운영체제는 빈 공간 리스트를 유지하고 있어서 그중 적합한 공간을 찾으면 된다.
#. 4가지 배치기법
#. 최초 적합
- 최초 적합(first-fit)방법은 빈 공간 리스트를 메모리의 주소순으로 유지하며 할당속도를 빠르게 할 수 있는 방법으로, 프로세스가 적재될 수 있는 빈 공간중에서 가장 먼저 발견되는 곳을 할당한다.
#.후속 적합
- 후속 적합(next-fit)방버은 최소 적합의 변형으로 이전에 탐색이 끝난 그다음 부분부터 시작하여 사용 가능한 빈 공간 중에서 가장 먼저 발견되는 곳을 할당
#. 최적 적합
- 최적 적합(best-fit) 방법은 큰 빈 공간을 최대한 많이 남겨 놓기 위한 방법으로, 필요한 공간을 제공할 수 있는 빈 공간 중 가장 작은 곳을 선택하여 할당
#. 최악 적합
- 최악 적합(worst-fit) 방법은 최적 적합과 상대적인 것으로, 필요한 공간을 제공할 수 있는 빈 공간 중 가장 큰 곳을 선택하여 할당. 작은 짜투리가 남아 사용되지 못하는 공간이 발생하는 것을 최소화 하기 위한 방법
$$.참고) 말이 어렵다. 예를들어 11, 13, 15의 공간이 있을 때 10을 넣어보자. 최적 적합을 사용하면 11의 공간에 넣을 것이고 1이 남는다.. 과연 1을 쓰는 프로세스가 있을까?? 최악 적합이라고 해서 올바르지 않다는 말이 아니라 최악 적합을 사용해서 10을 넣으면 15에다가 넣을 것이다 그럼 5가 남게되고 5는 다른 곳에서 충분히 사용할 만한 용량이라는 것이다.