페이징(Paging)과 세그멘테이션(Segmentation)
메모리
메인 메모리 (Main Memory, Physical Memory, 주기억장치)
•
CPU가 직접 접근할 수 있는 기억 장치로, 프로세스가 실행되려면 프로그램 코드를 메인 메모리에 적재해 두어야 한다.
•
그런데 만약 프로그램 용량이 메인 메모리보다 크면 어떤 일이 벌어질까?
가상 메모리 (Virtual Memory)
•
실제 물리 메모리 개념과 사용자의 논리 메모리 개념을 분리한 것이다.
•
메모리의 공간은 한정적이므로 사용자에게 더 많은 메모리를 제공하기 위해 가상 주소를 사용한다.
•
메모리 관리 장치는 가상 주소를 이용해 실제 데이터가 담겨 있는 주소로 변환해준다.
•
여기서 가상 주소 공간은 하나의 프로세스가 메모리에 저장되는 논리적인 모습을 가상 메모리에 구현한 공간이며, 가상 주소는 해당 공간을 가리키는 주소이다.
가상 메모리가 필요한 이유
물리 메모리의 한계
•
모든 프로그램 코드를 물리 메모리에 올릴 수가 없다.
•
그렇다고, 프로그램을 교체하면서 올리면 메모리 교체 성능 문제가 발생한다.
가상 메모리의 장점
•
프로그램 용량이 실제 메모리보다 커도 된다.
•
전체 프로그램이 물리 메모리에 올라와 있지 않아도 된다.
•
더 많은 프로그램을 동시에 실행할 수 있다.
◦
응답 시간은 유지
◦
CPU 이용률과 처리율은 증가
•
즉, 다중 프로그래밍을 실현하기 위해 물리 메모리의 제약을 보완하고 프로세스 전체를 올리지 않고도 실행할 수 있도록 해준다.
주기억장치 & 보조기억장치
가상 메모리의 구현
•
운영체제는 물리 메모리의 제약을 갖고 있는 주기억장치를 보조하기 위해 디스크를 보조기억장치(Paging Space)로 사용한다.
•
즉, 메인 메모리(주기억장치)와 디스크의 페이징 스페이스(보조기억장치)를 묶어 하나의 메모리처럼 동작하게하며, 이를 메인 메모리의 한계를 넘는 메모리 사용을 가능하게 하는 가상 메모리를 구현한다.
Swapping
•
CPU 할당 시간이 끝난 프로세스의 메모리를 보조기억장치를 내보내고(swap-out) 다른 프로세스의 메모리를 불러오는(swap-in) 작업을 Swap 이라고 한다.
•
이러한 Swap 작업에는 디스크 전송 시간이 들기 때문에 메모리 공간이 부족할 때 Swapping이 이루어진다.
메모리 관리
•
다중 프로그래밍 시스템에 여러 프로세스를 수용하기 위해 주기억장치(RAM)을 동적 분할하는 메모리 관리 작업이 필요하다.
•
즉, 하드 디스크에 있는 프로그램을 어떻게 메인 메모리에 적재할 것인지 판단해야 한다.
연속 메모리 관리
•
프로그램 전체가 하나의 커다란 공간에 연속적으로 할당되어야 한다.
고정 분할 기법
•
주기억장치가 고정된 파티션으로 분할 → 내부 단편화 발생
동적 분할 기법
•
파티션들이 동적 생성되며, 자신의 크기와 같은 파티션에 적재 → 외부 단편화 발생
→ 이렇게 연속 메모리 관리 기법을 사용할 경우, 단편화 현상이 발생한다.
단편화 (Fragmentation)
•
기억 장치의 빈 공간 또는 자료가 여러 조각으로 나뉘는 현상이다.
•
프로세스들이 메모리에 적재되고 제거되는 일이 반복되면, 프로세스들이 차지하는 메모리 틈 사이에 사용하지 못할 만큼의 자유 공간이 늘어나게 된다.
•
이러한 단편화는 2가지로 나뉜다.
내부 단편화
•
프로세스가 사용하는 메모리 공간에 남는 부분
•
프로세스가 요청한 양보다 더 많은 메모리를 할당할 때 발생하며, 메모리 분할 자유 공간과 프로세스가 사용하는 공간의 크기 차이를 의미한다.
외부 단편화
•
메모리 공간 중 사용하지 못하게 되는 부분
•
메모리 할당 및 해제 작업의 반복으로 작은 메모리가 중간 중간 존재할 수 있다.
•
이렇게 사용하지 않는 메모리가 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황이다.
•
외부 단편화를 해결하기 위해 압축을 이용하여 프로세스가 사용하는 공간을 한쪽으로 몰 수는 있지만, 작업 효율이 좋지 않다.
불연속 메모리 관리
•
프로그램의 일부가 서로 다른 주소 공간에 할당될 수 있는 기법이다.
•
앞서 봤던 단편화 문제를 해결하기 위해 제시된 기법으로, 외부 단편화 해소를 위한 페이징과 내부 단편화 해소를 위한 세그멘테이션으로 나뉜다.
페이징 (Paging)
•
프로세스를 일정한 크기의 페이지로 분할해서 메모리에 적재하는 방식이다.
페이지
•
고정 사이즈의 가상 메모리 내 프로세스 조각
프레임
•
페이지 크기와 같은 주기억장치의 메모리 조각
→ 하나의 프로세스가 사용하는 메모리 공간이 연속적이어야 한다는 제약을 없애는 메모리 관리 방법이다.
페이징 테이블 (Paging Table)
•
위 이미지는 페이징 테이블의 매핑을 나타낸다.
•
앞서 봤듯이, 물리 메모리는 고정 크기의 프레임으로, 가상 메모리는 고정 크기의 페이지로 분리되어 있다.
•
개별 페이지는 순서에 상관없이 물리 메모리에 있는 프레임에 매핑되어 저장된다.
•
즉, 모든 프로세스는 하나의 페이징 테이블을 가지고 있으며, 여기에는 메인 메모리에 적재되어 있는 페이지 번호와 해당 페이지가 위치한 메인 메모리의 시작 주소가 있다.
•
이를 통해, 하나의 프로세스를 나눈 가상 메모리 페이지들이 실제 메인 메모리의 어디 프레임에 적재되어 있는지 알아낼 수 있다.
위 PMT(Page Maaping Table, 페이징 테이블)에서는 P1 프로세스의 0번째 페이지가 메인 메모리의 5번째 프레임에 있는 것을 알 수 있다.
논리 주소와 페이지 테이블
•
앞서 메모리 관리 장치(MMU, Memory Management Unit)는 가상 주소(논리 주소)를 이용해 실제 데이터가 담겨 있는 주소로 변환해준다고 하였다.
•
논리 주소(Logical Address)는 <page, offset)과 같은 형태로 구성되는데, 이를 이용해 물리 주소로 변환해 주는 것이다.
가상 주소를 물리 주소로 변환하는 전체 과정이다.
페이징의 장단점
장점
•
논리 메모리는 물리 메모리에 저장될 때 연속되어 저장될 필요가 없고, 물리 메모리의 남는 프레임에 적절히 배치되기 때문에 외부 단편화가 생기지 않는다.
단점
•
내부 단편화 문제가 발생할 수 있다. 페이지 단위를 작게하면 해결할 수 있지만, 페이지 매핑 과정이 복잡해져 오히려 비효율적이다.
세그멘테이션 (Segmentation)
•
세그먼트는 가상 메모리를 서로 크기가 다른 논리적 단위로 분할한 것을 의미한다.
•
세그멘테이션은 프로세스를 논리적 단위인 세그먼트로 분할해서 메모리에 적재하는 방식이다.
•
예를 들자면, 돼지를 도축할 때, 페이징은 돼지를 같은 크기로 잘라서 보관하는 것이라면, 세그멘테이션은 부위 별로 잘라서 보관한다고 이해하면 된다.
•
이렇듯 세그먼트는 의미가 같지 않는 논리적 내용을 기준으로 프로그램을 분할하기 때문에 크기가 같지 않다.
세그먼트 테이블
•
분할 방식을 제외하면, 페이징과 세그멘테이션이 동일하기 때문에 매핑 테이블의 동작 방식도 동일하다.
•
다만, 논리 주소의 앞 비트들은 페이징 번호가 아니라 세그먼트 번호가 될 것이다.
•
즉, <segment, offer> 형태로 구성되며, 세그먼트 번호를 통해 세그먼트의 기준(세그먼트의 시작 물리 주소)와 한계(세그먼트의 길이)를 파악할 수 있다.
세그멘테이션의 장단점
장점
•
내부 단편화 문제가 해소된다.
•
보호와 공유 기능을 수행할 수 있다. 프로그램의 중요한 부분과 중요하지 않은 부분을 분리하여 저장할 수 있고, 같은 코드 영역은 한 번에 저장할 수 있다.
단점
•
외부 단편화 문제가 생길 수 있다.
페이징과 세그멘테이션
단순 페이지
•
각 프로세스는 프레임과 같은 길이를 가진 균등 페이지로 나뉜다.
•
외부 단편화가 생기지 않는다.
•
내부 단편화가 존재할 수 있다.
단순 세그멘테이션
•
각 프로세스는 여러 세그먼트로 나뉜다.
•
내부 단편화가 생기지 않는다.
•
메모리 효율을 개선한다.
•
동적 분할을 통한 오버헤드가 감소한다.
•
외부 단편화가 존재할 수 있다.
가상 메모리 페이징
•
단순 페이징과 비교해 프로세스 페이지 전부를 로드할 필요가 없다.
•
필요한 페이지가 있으면 나중에 자동으로 불러 들인다.
•
외부 단편화가 생기지 않는다.
•
복잡한 메모리 관리로 오버헤드가 발생할 수 있다.
가상 메모리 세그멘테이션
•
필요하지 않은 세그먼트들은 로드되지 않는다.
•
필요한 세그먼트가 있을 때, 나중에 자동으로 불러들인다.
•
내부 단편화가 생기지 않는다.
•
복잡한 메모리 관리로 오버헤드가 발생할 수 있다.