메인 메모리
배경
CPU는 pc(program counter)가 지시하는대로 메모리부터 다음 수행할 명령어를 가져오는데 그 명령어는 필요한 경우 추가적인 데이터를 더 가져올 수 있으며 반대로 데이터를 메모리로 내보낼 수도 있다.
기본 하드웨어
메인 메모리와 각 처리 코어에 내장된 레지스터들은 CPU가 직접 접근할 수 있는 유일한 범용 장치이다.
- 모든 실행되는 명령어와 데이터들은 CPU가 직접적으로 접근할 수 있는 메인 메모리와 레지스터에 있어야 한다.
- 데이터가 메모리에 없다면 CPU가 그것들을 처리하기 전에 메모리로 이동시켜야 한다.
메인 메모리를 사용하는 프로그램들이 제대로 동작하기 위해서는 운영체제 영역 뿐만 아니라 사용자 프로그램 사이도 서로 보호해야 한다.
- 운영체제가 CPU와 메모리 간의 접근 중에 개입하게 되면 성능이 떨어지기 때문에 이러한 보호기법에 반드시 하드웨어가 지원하여야 한다.
- 기준(base)과 상한(limit) 레지스터를 이용해 프로그램을 보호할 수 있다.
- 기준 레지스터 : 가장 작은 합법적인 물리 메모리의 주소 값 저장
- 상한 레지스터 : 주어진 영역의 크기를 저장
- 예) 기준 레지스터가 300040이고 상한 레지스터 값이 120900이면 프로그램은 30040에서 420940까지의 모든 주소가 접근 가능하다.
- 사용자 모드에서 수행되는 프로그램이 운영체제나 다른 사용자 프로그램의 메모리 공간에 접근하면 운영체제는 트랩(trap)을 발생시킨다.
- 기준과 상한 레지스터는 여러 가지 특권 명령을 사용하는 운영체제에 의해서만 적재된다.
- 특권 명령은 커널 모드에서 수행되고, 운영체제만 커널 모드에서만 수행된다.
- 사용자 프로그램이 레지스터의 값을 변경하는 것을 막는다.

기준과 상한 레지스터로 주소를 보호하는 하드웨어 그림
주소의 할당
프로그램을 실행하려면 프로그램을 메모리로 가져와서 프로세스 문맥 내에 배치해야 한다. 대부분의 시스템은 사용자 프로세스가 메모리 내 어느 부분으로도 올라올 수 있도록 지원하고 있다.
소스 프로그램에서 주소는 숫자가 아닌 심볼 형태로 표현된다. 컴파일러는 이 심볼 주소를 재배치 가능 주소(예를 들어 이 모듈의 첫 번째 바이트로부터 n번째 바이트 주소)로 바인딩 시키고, 다음에 링커(linker)나 로더(loader)가 재배치 가능 주소를 절대 주소(특정 주소)로 바인딩 시킨다.
바인딩이 이루어지는 시점에 따른 구분
- 컴파일 시간(compile time) 바인딩 : 프로세스가 메모리 내에 들어갈 위치를 컴파일 시간에 알 수 있으면 컴파일러는 절대 코드를 생성할 수 있다. 컴파일 시간에 물리 주소가 결정된다. 물리 주소를 변경하려면 다시 컴파일 해야 한다.
- 적재 시간(load time) 바인딩 : 프로세스가 메모리 내에 들어갈 위치를 컴파일 시점에 알지 못한다면 컴파일러는 이진코드를 재배치 가능 코드로 만든다. 프로그램이 메인 메모리로 적재될 때 심볼과 진짜 번지수의 바인딩이 이루어진다. 프로그램의 시작 주소가 변경되면 사용자 코드를 다시 적재하기만 하면 된다.
- 실행 시간(execution time) 바인딩 : 프로세스가 실행하는 중간에 메모리 내의 한 세그먼트로부터 다른 세그먼트로 옮겨질 수 있다. 실행 도중에 물리 주소가 변경될 수 있다.
논리 VS 물리 주소 공간
- 논리 주소(logical address)
- CPU가 생성하는 주소
- 물리 주소(physical address)
- 메모리가 취급하는 주소(메모리 주소 레지스터에 주어지는 주소)
컴파일 또는 적재 시에 주소를 바인딩하면 논리 주소와 물리 주소가 같다. 그러나 실행 시간 바인딩 기법에서는 논리, 물리 주소가 다르다. 이러한 논리 주소를 가상 주소(virtual address)라고 한다.
프로그램의 실행 중에는 가상 주소를 물리 주소로 변경해야 하는데, 이 변환 작업은 하드웨어 장치인 메모리 관리 장치(memory management unit, MMU)에 의해 실행된다.

기준 레지스터(재배치 레지스터(relocation register))를 이용한 동적 재배치
사용자 프로그램은 논리주소 346번지에 접근 할 때, 메인 메모리의 14346번지에 접근하게 된다.
- 사용자 프로그램은 논리 주소를 사용하지만, 메모리 하드웨어가 논리 주소를 실제 주소로 변경한다.
동적 적재
프로세스가 실행되기 위해 프로세스 전체가 메인 메모리에 올라와야 할 경우, 프로세스의 크기가 메인 메모리의 크기보다 커서는 안된다. 메모리 공간의 효율적 이용을 위해서는 동적 적재(dynamic loading)을 해야 한다.
동적 적재의 동작
- 각 루틴은 실제 호출되기 전까지 메모리에 올라오지 않고 재배치 가능한 상태로 디스크에서 대기 한다.
- main 프로그램이 메인 메모리에서 실행되는 도중에 다른 루틴을 호출하면 호출된 루틴이 메모리에 적재되었는지 조사한다.
- 적재 되어있지 않다면 루틴을 메모리로 가져오고, 이러한 변화를 테이블에 기록한다.
- 그 후 CPU 제어는 중단되었던 루틴으로 보내진다.
동적 적재의 장점
- 루틴이 필요한 경우에만 적재된다.
- 오류 처리 루틴과 같이 간혹 발생하면서 실행할 코드가 많은 경우 유용하다.
- 프로그램의 크기가 크지만 사용되는 부분은 작을 수 있다.
- 오류 처리 루틴과 같이 간혹 발생하면서 실행할 코드가 많은 경우 유용하다.
동적 연결 및 공유 라이브러리
동적 연결 라이브러리(DLLs, Dynamically linked libraries)는 사용자 프로그램이 실행될 때, 사용자 프로그램애 연결되는 시스템 라이브러리이다.
동적 연결의 개념은 동적 적재와 비슷하다. 동적 적재에서는 로딩(loading)이 실행 시까지 미루어 졌지만, 동적 연결에서는 연결(linking)이 실행 시기까지 미루어지는 것이다.
동적 연결이 없다면 시스템의 각 프로그램은 실행 가능 이미지에 해당 언어 라이브러리의 사본을 포함해야 한다.
- 실행 가능 이미지의 크기를 증가시키고, 메인 메모리를 낭비한다.
DLL은 라이브러리를 여러 프로세스간에 공유할 수 있어 메인 메모리에 DLL 인스턴스가 하나만 있을 수 있게 한다.
라이브러리를 갱신할 때, 새로운 버전으로 교체하면 라이브러리를 사용하는 모든 프로그램은 새로운 버전의 라이브러리를 사용할 수 있다. 동적 연결이 없었다면 새로운 라이브러리를 사용하기 위해 모든 프로그램은 새로 링크 되어야 한다.
연속 메모리 할당
메모리 보호
시스템이 상한 레지스터와 재배치 레지스터를 가지고 있다면 프로세스가 자신이 소유하지 않은 메모리를 접근할 수 없게 강제할 수 있다.
재배치 레지스터는 가장 작은 물리 주소의 값을 저장하고, 상한 레지스터는 논리 주소의 범위 값을 저장한다. 각각의 논리 주소는 상한 레지스터가 지정한 범위 안에 존재해야 한다. MMU는 동적으로 논리 주소에 재배치 레지스터의 값을 더함으로써 주소를 변환하는 역할을 한다.

CPU 스케줄러가 다음에 수행할 프로세스를 선택할 때, 디스패처는 문맥 교환의 일환으로 재배치 레지스터와 상한 레지스터에 정확한 값을 적재한다.
- CPU가 생성하는 모든 주소는 이 레지스터들을 통해 확인되기 때문에, 현재 실행 중인 프로세스가 운영 체제와 다른 사용자들의 프로그램 및 데이터를 수정하지 못하도록 보호할 수 있다.
메모리 할당
가변 파티션 기법
- 프로세스를 메모리의 가변 크기 파티션에 할당한다.
- 하나의 파티션에 하나의 프로세스만 적재된다.
- 사용 가능한 메모리 부분과 사용 중인 부분을 나타내는 테이블을 유지한다.
- 사용 가능한 메모리를 hole로 간주한다.

그림은 가변 파티션의 예이다.
- 5번, 8번, 2번 프로세스가 할당되었다가, 8번 프로세스가 종료되면 하나의 hole이 생긴다. 이후 9번 프로세스가 도착하고 메모리가 할당된다. 5번 프로세스가 종료되면 두 개의 hole이 생긴다.
운영체제의 공간 할당
- 프로세스가 들어오면 메모리를 얼마나 요구하고, 사용 가능한 메모리 공간이 얼마나 있는지 고려하여 공간을 할당한다.
- 메모리가 충분하지 않으면 오류 메시지를 제공하거나, 프로세스를 대기큐에 넣을 수 있다.
- 대기큐에 넣었을 경우, 다른 프로세스의 메모리가 나중에 해제되면 운영체제는 대기큐를 검사하여 대기 프로세스의 메모리 요구를 충족시킬지 여부를 결정한다.
동적 메모리 할당 문제(dynamic storage allocation problem)
- 일련의 가용 공간 리스트로부터 크기 n-바이트 블록을 요구할 떄 어떻게 만족시켜 줄 것이냐 결장하는 문제
- 동적 메모리 할당 문제에 대한 세 가지 해결책
- 최초 적합 : 첫 번째 사용 가능한 공간을 할당한다. (맨 처음 찾은 사용 가능한 공간)
- 최적 적합 : 사용 가능한 공간 중에서 가장 작은 것을 선택한다.
- 최악 적합 : 가장 큰 가용 공간을 선택한다.
최적 적합이나 최악 적합의 경우 리스트가 크기 순으로 정렬 되어 있지 않으면 전체 리스트를 검사해야 한다.
최초 적합이나 최적 적합이 시간과 메모리 이용 효율 측면에서 최악 적합보다 좋다.
속도 측면에서 최초 적합과 최적 적합중에는 일반적으로 최초 적합이더 빠르다.
단편화
최초 적합과 최적 적합은 외부 단편화(external fragmentation)가 생길 수 있다.
외부 단편화(external fragmentation)
- 프로세스들이 메모리에 적재되고 제거되는 일이 반복되면, 중간에 가용공간이 작은 조각들이 생기게 된다. 작은 조각들을 합치면 프로세스가 적재될 수 있는 충분한 가용 공간이 되지만 많은 수의 매우 작은 조각들로 단편화 되어 있기 때문에 프로세스가 적재될 수 없다.
- 압축을 이용해 문제를 해결 할 수 있다.
- 재배치가 어셈블 또는 정적 시간에 행해진다면 실행될 수 없다. 프로세스들의 재배치가 실행시간에 동적으로 이루어지는 경우에만 가능하다.
- 페이징을 이용해 해결할 수 있다.
- 프로세스의 논리 주소 공간을 여러 개의 비연속적인 공간으로 나누어 물리 메모리에 할당한다.
메모리 공간을 낭비하는 현상인 단편화는 내부적으로도 발생할 수 있다.
내부 단편화(internal fragmentation)
- 프로세스가 요청하는 메모리보다 더 큰 메모리가 할당되었을 때, 메모리 일부가 낭비된다.
페이징
페이징 기법에서는 프로세스의 물리 주소 공간이 연속되지 않아도 메모리를 할당할 수 있다.
기본 방법
물리 메모리는 프레임(frame)이라 불리는 같은 크기 블록으로 나누어진다.
논리 메모리는 페이지(page)라 불리는 같은 크기의 블록으로 나누어진다.
프로세스가 실행될 때 그 프로세스의 페이지는 파일 시스템 또는 예비 저장장치로부터 가용한 메인 메모리 프레임으로 적재된다.
CPU로 부터 생성된 모든 주소는 페이지 번호(p)와 페이지 오프셋(d: offset)두 개의 부분으로 나누어진다.
페이지 번호는 프로세스별 페이지 테이블(page table)의 인덱스로 사용된다.
CPU에 의해 생성된 논리주소를 물리주소로 변환하기 위해 MMU가 수행하는 단계
- 페이지 번호 p를 추출하여 페이지 테이블의 인덱스로 사용한다.
- 페이지 테이블에서 프레임 번호 f를 추출한다.
- 논리 주소의 페이지 번호p를 프레임 번호 f로 바꾼다.

페이징 기법은 외부 단편화가 발생하지 않지만 내부 단편화가 발생한다.
- 마지막 페이지가 프레임보다 작으면 내부 단편화가 발생한다.
페이징의 중요한 특징
- 메인 메모리에는 여러 프로그램들이 여러 프레임으로 곳곳에 분산되어 있다.
- 사용자 프로세스는 자신의 메모리가 아닌 메모리에 접근할 수 없다.
- 페이지 테이블을 통하지 않고 다른 공간에 접근할 수 없으며, 페이지 테이블은 그 프로세스가 소유하고 있는 페이지들만 가리킨다.
- 사용자 프로세스는 자신의 메모리가 아닌 메모리에 접근할 수 없다.
운영체제는 물리 메모리를 관리하기 때문에 물리 메모리의 자세한 할당에 대해 파악하고 있어야 한다.
- 프레임 테이블(frame table) 자료구조를 사용한다.
- 각 프레임당 하나의 항목(entry)을 가지고 있다.
- 프레임이 비어 있는지, 할당되었는지, 할당 되었다면 어느 프로세스의 어느 페이지에 할당되어 있는지를 나타낸다.
운영체제는 모든 프로세스들의 주소를 실제 주소로 매핑할 수 있어야 한다.
- 운영체제는 각 프로세스의 페이지 테이블 사본을 유지한다.
- 논리 주소를 물리 주소로 변환하는데 사용한다.
하드웨어 자원
페이지 테이블은 프로세스별 자료구조이므로 페이지 테이블에 대한 포인터는 각 프로세스의 프로세스 제어 블록에 다른 레지스터 값과 함께 저장된다.
페이지 테이블의 하드웨어 구현 방법
- 레지스터를 이용한 페이지 테이블 구성
- 페이지 테이블이 작은 경우 가능하다.
- 주소변환을 효율적으로 할 수 있으나, 문맥 교환 중에 각각의 레지스터가 교체되어야 하므로 문맥 교환 시간을 증가시킨다.
- 페이지 테이블 기준 레지스터(page-table base register, PTBR)를 사용한 방법
- 현대 CPU는 큰 페이지 테이블을 지원하므로 이 방법이 적합하다.
- 페이지 테이블을 메인 메모리에 저장하고 페이지 테이블 기준 레지스터로 하여금 페이지 테이블을 가리키도록 한다.
- 다른 페이지 테이블을 사용하려면 이 레지스터만 변화시키면 된다.
- 문맥 교환의 속도가 줄어든다.
Translation Look-Aside Buffer(TLB)
메모리에 접근하려면 페이지 번호를 기준으로 PTBR의 오프셋 값을 사용하여 페이지 테이블의 항목을 찾고, 찾은 항목을 통해 얻은 프레임 번호와 페이지 오프셋을 이용하여 메모리에 액세스한다.
- 두 번의 메모리 액세스가 발생한다.
TLB(translation look-aside buffers)
- 두 번의 메모리 액세스를 해결해준다.
- TLB의 항목(엔트리)은 키(key)와 값(value) 두 부분으로 구성된다.
- 요청이 들어오면 요청의 키 값과 TLB의 키 값(페이지 번호)들을 비교하여 같은 것이 존재하면 그에 대응하는 프레임 번호를 알려준다.
페이지 번호가 TLB에 없으면 페이지 테이블을 참조하여 메모리에 액세스한다.

TLB 적중과 TLB 미스일때 동작하는 방식
TLB가 가득 찼을 경우 기존 항목 중에 교체될 항목을 선택해야 한다.
- LRU, 라운드 로빈, 무작위 등 다양항 정책이 사용된다.
- 몇몇 CPU는 운영체제가 LRU 항목 교체에 참여하는것을 허용하지만, 다른 CPU는 자신이 직접 선택한다.
- 몇몇 TLB는 특정 항목을 고정한다. 보통 중요 커널 코드를 고정한다.
어떤 TLB는 각 항목에 ASIDs(address-space identifiers)를 저장하기도 한다.
- TLB 항목이 어느 프로세스에 속한 것인지 알려준다.
- TLB에서 가상 주소 변환시 수행 중인 프로세스의 ASID와 TLB항목에 있는 ASID와 같은지 검사한다.
- 일치하지 않으면 TLB 미스이다.
- TLB에서 가상 주소 변환시 수행 중인 프로세스의 ASID와 TLB항목에 있는 ASID와 같은지 검사한다.
- ASID 지원이 있으면 한 TLB안에 여러 프로세스의 정보를 동시에 보관할 수 있다.
- ASID가 없다면 프로세스가 문맥 교환을 해서 실행을 재개하는 경우 TLB는 전부 플러시 되어야 한다.
- 플러시 되지 않으면 이전 프로세스가 사용하던 페이지 번호와 프레임 번호가 남아서 무효가 된 주소를 공급해 줄 수 있다.
- ASID가 없다면 프로세스가 문맥 교환을 해서 실행을 재개하는 경우 TLB는 전부 플러시 되어야 한다.
보호
페이징 환경에서 메모리 보호는 각 페이지에 붙어 있는 보호 비트에 의해 구현된다. 이 비트들은 보통 페이지 테이블에 속해 있다.
- 비트는 읽기-쓰기 또는 읽기 전용임을 정의할 수 있다. 읽기 전용 페이지일 때 쓰기를 시도하면 운영 체제가 하드웨어 트랩을 발생시킨다.
페이지 테이블의 각 엔트리에는 유효/무효(valid/invalid)라는 비트도 존재한다. 이 비트가 유효로 설정되면 그 페이지는 프로세스의 합법적인 페이지를 나타내며, 무효로 설정되면 그 페이지는 프로세스의 논리 주소 공간에 속하지 않는다는 것을 나타낸다.

14비트의 주소 공간(0 ~ 16,383)을 갖는 시스템이 있다고 가정하면, 위 그림에서 프로그램은 0에서 10,468의 주소를 가지고 있기 때문에. 0,1,2,3,4,5의 주소는 페이지 테이블을 통해 정상적으로 매핑된다.(2048 * 5 + 228) 만약, 6,7에서 주소를 매핑하려고 시도하면 트랩이 발생한다.(무효 비트 이므로)
페이지 테이블 길이 레지스터(page table length register, PTLR)
- 프로세스가 자신의 모든 주소 범위를 사용하는 경우는 드물다. 일정한 시각에 일부분을 집중적으로 사용한다.
- 이 경우 모든 페이지에 페이지 테이블 항목을 배정하는 것은 낭비이다.
- 이 경우 몇몇 시스템에서 PTLR 레지스터를 제공한다.
- 프로세스는 자신이 제시한 주소가 유효한 범위 내에 있는지 확인하기 위해 모든 논리 주소 값이 PTLR 값과 비교된다.
- 오류가 나타나면 트랩이 발생한다.
공유 페이지
페이징의 장점
- 공통의 코드를 공유할 수 있다.
코드가 재진입 코드인 경우 아래 그림과 같이 공유될 수 있다.

재진입 코드
- 자체 수정을 할 수 없는 코드로, 실행 중에 절대 변경되지 않는다.
- 따라서 두 개 이상의 프로세스가 동일한 코드를 동시에 실행할 수 있음
페이지 테이블의 구조
계층적 페이징
현대의 컴퓨터는 큰 주소 공간을 가지고 있기 때문에 페이지 테이블도 커지게 된다.
- 32비트 논리 주소 공간을 가진 시스템이 있다고 가정
- 페이지의 크기는 4KB(2^12) 이고, 페이지의 각 엔트리(항목)은 4B라고 가정하면
- 페이지 테이블은 2^32 / 2^12 = 2^20개의 항목으로 구성된다.
- 2^20개의 항목이 각각 4B의 크기를 가지면 프로세스마다 페이지 테이블을 위한 용량 4MB가 필요하다.
프로세스마다 4MB의 페이지 테이블을 갖는 방법 대신 2단계 페이징 기법(two-level paging scheme)을 사용할 수 있다.

- 32비트중 20비트는 페이지 번호로 구성되고 12비트는 오프셋으로 구성하면 다음과 같다.
- 외부 페이지 테이블 P1과 내부 페이지 테이블 P2는 각각 10비트를 할당 받는다.
- 외부 페이지는 2^10 X 4B = 4KB의 용량을 차지하게 된다.
- 외부 페이지의 항목은 내부 페이지의 엔트리를 가리킨다.

비트수가 64비트일 경우 계층적 페이지 테이블이 부적합하다.
- 바깥 페이지를 2단계로 나눌 경우 페이지 테이블의 크기가 커짐
- 단계를 더 나누어서 N단계 페이징을 할 수 있다.
- 논리 주소를 매핑하기 위해 많은 메모리 접근이 필요하기 때문에 비현실적이다.
해시 페이지 테이블
주소 공간이 32비트보다 커지면 가상 주소를 해시로 사용하는 해시 페이지 테이블을 많이 사용한다.
- 해시 페이지 테이블의 각 항목은 열결리스트를 가지고 있다.
- 각 원소는 세개의 필드를 가지고 있다.
- 가상 페이지 번호
- 매핑되는 페이지 프레임 번호
- 연결 리스트상의 다음 원소 포인터
해시 페이지 테이블의 알고리즘 수행 동작
- 가상 주소 공간으로 부터 페이지 번호가 오면 해싱한다.
- 해싱한 값을 이용해 페이지 테이블의 연결리스트를 따라가며 가상 페이지 번호와 비교한다.
- 일치되면 그에 매핑되는 페이지 프레임 번호를 가져와 물리주소를 얻는다.
- 일치되지 않으면 그 다음 원소로 이동하여 비교한다.

역 페이지 테이블
일반적인 페이지 테이블의 단점 중 하나는 메모리를 많이 사용할 수 있다는 것이다.
- 프로세스마다 페이지 테이블을 가지고 있으며, 각 페이지 테이블의 항목이 수백만 개가 될 수 있다.
이를 해결하기 위해 역 페이지 테이블(inverted page table)을 사용할 수 있다.
- 역 페이지 테이블은 물리 메모리 프레임마다 하나의 엔트리를 할당한다.
- 엔트리마다 페이지 주소, 그 페이지를 소유하고 있는 프로세스 ID등을 표시한다.
- 그렇게 된다면 시스템에서 단 하나의 페이지 테이블만 존재하게 된다.
가상 주소 변환 방식(IBM RT)
- 가상 주소는 <process-id, page-number, offset>으로 구성된다.
- 역 페이지 테이블 엔트리는 <process-id, page-number> 쌍으로 이루어진다.
- process-id는 주소 공간 ID의 역할을 한다.
- 메모리 참조가 발생하면 <process-id, page-number> 정보가 메모리 하부 시스템으로 전달된다.
- 역 페이지 테이블에서 일치하는 것이 있는지 검사하고, 일치하는 것이 i번째 엔트리에서 발견되면 물리주소는 <i, offset>이 되고, 일치하는 것이 없으면 잘못된 메모리 접근으로 간주한다.

역 페이지 테이블의 장점과 단점
- 장점
- 페이지 테이블 및 메모리의 크기가 작아진다
- 단점
- 역 페이지 테이블은 물리 주소를 기준으로 정렬되지만, 가상 주소를 이용하여 검색해야 하므로, 매번 페이지 테이블 전체를 검색해야 할 수도 있다.
- 공유 메모리 문제가 발생할 수 있다.
- 일반적인 페이지 테이블에서는 여러 가상 주소가 동일한 물리 메모리를 공유할 수 있지만, 역 페이지 테이블에서는 하나의 가상 주소만 물리 메모리에 매핑된다. 다른 프로세스가 동일한 페이지에 접근하려 할 때 페이지 폴트가 발생한다.
스와핑
프로세스가 실행되기 위해서는 프로세스의 명령어와 명령어가 접근하는 데이터가 메모리에 있어야 한다.
- 프로세스 또는 프로세스의 일부분은 실행 중에 임시로 백업 저장장치(backing store)로 내보내 졌다가 실행을 계속하기 위해 다시 메모리로 되돌아 올 수 있다.
- 물리 메모리 주소 공간 보다 모든 프로세스의 물리 주소 공간 크기의 총합이 큰 경우 스와핑을 이용하면 프로세스를 동시에 실행하는 것이 가능하다.

기본 스와핑
메인 메모리와 백업 저장장치간에 전체 프로세스를 이동한다.
- 백업 저장장치는 일반적으로 빠른 보조장치이다.
- 백업 저장장치는 프로세스의 필요한 부분을 저장하고 복원할 수 있을만큼 충분히 커야 한다.
- 프로세스 또는 그 일부가 보조 저장장치로로 스와핑될 때, 해당 프로세스와 관련된 데이터 구조들이 보조 저장소에 기록되어야 한다.
- 멀티스레드 프로세스의 경우, 각 스레드별 데이터 구조도 스왑되어야 한다. 운영체제는 또한 스와핑된 프로세스를 추적하는 메타데이터를 유지해야 하며, 이를 통해 해당 프로세스가 메모리로 다시 스와핑될 때 복원할 수 있다.
스와핑 장점
- 물리적인 메모리를 초과하여 더 많은 프로세스를 수용할 수 있다.
- 유휴 또는 대부분의 시간을 유휴 상태로 보내는 프로세스가 스와핑에 적합한 후보이다.
페이징에서의 스와핑
메모리와 백업 저장장치 간에 프로세스 전체를 이동하는 데는 시간이 오래 걸리기 때문에 최신 운영체제에서는 사용하지 않는다. 대신에 대부분의 시스템은 프로세스 전체가 아닌 프로세스 페이지를 스왑할 수 있는 변형 스와핑을 사용한다.
- 물리 메모리를 초과할당 할 수 있다.
- 적은 수의 페이지만 스왑에 관여하기 때문에, 프로세스 전체를 스왑하는 비용은 발생하지 않는다.
