메모리 개념
메인 메모리(Main Memory, Physical Memory, 주기억장치)
메인 메모리란 CPU가 직접 접근할 수 있는 기억 장치로,
프로세스가 실행되려면 프로그램 코드를 메인 메모리에 적재해두어야 한다.
이때, 프로그램 용량이 메인 메모리보다 크다면 어떻게 될까 ?
가상 메모리(Virtual Memory)
실제 물리 메모리 개념과 사용자의 논리 메모리 개념을 분리한 것이다.
Memory 공간은 한정적이므로 사용자에게 더 많은 Memory를 제공하기 위해 가상 주소를 사용한다.
MMU를 통해 논리 주소, 물리 주소를 나누어 사용하며 CPU의 메모리를 관리한다.
MMU란 ? Memory Management Unit로 가상 주소를 실제 메모리 주소로 변환해주는 장치
가상 주소 공간 - 하나의 프로세스가 메모리에 저장되는 논리적인 모습을 가상 메모리에 구현한 공간
가상 주소 - 해당 공간을 가리키는 주소
그렇다면 왜, 가상 메모리가 필요할까 ?
- 물리 메모리의 한계
- 용량의 한계로 모든 프로그램 코드를 물리 메모리에 올릴 수 없다.
- 프로그램을 교체하면서 올리면 메모리 교체 성능 문제가 발생하고 오버헤드가 크다.
- 가상 메모리의 장점
- 프로그램 용량이 실제 물리 메모리보다 커도 된다.
- 전체 프로그램이 물리 메모리에 올라와있지 않아도 된다.
- 더 많은 프로그램을 동시에 실행할 수 있다.
- 가상의 주소를 사용해 논리적인 연속성을 제공한다.
- 물리 메모리의 주소 공간을 몰라도 된다.
- 즉, 다중 프로그래밍을 실현하기 위해 물리 메모리의 제약을 보완하고 프로세스 전체를 메모리에 올리지 않고도 실행할 수 있도록 해준다.
가상 메모리의 구현
운영체제는 물리 메모리의 제약을 갖고 있는 주 기억장치를 보조하기위해 디스크를 보조 기억 장치(Paging Space)로 사용한다.
즉, 메인 메모리(주 기억장치)와 디스크의 페이징 스페이스(보조 기억 장치)를 묶어 하나의 메모리처럼 동작하게하며,
이를 통해 메인 메모리의 한계를 넘는 메모리 사용을 가능하게 하는 가상 메모리를 구현한다.
Swapping
메모리는 크기가 크지 않음 → 프로세스를 임시로 디스크에 보냈다가 다시 메모리에 로드하는 상황 발생
- swap out : 디스크로 내보내는 것
- swap in : 메모리로 들여보내는 것
중기 스케줄러에의해 swap out 시킬 프로세스를 우선순위에 따라 결정
Compile time이나 Load time binding의 경우 원래 메모리 위치로 swap in 해야하고,
Execution time binding의 경우 추후 빈 메모리 영역 아무곳에나 올릴 수 있다.
swap 시간의 대부분은 디스크 전송 시간이 차지한다.
메모리 관리
메모리 관리 기법은 크게 연속 메모리 관리와 불연속 메모리 관리로 나뉜다.
연속 메모리 관리
프로그램 전체가 메모리에 연속적으로 할당되어야 하는 관리 기법
- 고정 분할 기법 : 메모리가 고정된 파티션으로 분할 → 내부 단편화 발생
- 동적 분할 기법 : 파티션들이 동적 생성, 자신의 크기와 같은 파티션에 적재 → 외부 단편화 발생
Memory Fragmentation (메모리 단편화)
컴퓨터에서 어떤 프로그램을 실행할 때, 메모리의 공간을 연속적인 형태로 할당하여 사용하게 된다.
이렇게 프로그램이 메모리에 할당되고 해제되고 다시 새로운 프로그램이 할당되고 해제되고를 반복하다보면 메모리 공간이 조각조각 나뉘게 되어 실제로는 사용 가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태가 된다.
이를 메모리 단편화라고 하고 내부 단편화와 외부 단편화가 존재한다.
내부 단편화
메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비되는 상황
만약 어떤 프로그램에 OS가 5MB 만큼의 메모리를 할당하였지만 실제로는 1MB 만큼의 메모리를 사용하고 있을 경우 → 4MB 내부 단편화 발생
외부 단편화
메모리가 할당되고 해제되는 작업이 반복적으로 일어날 때 할당된 메모리와 메모리 사이에 사용하지 않는 작은 메모리가 생긴다.
총 메모리 공간은 충분하지만 실제로는 할당할 수 없는 상황이 발생하는 것을 외부 단편화라고 한다.
불연속 메모리 관리
프로그램의 일부가 서로 다른 주소 공간에 할당될 수 있는 기법
- Page : 프로세스를 고정된 크기의 작은 블록들로 나눴을 때, 그 블록들을 페이지라고 한다.
- Frame : 페이지 크기와 같은 주 기억장치 메모리 블록
- Segment : 서로 다른 크기의 논리적 단위
페이징과 세그멘테이션
페이징(Paging)
페이징이란 가상 메모리를 page라는 단위로 나누고 프로세스를 일정한 크기의 page size로 분할해서 물리 메모리에 적재하는 방식이다.
일반적으로 물리 메모리는 동일한 크기의 frame으로 논리 메모리를 동일한 크기의 page로 나눈다.
+ 참고로 page size는 하드웨어에 의해 결정된다.
페이징 테이블(Paging Table)
물리 메모리는 고정 크기의 프레임으로, 가상 메모리는 고정 크기의 페이지로 분리되어 있다.
개별 페이지는 순서에 상관없이 물리 메모리에 있는 프레임에 매핑되어 저장된다.
즉, 모든 프로세스는 하나의 페이징 테이블을 가지고 있으며 여기에는 메인 메모리에 적재되어 있는 페이지 번호와
해당 페이지가 위치한 메인 메모리의 시작 주소가 있다.
이를 통해 하나의 프로세스를 나눈 가상 메모리 페이지들이 각각 실제 메인 메모리의 어디 프레임에 적재되어 있는지 알아낼 수 있다.
PMT(Page Mapping Table, 페이징 테이블)에서는 P1 프로세스의 0번째 페이지가 메인 메모리의 5번째 프레임에 있다.
페이징의 장/단점
장점
- 논리 메모리는 물리 메모리에 저장될 때 연속되어 저장될 필요가 없고, 물리 메모리의 남는 프레임에 적절히 배치되기 때문에 외부 단편화가 생기지 않는다.
- 단순 페이징과 비교해 프로세스 전부를 로드할 필요가 없다.
- swap out이 간단하다.
- 코드를 쉽게 공유할 수 있다. read-only로 프로세스 간에 하나의 코드만 메모리에 올린다.
단점
- 내부 단편화 문제가 발생할 수 있다.
- 페이지 단위를 작게하면 해결할 수 있지만, 페이지 매핑 과정이 복잡해져 오히려 비효율적이다.
- page table이 메모리에 상주하기 때문에 메모리에 접근하는 연산은 2번의 메모리 접근이 필요하게 되어 속도가 느리다.
세그멘테이션(Segmentation)이란 ?
세그먼트는 가상 메모리를 서로 크기가 다른 논리적 단위로 분할한 것을 의미한다.
세그멘테이션은 프로세스를 물리적 단위인 페이지가 아닌 논리적 단위인 세그먼트로 분할해서 메모리에 적재하는 방식이다.
세그먼트 테이블
분할 방식을 제외하면, 페이징과 세그멘테이션이 동일하기 때문에 매핑 테이블의 동작 방식도 동일하다.
다만, 논리 주소의 앞 비트들은 페이징 번호가 아니라 세그먼트 번호가 될 것이다. 즉, <segment, offser> 형태로 구성되며, 세그먼트 번호를 통해 세그먼트의 기준 (세그먼트의 시작 물리 주소)와 한계 (세그먼트의 길이)를 파악할 수 있다.
세그멘테이션의 장/단점
장점
- 내부 단편화 문제가 해소된다.
- 보호와 공유 기능을 수행할 수 있다.
- 프로그램의 중요한 부분과 중요하지 않은 부분을 분리하여 저장할 수 있고, 같은 코드 영역은 한 번에 저장할 수 있다.
- 필요하지 않은 세그먼트들은 로드되지 않는다.
단점
- 서로 다른 크기의 Segment들이 메모리에 적재되고 제거되는 일이 반복되다보면 외부 단편화 문제가 생길 수 있다.
- 복잡한 메모리 관리로 오버헤드가 발생할 수 있다.
정리
Paging vs Segmetation
- Paging은 고정 크기를 가진다.
- Segmentation은 가변 크기를 가진다.
- Paging은 내부 단편화가 발생 가능하고 Segmentation은 외부 단편화가 발생 가능하다.
참고
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 페이지 교체 알고리즘 (0) | 2022.07.07 |
---|---|
[운영체제] 내부 단편화 vs 외부 단편화 (0) | 2022.07.07 |
[운영체제] 세마포어(Semaphore) & 뮤텍스(Mutex) (0) | 2022.04.04 |
[운영체제] 경쟁 상태(Race Condition) (0) | 2022.04.04 |
[운영체제] DeadLock (데드락) (0) | 2022.04.04 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!