2023. 1.1 21:30 복습 및 수정 시작
2023. 5.22 19:30 복습 및 재수정 시작
메모리 관리자
메모리 관리는 메모리 관리자가 한다. 정확히 말하면 메모리 관리 유닛(Memory Management Unit, MMU)이 맡는다.
메모리 관리자는 반입 정책, 배치 정책, 대치 정책을 수립해 그 정책에 따라 메모리를 관리한다.
- 반입 정책: 프로그램을 메모리로 언제 가져와서 실행할지 결정하는 정책.
- 배치 정책: 가져온 프로세스를 메모리의 어떤 위치에 올려놓을지 결정하는 정책.
- 대치 정책: 메모리가 꽉 찼을 때 메모리 내에 있는 어떤 프로세스를 내보낼지 결정하는 정책.
메모리 주소
메모리 주소의 개념에는 물리적 주소와 논리적 주소가 존재한다.
물리적 주소는 말 그대로 실제 메모리에 저장된 주소다. 논리적 주소는 사용자 입장에서 바라본 주소 공간이다.
논리적 주소를 물리적 주소로 변환하는 것이 MMU 이다.
바인딩이란 논리 주소를 물리 주소로 변환하는 것이다.
단일 프로그래밍 환경에서의 메모리 할당
단일 사용자의 연속 메모리 할당
단일 사용자의 연속 메모리 할당은 초기 컴퓨터 Ms-DOS를 통해 알 수 있다.
단일 프로그래밍 환경이며 멀티프로그래밍 환경이 아니다.
사용자가 메모리를 직접 사용하며 OS 메모리 영역에 침범할 가능성이 존재한다.
실행 가능한 조건은 작업 용량이 메모리 공간보다 적어야만 한다.
기준 레지스터를 이용한 할당 방식이고, 메모리의 사용 크기는 정해져 있다.
OS 영역을 침범하면 에러가 발생하고 인터럽트가 발생한다.
침범 안 하면 참조가 가능하며 MMU가 논리적 메모리 주소를 물리적 메모리 주소로 변환할 수 있다.
공간 낭비의 문제가 있으며 작업 용량이 너무 커져도 문제다.
제한된 공간을 효율적으로 사용하기 위해 아래와 같은 방법들이 등장했다.
동적 적재 기법(Dynamic Loading)
'필요할 때 가져다 쓰자'가 핵심 개념이다.
어떤 프로그램 C가 하드디스크에 존재한다. 이제 이 C를 적재하려고 한다. 과정을 살펴보자.
1. C를 호출
2. 적재 테이블에서 적재 여부 확인
3. 있으면 그대로 진행
3. 없으면 디스크에서 적재 (적재하면 실행된다.)
4. 적재 테이블 업데이트
호출되는 시점에서 메모리에 로딩이 된다. 호출돼야 로딩된다는 개념이 중요하다.
호출이 안되면 메모리에 로딩되지 않는다. 메모리의 효율적 사용을 위해 고안되었다.
중첩 기법(Overlay)
프로그램 용량이 메모리 공간보다 큰 경우에 사용한다.
필요할 때 필요한 것만 적재한다는 개념이다.
프로그램 실행 시 반드시 필요한 명령과 데이터를 적재하며 필요한 경우에 한하여 필요 모듈을 필요한 시기에 적재한다.
메모리의 효율적 사용을 위해 고안되었다.
만약 초기 모듈 크기가 50kb 처리 모듈 크기가 100kb 출력 모듈 크기가 70kb이면 중첩 영역이 100kb면 모두 처리가 가능하다.
먼저 초기 모듈을 처리하고 다음은 처리 모듈 마지막으로 출력 모듈을 처리하면
100kb 중첩 영역 내에서 필요할 때만 적재시켜 모두 처리가 가능하다.
교체 기법(Swapping)
실행 중인 프로세스는 메모리에 남기고, 실행 보류 프로세스는 보조 기억장치의 Swap 영역으로 쫓아내는 기법이다.
메모리의 효율적 사용을 위해 고안되었다.
교체 시간에 필요한 조건은 사용자 프로세스 용량과 디스크 전송률과 회전 지연시간이다.
사용자 프로세스 용량이 100kb이고 디스크 전송률이 1mb이며 회전 지연시간이 8ms이다.
그러면 먼저 교체 시간을 구해보자. 비례식을 사용한다.
1000kb : 1초 = 100kb : x초를 이용하면 100ms가 나온다. 0.1초이다.
교체 시간 = 100ms + 8ms + 100ms + 8ms.
교체시간은 216ms다.
다중 프로그래밍 환경에서의 메모리 할당
한 번에 여러 프로세스를 동시에 실행하는 경우 메모리 관리가 더욱 복잡해지는데,
프로세스들의 크기가 달라 메모리를 어떻게 나누어 사용할 것인지가 가장 큰 문제이다.
- 고정 분할 방식: 프로세스의 크기와 상관없이 메모리를 같은 크기로 나누는 것이다.
- 가변 분할 방식: 프로세스의 크기에 따라 메모리를 나누는 것이다.
고정 분할 다중 프로그래밍
고정 분할 다중 프로그래밍은 메모리를 고정된 크기로 분할하여 프로세스에 할당한다.
한 프로세스가 분산되어 배치기 때문에 비연속 메모리 할당이라고 한다.
고정 분할 다중 프로그래밍에서는 내부 단편화라는 문제가 발생한다.
쉽게 말하면 10K 영역이 있는데 이 영역에 7K 작업이 할당된다.
이러면 3K가 남는데 이 남는 용량이 내부 단편화이다. 이런 문제를 해결하기 위해서 가변 분할 다중프로그래밍이 등장한다.
가변 분할 다중 프로그래밍
가변 분할 다중프로그래밍은 작업이 필요한 만큼의 메모리를 할당한다.
즉 프로세스의 크기에 따라 메모리를 나누는 것이다.
고정 분할과는 다르게 고정된 경계를 제거했다.
가변 분할 할당은 테이블을 유지해야 하며, 메모리의 어떤 부분이 사용될 수 있고, 어떤 부분이 사용중인가 정보가 필요하다.
가변 분할 다중프로그래밍은 내부 단편화는 발생하지 않지만 외부 단편화 문제가 발생한다.
가변 분할 방식의 메모리 배치 정책
가변분할 메모리 할당 시 프로세스의 메모리 할당위치에 대한 선정 방법으로 총 3가지에 대해 알아보겠다.
최초 적합, 최상 적합, 최악 적합 이렇게 3가지가 있다. 효율적인 것을 먼저 말하자면 최초, 최상, 최악 순이다.
- 최초 적합: 사용 가능 공간 리스트를 검색하여 첫 번째로 찾은 공간을 우선 할당한다.
검색과 할당 시간이 빠르고 대신 공간 활용률은 낮다. - 최상 적합: 사용 가능 공간 리스트 중에서 가장 작은 크기의 사용공간을 할당한다. 공간이용률은 높다.
주기적인 할당이 필요하며 시간소요가 크고 단편화가 발생한다. - 최악 적합: 사용 가능 공간 리스트 중에서 가장 큰 크기의 사용공간에 할당한다. 공간 이용률은 높고 시간 소요도 길다.
크기에 따른 주기적인 정렬이 필요하며 단편화 발생 정도를 줄인다.
가변분할에서의 메모리 보호는 상한값 하한값을 이용한 방법과 기준 레지스터와 한계 레지스터를 이용한 방법이 있다.
단편화의 해결 방법으로는 통합과 압축이 있다.
통합은 메모리의 여유공간이 인접될 경우에 합하는것이다.
압축은 메모리 내용 이동, 여유 공간을 하나의 큰 블록으로 구성한다.
외부 단편화를 해결하지만 실행 시간에 주소 재배치가 필요하며 동적인 메모리 테이블을 유지해야 한다.
과부하가 생길 수 있으며 압축되는 동안 모든 작업은 중단되고 압축으로 인한 시스템 자원소모가 발생한다.
버디 시스템 알고리즘은 자원 할당 과정에서 발생하는 단편화를 해결하는 방법이다.
큰 버퍼를 반복적으로 이등분하여 작은 버퍼로 구성하고 틈틈히 통합한다.
2023. 1.1 23:00 복습 및 수정 완료
댓글