-목차-
1. 메모리 관리 배경
각각의 프로세스는 독립된 메모리 공간을 갖고, 운영체제 혹은 다른 프로세스의 메모리 공간에 접근할 수 없는 제한이 걸려있다. 단지, 운영체제 만이 운영체제 메모리 영역과 사용자 메모리 영역의 접근에 제약을 받지 않는다.
메인 메모리(Main Memory, Physical Memory, 주기억장치)는 CPU가 직접 접근할 수 있는 기억 장치로, 프로세스가 실행되려면 프로그램 코드를 메인 메모리에 적재해 두어야 한다. 그런데, 만약 프로그램 용량이 메인 메모리보다 크면 어떤 일이 벌어질까?
1.1 스와핑(Swapping)
메모리의 관리를 위해 사용되는 기법.
표준 Swapping 방식으로는 Round Robin과 같은 스케줄링의 다중 프로그래밍 환경에서 CPU 할당 시간이 끝난 프로세스의 메모리를 보조 기억장치(e.g. 하드디스크)로 내보내고 다른 프로세스의 메모리를 불러 들일 수 있다.
이 과정을 Swap(스왑 시킨다)이라 한다.
- Swap In : 보조기억장치 → 주기억장치(RAM)로 불러오는 과정
- Swap Out : 주기억장치 → 보조기억장치로 내보내는 과정
- Swap에는 큰 디스크 전송시간이 필요하기 때문에 현재에는 메모리 공간이 부족할 때 Swapping 이 시작
- 하나의 사용자 프로그램이 완료될 때까지 교체 과정 여러 번 수행 가능
- 가상 기억장치의 페이징 기법으로 발전
1.2 단편화(Fragmentation)
프로세스들이 메모리에 적재되고 제거되는 일이 반복되다 보면, 프로세스들이 차지하는 메모리 틈 사이에 사용하지 못할 만큼의 작은 자유공간들이 늘어나게 되는데, 이것이 단편화이다. 단편화는 2 가지 종류로 나뉜다.
- 외부 단편화 : 메모리 공간 중 사용하지 못하게 되는 일부분. 물리 메모리(RAM)에서 사이사이 남는 공간들을 모두 합치면 충분한 공간이 되는 부분들이 분산되어 있을 때 발생한다고 볼 수 있다.
- 내부 단편화 : 프로세스가 사용하는 메모리 공간에 포함된 남는 부분. 예를 들어 메모리 분할 자유 공간이 10K 있고 Process A 가 7K 사용하게 되면 3K라는 차이 가 존재하고, 이 현상을 내부 단편화라 칭한다.
- 압축 : 주기억장치 내 분산되어 있는 단편화된 비어있는 공간들을 통합하여 하나의 커다란 빈 공간을 만드는 작업. 외부 단편화를 해소하기 위해 프로세스가 사용하는 공간들을 한쪽으로 몰아, 자유공간을 확보하는 방법론이지만, 작업효율이 좋지 않다.
2. Paging(페이징)
가상 메모리를 페이지 단위로 나누어서 물리 메모리에 같은 크기인 프레임과 맵핑하여 사용하는 것을 의미한다. 페이징 기법을 사용하면 연속적인 물리 메모리가 아니더라도 원하는 크기의 프레임을 사용할 수 있게 된다.
가상 메모리는 이후 자세하게 다뤄 보도록 하겠다. 이 글에서는 디스크를 사용한 물리 메모리(메인 메모리)의 연장선이라고 이해하면 된다.
가상 메모리에서 페이징의 크기로 메모리를 분할하면 메모리 관리 장치(MMU)에 의해 가상 메모리가 물리 메모리의 주소로 변환되어 유저가 메모리의 맵핑이 어떻게 되는지 의식할 필요 없이 가상 메모리를 활용하여 작업할 수 있다.
Page : 프로세스를 일정한 크기로 나눈 블록
Frame : 페이지와 크기가 같은 물리 메모리(주 기억장치)를 일정한 크기로 나눈 블록
※ 물리 메모리(프레임)와 가상 메모리(페이지)를 대응하기 위해 Page mapping 과정이 필요하고 Paging table을 설정해야 한다. 논리 주소는 <page, offset>과 같은 형태로 구성되는데, 이를 이용해 물리 주소로 변환해 주는 것이다. 아래는 가상 주소를 물리 주소로 변환하는 전체 과정이다.
과정을 간략히 설명하자면, Paging table은 메인 메모리에 저장되기 때문에, 프로그램에 의한 모든 메모리 접근은 최소 두 번 필요하게 된다. 실제 주소를 얻기 위한 메모리 주소 접근(CPU로 부터 생성된 가상주소를 메모리에 있는 Page table을 통해 실 주소로 변환시킨다.) 한번과 데이터를 얻기위한 주기억장치의 접근이 필요하다. TLB는 Paging table에 있는 가상 주소-실 주소 사상의 부분집합을 포함하는 캐시이기 때문에 가상 주소가 TLB에 Hit되었다면 Paging table을 통한 주소 변환 과정이 필요 없이 바로 주기억 장치에 접근이 가능하다. 만약 TLB에서 miss되고 페이지 테이블의 Valid bit가 0이라면 페이지 폴트(Page fault)가 발생하여 보조 기억장치에 접근하여 페이지를 가져온다.
변환 색인 버퍼(Translation Lookaside Buffer, TLB) : 논리 메모리 주소를 물리적인 주소로 변환하는 속도를 높이기 위해 사용되는 캐시로, 약칭은 TLB이다. TLB는 최근에 일어난 논리 메모리 주소와 물리 주소의 변환 테이블을 저장하기 때문에 일종의 주소 변환 캐시라고 할 수 있다.
Page와 Frame의 크기는 동일하게 관리된다. 페이지의 크기는 시스템에 따라 다르며, 크기가 작을수록 메모리를 단편화를 관리하기 쉬워지지만, 페이지의 개수가 많아지기 때문에 그만큼 page mapping 과정이 증가하게 되므로 입출력이 자주 발생하게 된다.
Paging(페이징)의 장단점
- 장점
- 논리 메모리(프로세스가 점유하는)는 물리 메모리에 저장될 때 연속되어 저장될 필요가 없고, 물리 메모리의 남는 프레임에 적절히 배치되기 때문에 외부 단편화가 생기지 않는다.
- 단점
- 내부 단편화 문제가 발생할 수 있다. 프로세스를 특정 단위인 페이지 단위로 나누어 주고 된다. 하지만 프로세스의 크기가 페이지 크기의 배수가 아니라면 마지막 프로세스의 페이지는 한 프레임을 다 채울 수 없다. 따라서 이런 공간이 메모리 안에서 빈 공간으로 남아 낭비되게 된다. 페이지 단위를 작게 하면 해결할 수 있지만, 페이지 매핑 과정이 복잡해져 오히려 비효율적이다.
3. Segmentation(세그맨테이션)
페이징 기법에서는 가상 메모리를 같은 크기로 분할했다. 반면 세그멘테이션은 서로 크기가 다른 논리적인 단위 세그먼트(Segment)로 분할하고 메모리를 할당하여 물리 메모리의 주소로 주소 변환을 하게 된다.
세그먼트들의 크기가 서로 다르기 때문에 페이징 기법처럼 미리 분할해 둘 수 없고, 메모리에 적재될 때 빈 공간을 찾아 할당하는 가상 메모리 관리 기법이다.
미리 할당하지 않기 때문에 각 프로세스에 알맞게 메모리를 할당하여 내부 단편화가 발생하지 않지만, 서로 다른 크기의 세그먼트들에 대해 필요시에 메모리에 올리고 필요 없을 경우 내리는 작업을 반복하다 보면 외부 단편화가 생기는 문제점이 발생할 수 있다.
세그먼트 테이블
분할 방식을 제외하면, 페이징과 세그멘테이션이 동일하기 때문에 매핑 테이블의 동작 방식도 동일하다. 다만, 가상 주소(논리 주소)의 앞 비트들은 페이징 번호가 아니라 세그먼트 번호가 될 것이다. 즉, <segment, offser> 형태로 구성되며, 세그먼트 번호를 통해 세그먼트의 기준 (세그먼트의 시작 물리 주소)와 한계 (세그먼트의 길이)를 파악할 수 있다.
Segmentation(세그맨테이션)의 장단점
- 장점
- 내부 단편화 문제가 해소된다.
- 보호와 공유 기능을 수행할 수 있다. 프로그램의 중요한 부분과 중요하지 않은 부분을 분리하여 저장할 수 있고, 같은 코드 영역은 한 번에 저장할 수 있다.
- 단점
- 외부 단편화 문제가 생길 수 있다.
4. Paging과 Segmentation
정리하자면
Paging(페이징)
- 각 프로세스는 프레임과 같은 길이를 가진 균등 페이지로 나뉜다.
- 외부 단편화가 생기지 않는다.
- 내부 단편화가 존재할 수 있다.
Segmentation(세그맨테이션)
- 각 프로세스는 여러 세그먼트로 나뉜다.
- 내부 단편화가 생기지 않는다.
- 메모리 효율을 개선한다.
- 동적 분할을 통한 오버헤드가 감소한다.
- 외부 단편화가 존재할 수 있다.
Paging(페이징)또는 Segmentation(세그맨테이션)과 같은 메모리 관리 전략을 사용하는 이유
프로그램을 실행하기 위해 코드를 디스크에서 메인 메모리로 적재하는 과정에서 단편화가 생길 수밖에 없다. 이렇게 단편화가 많이 발생하면 사용하지 못하는 메모리 공간이 많아져 낭비가 되므로 최대한 피해야 한다. 압축과 같은 방식을 통해 단편화를 해결할 수도 있지만, 메모리 계산의 비용이 적은 페이징 또는 세그멘테이션을 주로 사용한다.
참고 자료
https://owlyr.tistory.com/16#3b4c689b-c5c4-4dc3-8450-a9b57f8ffac1
https://steady-coding.tistory.com/524
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#메모리-관리-배경
'운영체제' 카테고리의 다른 글
캐시의 지역성 (0) | 2022.02.05 |
---|---|
가상 메모리(Virtual Memory) (0) | 2022.02.04 |
프로세스 동기화(Process Synchronization) [파이썬(Python)] (0) | 2022.02.03 |
Blocking, Non-blocking, Sync, Async 의 차이 (0) | 2022.02.02 |
스케줄러 (0) | 2022.01.27 |
댓글