운영체제가 메모리 관리를 해야 하는 이유:
- 프로세스 간의 메모리 충돌 방지: 각 프로세스는 독립적인 메모리 공간을 가져야 합니다. 메모리 충돌을 방지하지 않으면 하나의 프로세스가 다른 프로세스의 메모리를 덮어쓰는 문제가 발생할 수 있습니다. 예를 들어 A,B 프로세스가 동시에 실행되고 있는 상태에서 A 프로세스가 B 프로세스의 메모리를 침범한다면 끔찍한 일이 발생할 것이다.
- 효율적인 자원 활용: 메모리는 제한된 자원이기 때문에, 여러 응용 프로그램이 동시에 실행될 때 메모리 자원을 효율적으로 관리하는 것이 중요합니다.
- 메모리 보호: 악성 코드나 잘못된 프로그램이 중요한 시스템 메모리를 침범하는 것을 방지해야 합니다.
- 프로세스 간의 메모리 공유: 일부 프로세스들은 메모리를 공유할 수 있어야 하는데, 이를 적절하게 관리하지 않으면 데이터 일관성이 깨질 수 있습니다.
- 가상 메모리 관리: 실제 메모리(RAM)가 부족할 때 하드 디스크의 일부를 가상 메모리로 사용하여 메모리를 확장할 수 있도록 해야 합니다
논리 메모리와 물리 메모리 중요도
CPU가 프로세스를 처리할 때 보는 주소 값과 실제 메모리의 주소 값은 다르다. 프로세스가 보는 메모리 영역을 논리 메모리 영역 또는 가상 메모리 영역이라고 하고, 실제로 사용되는 메모리 영역(RAM)을 물리 메모리 영역이라고 한다. 그리고 CPU가 프로세스를 실행하며 보는 주소 값을 논리 주소 또는 가상 주소라고 하며, 실제 메모리에서 사용되는 주소는 물리 주소라고 한다.
CPU가 프로세스를 실행할 때 사용하는 주소 값과 실제 주소 값이 다르므로 논리 주소를 물리 주소로 변환해 줘야 하는데, 이러한 동작을 하는 하드웨어 장치를 메모리 관리 장치 (MMU, Memory Management Unit)라고 한다. MMU는 CPU에 위치하며, CPU에서 메모리에 접근하기 전에 MMU를 거쳐 논리 주소에 해당하는 물리 주소를 얻는다. MMU는 보호해야 하는 메모리 영역에 대한 접근을 제한해 메모리를 보호하는 역할을 한다.
연속 메모리 할당
연속 메모리 할당은 멀티 프로세스 환경에서 여러 프로세스를 메모리에 연속적으로 로드하는 방법. 연속 메모리 할당은 2가지 방법이 있다.
고정 분할 방식
고정 분할은 메모리 영역을 분할한 뒤 각 영역에 프로세스를 할당하는 방식이다. 이때 분할된 영역의 크기는 서로 다를 수 있으며, 분할된 크기는 고정된다. 그런데 이 방식은 메모리에 올릴 수 있는 프로세스 수와 각 프로세스 크기가 제한된다는 단점이 있고, 단편화 (fragmentation) 문제가 발생할 수 있다.
예를 들어 하단 그림에서 8MB의 메모리 공간과 2MB의 메모리 공간을 합치면 프로세스 7에 공간을 할당할 수 있지만, 고정 분할 때문에 할당하지 못한다. 이런 경우를 외부 단편화(external fragmentation)라고 한다. 그리고 프로세스 3과 프로세스 4처럼 분할된 크기보다 작은 프로세스가 할당되어 메모리 공간이 남는 경우를 내부 단편화(internal fragmentation)라고 한다.
가변 분할 방식
가변 분할은 할당할 프로세스의 크기에 따라 메모리 공간을 분할하는 방식. 이 방식은 메모리 할당 알고리즘을 이용해 가용 메모리 공간에서 프로세스가 로드될 수 있는 메모리 공간을 찾는다. 메모리 할당 알고리즘으로는 최초 적합, 최적 적합, 최악 적합 등이 있다.
1. 최초 적합
가용 메모리 공간에서 프로세스 크기만큼 비어 있는 메모리 공간을 찾아 차례대로 프로세스를 로드하는 방식이다.
① 20MB의 프로세스 10 56MB의 가용 메모리 공간에 할당된다.
② 18MB의 프로세스 2가 36MB의 가용 메모리 공간에 할당된다.
③ 12MB의 프로세스 3이 18MB의 가용 메모리 공간에 할당된다.
④ 메모리 영역에서 프로세스 2의 할당이 해제된다.
⑤ 6MB의 프로세스 4를 할당할 수 있는 가용 메모리 공간을 찾으면 가장 먼저 18MB의 메모리 공간이 탐색된다. 그러면 더 이상 탐색을 진행하지 않고 프로세스 4를 해당 메모리 공간에 할당한다.
2. 최적 적합(best-fit)
할당하려는 프로세스 크기 이상인 가용 메모리 공간 중에서 가장 작은 공간에 프로세스를 할당하는 방식이다. 이 방식은 가용 메모리 공간을 모두 탐색해야 한다.
① 20MB의 프로세스 10| 56MB의 가용 메모리 공간에 할당된다.
② 18MB의 프로세스 2가 36MB의 가용 메모리 공간에 할당된다.
③ 12MB의 프로세스 30 18MB의 가용 메모리 공간에 할당된다.
④ 메모리 영역에서 프로세스 2의 할당이 해제된다.
⑤ 6MB의 프로세스 4를 할당할 수 있는 가용 메모리 공간을 찾으면 18MB와 6MB의 공간이 탐색된다.
이 중에서 가장 작은 6MB의 메모리 공간에 프로세스 4가 할당된다.
3. 최악 적합(worst-fit)
할당하려는 프로세스 크기보다 큰 가용 메모리 공간 중에서 가장 큰 공간에 프로세스를 함 당하는 방식이다. 최적 적합 방식과 마찬가지로 가용 메모리 공간을 모두 담색해야 한다.
① 20MB의 프로세스 10 56MB의 가용 메모리 공간에 할당된다.
② 18MB의 프로세스 2가 36MB의 가용 메모리 공간에 할당된다.
③ 12MB의 프로세스 3이 18MB의 가용 메모리 공간에 할당된다.
④ 메모리 영역에서 프로세스 2의 할당이 해제된다.
⑤ 6MB의 프로세스 4를 할당할 수 있는 가용 메모리 공간을 찾으면 18MB와 6MB의 공간이 탐색된다.
이 중에서 가장 큰 18MB의 메모리 공간에 프로세스 4가 할당된다.
추가로 !
외부 단편화 문제를 해결하는 방법으로 메모리 압축(memory compaction)이 있다. 메모리 압죽 은 프로세스가 사용 중인 메모리 공간을 재배치해서 흩어져 있는 가용 메모리 공간을 하나로 합치는 것으로, 메모리 집약이라고도 한다.
그림 1-40 (a)를 보면 흩어져 있는 가용 메모리 공간 중에서 프로세스 7이 들어갈 수 있는 공간은 없다. 이때 메모리 압축을 수행하면 14MB의 가용 공간이 생기므로 외부 단편화 문제를 해결하고 프로세스 7을 메모리에 로드할 수 있게 된다.
비연속 메모리 할당
비연속 메모리 할당은 프로세스의 메모리 영역을 나눠서 메모리 공간에 저장하는 방법으로, 페이징과 세그먼테이션이라는 2가지 방식이 있다.
페이징
페이징(paging) 기법은 프로세스의 논리 메모리 영역과 물리 메모리 영역을 각각 일정한 크기의 페이지(Puge)와 프레임(frame)으로 나눈다. 이때 페이지와 프레임 크기는 동일하다. 페 이지와 프레임에는 각각번호를 할당해 프로세스의 페이지와 메모리의 프레임을 매핑한다.
페이지와 프레임을 매핑하는 데는 페이지 테이블(page table)을 사용한다. 페이지 테이블은 프로세스의 페이지 정보와 페이지에 매핑하는 프레임의 주소 값을 저장한다. 페이지 테이 블은 각 프로세스의 PCB에 저장된다.
페이징 기법이 작동하는 방식은 다음과 같다.
페이징 기법을 사용하면 페이지를 물리 메모리에 연속으로 할당할 필요가 없어서 외부 단 편화 문제를 해결할 수 있다. 하지만 프로세스 크기가 페이지 수로 나누어 떨어지는지는 보장하지 않는다. 따라서 프로세스의 마지막 페이지가 페이지 크기보다 작을 수 있으므로 내부 단편화 문제가 발생할 수 있다. 또한, 페이지 테이블을 저장하기 위한 메모리 공간이 추가로 필요하다.
세그먼테이션
세그먼테이션 기법은 프로세스의 메모리 영역을 논리적 단위인 세그먼트로 분할해 메모리를 할당한다. 여기서 논리적 단위는 파일 내 함수 단위나 프로세스의 스택, 힙과 같은 영역을 의미하기도 한다.
이 기법은 세그먼테이션 테이블을 사용해 세그먼트의 논리 주소를 물리 주소로 매핑한다. 세그먼트 테이블은 세그먼트 번호를 인덱스로 사용하며, 세그먼트별 시작 주소인 base와 길이 인 limit을 저장한다.
세그먼테이션 기법은 프로세스의 메모리 영역을 논리적 단위로 나눠 저장하므로 단위별 로 데이터를 보호하기 쉽다는 장점이 있다. 하지만 세그먼트의 크기가 균등하지 않아서 프로세스의 할당/해제를 반복하는 과정에서 외부 단편화 문제가 발생할 수 있다. 또한. 메 모리에 로드된 스택 세그먼트 영역에서 오버플로가 발생하면 다른 프로세스와 메모리 영역이 겹칠 수 있다. 그러면 다른 프로세스의 세그먼트나 스택 오버플로가 발생한 세그먼 트를 디스크로 스왑 아웃해야 하는 단점이 있다.
'cs > 운영체제' 카테고리의 다른 글
값 형식 / 참조 형식 이란 ? (0) | 2024.08.27 |
---|---|
[운영체제] 프로세스의 메모리 영역 구조 (0) | 2024.08.26 |