메모리가 가득 차면 어떤 일이 발생합니까? 페이지가 제거되거나 전체 프로세스가 종료됩니까?

메모리가 가득 차면 어떤 일이 발생합니까? 페이지가 제거되거나 전체 프로세스가 종료됩니까?

질문은 간단하지만 정보를 찾지 못했습니다. 더 정확하게는 두 옵션(아래)에 대한 정보를 찾았지만 각 경우에 어떤 옵션을 사용할지는 찾지 못했습니다.

옵션 1: 커널은 메모리에서 제거하고 디스크로 교체할 수 있는 최상의 페이지를 결정하고 새 페이지가 도착할 수 있도록 제거를 수행합니다.

옵션 2: 커널은 하나 이상의 프로세스를 종료하여 많은 양의 메모리 공간을 즉시 확보합니다.

두 번째 옵션은 성능 측면에서는 더 좋아 보이지만(하나씩 해제하는 대신 많은 메모리 페이지를 한 번에 해제함) 프로세스가 종료되는 문제가 있습니다. 그렇다면 제가 언급한 두 가지 옵션 중 최신 Linux 배포판을 활성화하는 것은 무엇입니까? 구체적인 상황에 따라 달라지나요?

정확한 Linux 배포판에 따라 달라지는 경우 일반적인 방식으로 답변해 주시기 바랍니다.

답변1

상황에 따라 두 가지 옵션을 모두 사용하세요.

커널이 페이지를 할당해야 하는데 사용 가능한 페이지가 없거나 워터마크에 도달한 경우 비활성 목록에서 페이지를 회수하려고 시도합니다( 에서 "Inactive" 검색 /proc/meminfo). 페이지 재활용에 반드시 교체가 포함되는 것은 아닙니다.

  • 더티가 아닌 파일 백업 페이지는 삭제됩니다(백업 저장소에서 복원 가능).
  • 더티 파일 기반 페이지는 백업 저장소에 기록되고 삭제됩니다.
  • 자체 백업 저장소가 없는 제거 가능한 페이지만 스와핑에 포함됩니다.

OOM 킬러는 위의 방법이 충분하지 않은 경우에만 개입하여 (여러 기준에 따라) "최악의" 프로세스를 선택하고 종료합니다.

답변2

스왑 공간이 있는 한 페이지는 스왑 아웃됩니다. 페이지 폴트 인터럽트를 통해 다시 가져옵니다.

스왑 공간이 없으면 커널의 일부가 "OOM-killer"라는 프로세스로 수동으로 생성되어 메모리를 확보하기 위해 다른 프로세스를 종료합니다.

답변3

공식적으로 인정된 답변인 @StephenKitt에서 완벽한 답변을 찾을 수 있습니다. 그러나 100% 이해하기 위해 아직 배워야 할 것이 많은 저와 같은 학생을 위해 Stephen Kitt의 답변을 기반으로 질문에 대한 답변의 단순화된 근사치를 만들고 싶습니다.

주 메모리에 공간이 충분하지 않으면 다음 유형 중 하나가 제거할 페이지가 선택됩니다.

-더티가 아닌 파일 지원 페이지. 이런 상황이라면 페이지를 메모리에서 삭제할 수 있습니다(스왑 영역에 복사하는 대신!!).

-더티 파일 지원 페이지. 이런 상황에서는 페이지를 메모리에서 제거할 수 있지만 스왑 영역에 복사할 수는 없습니다. (그리고 그 내용을 파일이 지원하는 위치에 복사합니다).

- 파일로 백업되지 않은 페이지(더러운지 여부에 관계없음) 이 경우 해당 페이지를 스왑 영역에 복사해야 합니다. 그러나 스왑 영역에 충분한 공간이 없으면 OOM 킬러는 전체 프로세스(또는 그 중 일부)를 종료해야 합니다.

관련 정보