각각의 프로세스는 독립된 메모리 공간을 갖고, 운영체제 혹은 다른 프로세스의 메모리 공간에 접근할 수 없는 제한이 걸려있다. 단지 운영체제만이 운영체제 메모리 영역과 사용자 메모리 영역의 접근에 제약을 받지 않는다.
Swapping : 메모리 관리를 위해 사용되는 기법. 표준 Swapping 방식으로는 round robin과 같은 스케줄링의 다중 프로그래밍 환경에서 CPU 할당 시간이 끝난 프로세스의 메모리를 보조 기억장치(Ex 하드디스크)로 내보내고 다른 프로세스의 메모리를 불러들일 수 있다.
해당 과정을 swap이라 한다. 주기억장치로 불러오는 과정을 swap in, 보조 기억장치로 내보내는 과정을 swap out이라고 한다. swap에는 큰 디스크 전송시간이 필요하기 때문에 현재는 메모리 공간이 부족할 때 swapping이 시작된다.
단편화(Fragmentation) : 프로세스들이 메모리에 적재되고 제거되는 일이 반복되다보면, 프로세스들이 차지하는 메모리 틈 사이에 사용하지 못할 만큼의 작은 자유공간들이 늘어나게 되는데, 이것을 단편화라함.
압축 : 외부단편화를 해소하기위해 프로세스가 사용하는 공간들을 한쪽으로 몰아, 자유공간을 확보하는 방법. 하지만 작업효율이 좋지않다.
하나의 프로세스가 사용하는 메모리공간이 연속적이어야한다는 제약을 없애는 메모리 관리 방법. 외부 단편화와 압축작업을 해소하기위해 생긴 방법론. 물리메모리는 Frame(페이지 프레임)이라는 고정크기로 분리되어있고, 논리메모리(프로세스가 점유하는)는 페이지라 불리는 고정크기의 블록으로 분리된다. (페이지 교체 알고리즘에 들어가는 페이지)
페이징 기법을 사용함으로써 논리메모리(물리메모리 즉 절대주소에 대비되는 개념, 상대주소, 프로그램이 사용하는 주소, 항상 0번지부터 시작, 실제 물리메모리의 적재위치에 상관없이 논리주소공간은 0번지부터 시작하고, 물리메모리에 mapping된다.)는 물리메모리에 저장될 때, 연속되어 저장될 필요가 없고, 물리메모리의 남는 프레임에 적절히 배치됨으로써 외부 단편화를 해결할 수 있는 큰 장점이 있다.
하나의 프로세스가 사용하는 (주소)공간은 여러개의 페이지로 나뉘어서 관리되고(논리메모리에서), 개별 페이지는 순서에 상관없이 물리메모리에 있는 프레임에 mapping되어 저장된다.
다만 내부단편화 문제가 발생한다.
페이징에서처럼 논리메모리와 물리메모리를 같은 크기의 블록이 아닌, 서로 다른 크기의 논리적 단위인 세그먼트로 분할. 사용자가 두개의 주소로 지정(세그먼트 넘버 + 오프셋(변위)). 세그먼트 테이블에는 각 세그먼트의 기준(세그먼트의 시작 물리주소)과 한계(세그먼트의 길이)를 저장 (base and limit)
서로 다른 크기의 세그먼트들이 메모리에 적재되고 제거되는 일이 반복되다보면, 자유공간들이 많은 수의 작은 조각들로 나누어져 못쓰게되는 외부 단편화 문제가 발생한다.
다중 프로그래밍을 실현하기 위해서는 많은 프로세스들을 동시에 메모리에 올려두어야한다. 가상 메모리는 프로세스 전체가 메모리내에 올라오지 않더라도 실행이 가능하도록 하는 기법이다. 프로그램이 물리 메모리보다 커도 된다는 장점.
실행되는 코드의 전부를 물리메모리에 존재시켜야했고, 메모리 용량보다 큰 프로그램은 실행시킬 수 없었음. 또한 여러 프로그램을 동시에 메모리에 올리기에는 용량의 한계와 페이지 교체등의 성능이슈가 발생. 또한 가끔만 사용되는 코드가 차지하는 메모리들을 확인할 수 있다는 점에서 불필요하게 전체 프로그램이 메모리에 올라와있을 필요가 없다는 것을 알 수 있다.
가상 메모리는 실제 물리메모리 개념과 사용자의 논리 메모리 개념을 분리한 것으로 정리가능. 이로써 작은 메모리를 가지고 있어도 얼마든지 큰 가상 주소공간(논리주소공간, 프로그램이 사용하는 상대주소)을 프로그래머에게 제공 가능.
한 프로세스가 메모리에 저장되는 논리적인 모습을 가상 메모리에서 구현한 공간. 프로세스가 요구하는 메모리 공간을 가상 메모리에서 제공함으로서 현재 직접적으로 필요하지 않은 메모리 공간은 실제 물리메모리에 올리지 않는 것으로 물리 메모리를 절약할 수 있다.
시스템 라이브러리
가 여러 프로세스들 사이에 공유될 수 있도록 한다. 각 프로세스들은 공유 라이브러리
를 자신의 가상 주소 공간에 두고 사용하는 것처럼 인식하지만, 라이브러리가 올라가있는 물리 메모리 페이지
들은 모든 프로세스들에게 공유되고 있다.fork()
를 통한 프로세스 생성과정에서 페이지들이 공유되는 것을 가능하게 한다.프로그램 실행 시작 시에 프로그램 전체를 디스크에서 물리 메모리에 적재하는 대신, 초기에 필요한 것들만 적재하는 전략. 프로세스에서 요청할 때 디스크에서 옮겨온다.