메모리 관리가 필요한 이유
• 멀티프로그래밍 환경으로 변화하면서 한정된 메모리를 효율적으로 사용할 필요가 생겼다.
• 프로세스는 독립된 메모리 공간을 갖고, 운영체제 혹은 다른 프로세스의 메모리 공간에 접근할 수 없기 때문에
이를 자체적으로 관리하지 못한다.
• 운영체제만 메모리 영역과 프로세스 메모리 공간의 접근에 제약을 받지 않으므로 운영체제에서 이를 관리해줄 필요가 있다.
• 프로세스 주소
◦ 논리적 주소(Logical address)
- CPU가 생성하는 주소. 가상 주소(Virtual address)라고도 부른다.
- 프로세스마다 독립적으로 가지는 주소 공간 (힙/데이터/텍스트/스택 공간 등)
- 프로세스 내부에서 사용하며 각 프로세스 마다 0의 주소 부터 시작한다.
◦ 물리적 주소(Physical address)
- 프로세스가 실행되기 위해 실제로 메모리(RAM)에 올라가는 위치
- Address Binding : 프로세스가 메모리의 어느 위치(어떤 물리적 주소)에 올라갈지 결정하는 작업
• 연속 할당 기법
◦ 프로그램 전체를 하나의 커다란 공간에 연속적으로 할당하는 기법
◦ 물리적 메모리를 다수의 분할로 나누어 하나의 분할에 하나의 프로세스가 적재되도록 한다.
◦ 크게 고정 분할 방식과 가변 분할 방식으로 나뉜다.
• 불연속 할당 기법
◦ 하나의 프로세스가 사용하는 메모리 공간이 연속적이어야 한다는 제약을 없앤 메모리 관리 방법
◦ 프로그램의 일부가 서로 다른 주소 공간에 할당될 수 있다.
◦ 불연속 할당 기법에서 등장하는 개념들
- 페이지 : 고정 사이즈의 작은 프로세스 조각
- 프레임 : 페이지 크기와 같은 주기억장치 메모리 조각
- 단편화 : 기억 장치의 빈 공간 or 자료가 여러 조각으로 나뉘는 현상
- 세그먼트 : 서로 다른 크기를 가진 논리적 블록이 연속적 공간에 배치되는 것
고정 분할 방식
• 물리적 메모리를 정해진 개수의 영구적인 분할로 나누어두고 각 분할에 하나의 프로세스를 적재하는 방식
• 동시에 메모리에 올릴 수 있는 프로그램 수가 고정되어 있으며, 수행 가능한 프로그램의 최대 크기 또한 제한되기 때문에
가변분할 방식에 비해 융통성이 떨어진다.
• Internal/External Fragmentation이 발생할 수 있다.
가변 분할 방식
• 메모리에 적재되는 프로그램의 크기에 따라 분할의 크기, 개수를 동적으로 조절하는 방식
• 프로그램의 크기를 고려하여 메모리를 할당하고, 이를 관리할 수 있는 기술이 필요한 방식이다.
• Internal Fragmentation은 발생하지 않지만, 메모리에 새로운 프로세스를 올릴 공간이 충분하지 않으면
External Fragmentation이 발생할 수 있다.
◦ 이는 컴팩션(compaction) 기법으로 해결 가능하지만, 비용이 매우 많이 든다.
- 컴팩션 기법이란? : 중간중간 사용하지 않은채 뻥 뚫려있는 메모리 영역을 한쪽으로 모으기 위해 자원들을 한쪽으로 몰아넣는 기법
- 수행중인 프로세스의 물리적 메모리 위치를 하나하나 옮겨야 하므로 비용이 매우 크다.
• 가변 분할 방식에서는 메모리 공간의 어디에 프로세스를 올려야 할지 결정해야 한다. (동적 메모리 할당 기법)
• 이를 결정하는 방법으로 아래 세가지 정도가 있다.
◦ 최초 적합 방법
- 가용 공간을 차례대로 살펴보면서 프로그램 크기 < 가용 공간 크기가 최초로 발견될 때 할당
- 모든 가용 공간을 탐색할 필요가 없어 시간적으로 효율적이다.
◦ 최적 적합 방법
- 프로세스 크기 < 가용 공간 크기인 가장 작은 공간을 찾아 할당
- 모든 가용 공간 리스트가 크기 순으로 정렬되어 있지 않으면 탐색에 오버헤드가 발생할 수 있다.
◦ 최악 적합 방법
- 프로세스 크기 < 가용 공간 크기인 가장 작은 큰 공간을 찾아 할당
- 최적 적합과 동일하게 탐색 오버헤드가 발생할 수 있다.
참고자료
'CS Knowledge > 운영체제' 카테고리의 다른 글
[OS] 페이지 교체 알고리즘 (0) | 2022.09.26 |
---|---|
[OS] 가상 메모리 + 페이징 & 세그멘테이션 (0) | 2022.09.26 |
[OS] 교착 상태(Deadlock) 개념 (6) | 2022.09.22 |
[OS] 인터럽트 개념과 이중모드 (0) | 2022.09.16 |
[OS] CPU 스케줄링 알고리즘 (0) | 2022.09.16 |