커널이 페이징 / 가상 메모리를 지원할 때 Linux가 스왑 파티션을 사용하는 이유는 무엇입니까?


23

페이징 및 스와핑을 이해하는 한 완전히 다른 개념입니다. 스와핑은 프로세스가 실제 메모리 또는 하드 드라이브에 완전히 있다는 것을 의미하지만 프로세스의 페이징 부분은 실제 메모리에 있고 다른 부분은 하드 드라이브에있을 수 있습니다.

그렇다면 왜 리눅스에 스왑 파티션이 필요한가? 실제 메모리가 가득 찬 경우 일부 프로세스가 하드 드라이브로 아웃소싱되고 새 프로세스가 가상 메모리에서 실제 메모리로 매핑됩니다.

왜 스왑 파티션 (또는 일반적으로 스왑)이 필요한지 모르겠습니까?

아니면 이것은 용어의 문제 swap partition == virtual memory입니까?


5
컴퓨터 아키텍처의 "가상 메모리"는 기술인 반면 MS Windows (잘못된 IMO)는 "가상 메모리는 Windows가 RAM (Random Access Memory)과 함께 사용하는 컴퓨터 하드 디스크의 저장 공간"으로 정의합니다 . IE 구글 윈도우 "가상 메모리"
톱밥

답변:


25

예, 그것은 용어의 문제 일뿐입니다. 많은 경우 스왑 파티션이 가상 메모리로 사용됩니다.

UNIX 및 UNIX 계열 시스템이 페이지 파일보다 스왑 파티션을 선호하는 이유는 분할 될 수있는 페이지 파일에 비해 검색 시간이 더 짧아 연속적 일 수 있기 때문입니다.


6
이 방법으로 Linux 설치간에 단일 스왑 파티션을 공유하는 것이 더 쉽습니다.
oKtosiTe

3
일반적으로 페이지 파일은 첫 번째 부팅에서 완전히 생성되므로 조각화되지 않습니다. (아직도 몇 가지 가능성이 있습니다.)
AndreaCi

12
가장 초기의 UNIX는 페이징이 아닌 스왑 만했으며 전용 파티션으로 만 스왑 할 수있었습니다. 하드웨어가이를 지원하자마자 페이징이 구현되었지만 "스왑 파티션"이라는 이름이 멈췄습니다. 파일로의 페이징이 더 최근에 이루어졌으며 조각화의 위험이있을뿐만 아니라 더 높은 OS 오버 헤드가 있으므로 여전히 권장하지 않습니다.
zwol

1
"스왑 파티션은 가상 메모리로 사용됩니다." -Microsoft Windows 만 보조 스토리지 (예 : 디스크의 페이지 파일)를 "가상 메모리"로 정의합니다. 그러나 그들은 심지어이 사용법에서 벗어나려고 노력하고 있습니다. 인터넷 검색 창 "가상 메모리"를 시도 하고 첫 번째 결과 ( "가상 메모리는 저장 공간입니다 ...")에 대한 개요가 페이지 내용과 일치하지 않습니다. 올바른 진술은 "스왑 파티션이 가상 메모리에 의해 사용됨 "입니다.
톱밥

14

"스와핑은 프로세스가 실제 메모리 나 하드 드라이브에 있다는 것을 의미합니다."라는 개념을 어디에서 얻었는지 모르겠습니다. 그 의미는 수십 년 동안 사용되지 않았습니다. 인용 위키 백과 :

역사적으로, 스와핑은 롤인 / 롤아웃 (roll-in / roll-out)이라는 방식으로 한 번에 전체 프로그램을 2 차 스토리지로 이동하거나 2 차 스토리지로 이동하는 것을 말합니다. 1960 년대에 세그먼트 또는 페이지를 사용하는 두 가지 변형으로 가상 메모리 개념이 도입 된 후 스와핑이라는 용어가 디스크와 메모리 사이에서 세그먼트 또는 페이지를 이동하는 데 각각 적용되었습니다. 오늘날 가상 메모리는 주로 세그먼트가 아닌 페이지를 기반으로하며 스와핑은 한 가지 차이점이 있지만 페이징과 상당히 유사합니다.

실제로, 리눅스 (또는 그 문제에 대한 다른 유닉스 시스템)와 관련된 어떤 상황에서든 페이징스와핑 은 거의 동의어입니다. 둘 다 페이지 데이터를 RAM 또는 디스크에 저장할 수있는 가상 메모리 사용을 나타냅니다. 메모리 페이지를 사용하는 프로그램은 데이터가 저장된 위치를 신경 쓰거나 알지 못하고 가상 주소를 계속 사용합니다. 커널은 RAM과 디스크간에 데이터를 전송하고 MMU 테이블을 업데이트하여 가상 주소 항목이 메모리의 물리적 페이지를 가리 키거나 프로세서가 일부 커널 코드를 실행하도록하는 특수한 값을 포함하도록합니다. 디스크에서 적절한 데이터를로드합니다.

페이징 은이 일반적인 프로세스를 말합니다. 스와핑 은 디스크상의 데이터가 전용 영역 인 스왑 영역 (스왑 파티션 또는 스왑 파일)에있는 경우를 말합니다. RAM과 파일간에 페이징을 수행 할 수도 있으며,이 경우 일반적으로 스와핑 이라고하지 않습니다 . 예를 들어, 프로그램을 실행할 때는 코드를 메모리에로드하여 실행해야합니다. 다른 무언가를위한 공간을 만들기 위해 RAM에서 코드 페이지를 제거해야하는 경우이 페이지를 스왑 영역에 쓸 필요가 없습니다. 프로그램 파일에서 다시로드 할 수 있기 때문입니다. (이것은 프로그램 코드뿐만 아니라 모든 읽기 전용 데이터에 대해 수행 할 수 있습니다.)

실제 메모리가 (거의) 가득 찬 경우, 커널은 최근에 사용되지 않은 RAM의 페이지 (전체 프로세스가 아님)를 찾습니다. 해당 페이지가 디스크 파일의 내용을 재생산하면 (커널에이를 표시하기 위해 테이블이 있음) 페이지를 재 확보 할 수 있습니다. 그렇지 않은 경우 페이지가 스왑되도록 기록 된 다음 회수됩니다. 커널이 프로세스의 가상 메모리 테이블 (프로세스가 실행되는 동안 MMU 테이블이 됨)의 항목을 업데이트하여 RAM이 아닌 것으로 표시 한 후 다른 페이지 (다른 프로그램 또는 다른 페이지의 물리적 페이지를 재사용 할 수 있음) 같은 프로그램).


답의 첫 번째 단락은 그가 어디에서 아이디어를 얻었는지 알려줍니다 : 오래된 문서. 스왑과 페이징의 차이가있을 때도 기억합니다.
RonJohn

9

가상 메모리 / 페이징 기능을 통해 커널은 메모리를 사용자 공간 프로세스에 "가상화"할 수 있습니다. 커널은 실제 메모리에서 페이지를 가져와 페이징을 통해 정렬하여 사용자 공간 프로세스에 연속적으로 표시되도록 할 수 있습니다.

사용자 공간 프로세스의 메모리에 제한을 설정할 수 있으며 프로세스가 메모리 공간을 넘어 서면 "페이지 오류"가 발생하여 CPU 예외가 커널로 되돌아옵니다. 이것은 사용자 공간 프로그램이 커널의 허가없이 커널이나 다른 프로그램에 할당 된 메모리를 망칠 수 없도록합니다.

일반적으로 사용자 공간 프로그램은 잘 정의 된 인터페이스 ( 예 : C 함수 malloc()등) free()를 통해 커널에이 제한을 확장하도록 요청합니다 . 커널은 프로그램이 얼마나 많은 메모리를 할당했는지 추적 할 책임이 있습니다.

커널이 메모리를 오버 프로비저닝 할 수 있고 (Windows와 Linux가이를 지원하는 경우) 스왑이라고하는 이유는이 "페이지 결함"메커니즘을 통해 프로세스가 디스크에서 하나의 페이지로 액세스하려고 시도한 페이지를 커널이 스왑 할 수 있습니다. 메모리 액세스가 실제로 유효하지 않은 경우 (즉, 프로세스가 먼저 메모리에 액세스하려고하지 않은 경우) SIGSEGV로 프로세스가 종료됩니다.

따라서 "스와핑"은 가상 메모리 / 페이징에 의존하는 추가 기능 (Linux에서는 원하는 경우 완전히 비활성화 할 수 있음)이지만 CPU에 가상 메모리 / 페이징이 있기 때문에 필요하지 않습니다. 개념은 동일하지 않지만 스와핑은 존재하는 페이징 / 가상 메모리에 따라 다릅니다.


또한 귀하의 질문을 더 자세히 읽은 후 "페이징"은 때때로 "스와핑"에 대한 동의어로 사용되지만 "스와핑"에 대해 들어 본 적이 없습니다. 스왑 아웃되었습니다.

그렇다면 왜 리눅스에 스왑 파티션이 필요한가? 실제 메모리가 가득 찬 경우 일부 프로세스가 하드 드라이브로 아웃소싱되고 새 프로세스가 가상 메모리에서 실제 메모리로 매핑됩니다.

"가상 메모리" 물리적 메모리이며 "매핑"입니다. MMU 하드웨어는 저장 장치에 직접 매핑 할 수 없습니다. MMU는 커널에게 프로세스가 가지고 있지 않은 메모리에 액세스하려고 시도했음을 알리는 결함을 발생시킬 수 있습니다. 커널은이 메커니즘을 사용하여 프로세스가 디스크에서 무언가가 메모리에 있다고 생각한 것을 확인한 다음 " 교환". 요점은 페이지를 디스크에 저장하여 하드웨어가 아닌 다른 프로세스에 해당 페이지를 사용할 수 있도록 결정하는 운영 체제입니다.


2

일반적으로 스왑 파티션은 가상 메모리와 다릅니다.

프로세스는 실제 물리적 메모리보다 더 많은 메모리가 필요할 수 있으므로 OS 개발자는 시스템에 "가상 메모리"라고하는 더 많은 메모리가 있다고 가정했습니다.

이 가상 메모리는 기본적으로 실제 메모리이며 디스크의 일부입니다. 디스크에서이 부분을 Linux에서 "스왑"이라고합니다.

또한 개발자는 하드 디스크에있는 가상 메모리 부분의 사용이 가능한 한 낮아야한다고 제안했습니다. 이를 위해 모든 가상 메모리를 "페이지"라고하는 작은 부분으로 나누었습니다. 많은 페이지가 낮은 속도로 사용되므로 이러한 페이지는 하드 디스크의 가상 메모리 부분에 기록되어야합니다. 이 작업을 "스왑 아웃"이라고합니다. OS는 실제 메모리에없는 페이지를 추적하여 필요할 때 찾아야합니다. 프로그램이 스왑 아웃 된 메모리의 일부를 쓰거나 읽으려고 할 때 페이지 폴트가 발생합니다.

귀하의 질문에 대답하기 위해 : Linux는 일부 메모리 페이지를 스왑하기 위해 스왑 파티션이 필요하며 다음을 사용하여 가상 메모리 사용 통계를 볼 수 있습니다 vmstat.

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache    si   so    bi    bo   in   cs us sy id wa
2  0  35424 524560 134164 1858728    0    0    13    11   55   42  5  1 94  0
0  0  35424 526720 134164 1857872    0    0     0     0 2774 5224  7  2 91  0
1  0  35424 516328 134172 1870116    0    0     0     6 3464 6561 13  3 84  0
0  0  35424 522992 134212 1862676    0    0     0   125 4135 7135 12  4 84  1

'스왑'열에는 스왑 아웃 및 통계가 표시됩니다. 또한 이 링크 는 가상 메모리와 사용법도 설명합니다 vmstat.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.