RAM이 부분적으로 가득 차면 왜 지연이 발생합니까?


53

더 많은 데이터를 저장할 수있는 공간이 있어도 RAM이 부분적으로 가득 찬 이유 (80 %라고 말하면)로 장치가 많이 지연되는 이유는 무엇입니까? 내가 기대하는 것은 99 %까지 계속 잘 작동한다는 것입니다.

RAM이 더 작기 때문에 PC보다 모바일에서 더 큽니다. 예를 들어, 모바일에는 2GB RAM이 있습니다. 1GB 미만의 RAM을 사용하지 않으면 시간이 많이 걸립니다! 그래도 여전히 ~ 1GB가 사용되지만 왜 이런 일이 발생합니까?


28
사용 가능한 RAM이 사용되지 않는다고 가정하고 있습니다. 따라서 20 %의 RAM을 사용할 수 있으며 RAM의 80 % 만 사용되고 있다고 생각하십시오. 이것은 올바르지 않습니다. RAM을 사용하고 사용할 수 있습니다. (예를 들어, 지금 사용하고 기계는 RAM 32GB의 21.1 GB 사용할 수 있습니다,하지만 1.8 GB는 무료입니다.)
데이비드 슈워츠

2
RAM이있는 HDD 여유 공간을 의미합니까? 확실하지 않습니다.
Mohammed Noureldin

3
물론 교체 할 수 있습니다. 그러나 이는 정확하게보고있는 것처럼 성능에 큰 부정적인 영향을 미칩니다. 작업 세트가 RAM을 초과하면 사용 가능한 RAM 용량에 관계없이 성능이 저하됩니다.
David Schwartz '

3
장치를 지연시키는 RAM 비율이라고 생각하는 것은 무엇입니까?
enkryptor

4
@MohammedNoureldin RAM이 바쁜 이유 (많은 프로세스가 작동하고 무언가를하고있는 이유)가 있어야한다고 생각합니다. 장치가 지연되는 이유와 동일 할 수 있습니다. RAM 로딩은 그 자체가 아니라 단지 증상 일 수 있습니다.
enkryptor

답변:


71

여기에는 많은 관련이 있지만, 가능한 한 간단하고 모든 OS에 적용 가능한 방식으로 설명하려고 노력할 것입니다.

여기에는 두 가지 기본 원칙이 있습니다.

  1. RAM에 필요한 모든 것과 RAM에있는 것의 이점은 거의 항상 RAM 크기보다 큽니다. RAM에있는 것의 이점은 프로세스 작업 세트 및 대기 목록을 포함합니다. 후자는 한 번은 활발하게 사용되었지만 그 후에는 활동하지 않은 데이터와 코드를 포함합니다. 이 중 많은 부분이 다시 사용되며 일부는 곧 사용되므로 RAM에 보관하는 것이 좋습니다. 이 메모리는 일종의 캐시 역할을하지만 실제로 필수적인 것은 아니므로 사용 가능한 메모리 범주에 있습니다. 사용 가능한 메모리와 같이 필요한 모든 프로그램에 신속하게 제공 할 수 있습니다. 성능을 위해 대기 메모리는 커야합니다.

  2. 메모리 블록의 사용 빈도는 임의적이지는 않지만 상당한 정확도로 예측할 수 있습니다. 메모리는 종종 4K 바이트의 블록으로 나뉩니다. 시스템이 충분히 오래 가동 된 경우 일부 블록은 초당 여러 번 액세스되는 반면 다른 블록은 몇 분, 몇 시간, 며칠 또는 몇 주 동안 액세스되지 않았습니다. 이 두 극단 사이에는 광범위한 사용이 있습니다. 메모리 관리자는 최근에 액세스 한 블록과 아직 액세스하지 않은 블록을 알고 있습니다. 최근에 액세스 한 메모리 블록이 곧 다시 필요하다고 합리적으로 가정합니다. 최근에 액세스하지 않은 메모리는 조만간 필요하지 않을 것입니다. 오랜 경험을 통해 이것이 유효한 원칙임을 입증했습니다.

메모리 관리자는 두 번째 원리를 이용하여 첫 번째의 바람직하지 않은 결과를 크게 완화합니다. 이렇게하려면 최근에 액세스 한 데이터를 RAM에 유지하면서 거의 사용하지 않는 데이터를 원본 파일이나 페이지 파일에 유지하는 균형 조정 작업을 수행합니다.

RAM이 많으면이 밸런싱 동작이 쉽습니다. 최근에 사용되지 않은 대부분의 데이터는 RAM에 보관할 수 있습니다. 이것은 좋은 상황입니다.

작업량이 증가하면 상황이 더 복잡해집니다. 사용중인 데이터와 코드의 총계는 더 크지 만 RAM 크기는 동일하게 유지됩니다. 이것은 이것의 작은 서브셋이 RAM에 유지 될 수 있음을 의미합니다. 최근에 덜 사용 된 데이터 중 일부는 더 이상 RAM에있을 수 없지만 디스크에 남아 있어야합니다. 메모리 관리자는 사용중인 메모리와 사용 가능한 메모리간에 균형을 유지하기 위해 매우 노력합니다. 그러나 워크로드가 증가함에 따라 메모리 관리자는 실행중인 프로세스에 더 많은 메모리를 제공해야합니다. 이것은 좋은 상황은 아니지만 메모리 관리자는 선택의 여지가 없습니다.

문제는 프로그램이 실행될 때 RAM으로 데이터를 이동하거나 RAM에서 데이터를 이동하는 데 시간이 걸린다는 것입니다. RAM이 많으면 자주 발생하지 않으며 심지어 눈치 채지 못할 것입니다. 그러나 RAM 사용량이 높은 수준에 도달하면 훨씬 더 자주 발생합니다. 상황이 너무 나빠져 실제로 데이터를 사용하는 데 소요되는 시간보다 RAM으로 데이터를 이동하는 데 더 많은 시간이 소요됩니다. 이것은 메모리 관리자가 피하기 위해 매우 열심히 시도하는 일이지만, 작업량이 많으면 피할 수없는 일입니다.

메모리 관리자는 항상 옆에 있으며 항상 불리한 조건에서도 최적의 성능을 유지하는 것이 가장 좋습니다. 그러나 작업량이 많고 사용 가능한 메모리가 부족한 경우 계속 작동하려면 나쁜 일을해야합니다. 그것은 실제로 가장 중요한 것입니다. 우선은 일을 계속 유지 한 다음 가능한 빨리 실행하는 것입니다.


1
당신의 대답은 저에게 많은 도움이되었습니다. 감사합니다! 그건 memory mangerOS권리 의 일부 입니까? 그래서 포인터 와이 매우 낮은 수준의 것들을 다루고 있다면 여전히 페이징을 할 수 있습니까?
Mohammed Noureldin

7
메모리 관리자는 OS의 일부입니다. 페이징은 메모리 관리자의 기본 기능이며 호흡이 당신과 나에게하는 것처럼 작동에 필수적입니다. 중지 할 수 없습니다.
LMiller7 '

2
@MohammedNoureldin : 사용자 공간 응용 프로그램 (메모리 뷰가 커널 및 기타 프로세스의 메모리 뷰와 분리되어 있음)을 작성하는 경우 실제 메모리에 직접 액세스수 없습니다 . 액세스수있는 것은 페이징을 포함한 모든 기능을 갖춘 메모리 관리자가 관리하는 메모리에 대한보기입니다. 메모리 포인터는 메모리 뷰의 주소 공간에있는 포인트 만 참조합니다. 커널과 사용자 공간 코드 모두에서 사용되는 언어 개념이지만 두 메모리 뷰가 동일하다는 의미는 아닙니다. 프로세스 메모리 관리를 커널 MM과 혼동하지 마십시오!
David Foerster 17

6
'명백한'또는 '잘 알려진'이지만 여전히이 답변에 추가해야 할 수도 있습니다. 메모리 (ram)는 하드 드라이브보다 1000 배 빠릅니다 (예 : ssd / ide와 같은 많은 것들에 의존합니다) / sata 등). OS는 디스크가 아닌 램 (+ 캐시)에서 코드를 실행합니다. 메모리가 부족하고 OS가 메모리에서 디스크로 ( "미사용") 코드의 일부를 "스왑"해야 할 때 램이 다른 것을 실행하기 위해 여유 공간을 확보하려면 '많은 시간'(스와핑)이 필요합니다. 이 문제가 자주 발생하는 경우 (예 : 많은 프로그램이 있고 각각 코드를 메모리에로드하기 위해 스왑이 필요함) 속도가 느려집니다.
Olivier Dulac

3
우리는 일반적으로 메모리에 코드를 로딩하기 위해 "스왑"이라는 용어를 사용하지 않습니다. 보통 "결함"이라고합니다. 일반적으로 "스왑"이라는 용어는 RAM에서 꺼내기 전에 디스크에 기록해야하는 정보에만 사용됩니다.
David Schwartz '

30

모든 최신 운영 체제는 그렇지 않은 스토리지 메모리 대신 빠른 RAM에서 액세스 할 수 있도록 데이터 캐싱에 사용되지 않은 메모리를 사용합니다. 응용 프로그램은 캐시를 지우고 필요할 경우 사용할 수 있지만 실제로 사용 중이므로 일반적으로이 메모리를 사용 가능한 메모리로보고합니다. 데이터가 적을수록 캐시 할 수있는 데이터가 적어지고 컴퓨터 속도가 느려집니다.


11
실제로 응용 프로그램은 캐시를 "지울"필요가 없습니다. 그들은 OS에서 RAM을 요청합니다. 사용되지 않는 RAM이없는 OS는 파일 캐시의 일부를 지우고 응용 프로그램에 0으로 된 RAM을 제공합니다. 응용 프로그램은 해당 RAM의 출처를 알 수 없습니다.
MSalters

5
@MSalters 예, 동의합니다. 응용 프로그램에서 RAM을 요청하고 필요한 경우 OS가 캐시를 지 웁니다. 나는 그것을 단순하게 유지하려고 노력했다.
Mike Scott

그것은 약간 분명하지만 세부 사항에 대해 조금 더 알고 있습니다. 따라서 뭔가 빠졌고 더 자세한 내용이 필요하다는 느낌이 들었습니다. @ LMiller 답변이 실제로 도움이되었습니다. 그것의 정보.
Mohammed Noureldin

4

이 답변은 대부분 구조를 재구성하고 메시지를 명확하게하기 위해 다시 작성되었습니다. 또한 커뮤니티 위키 답변으로 열었습니다. 자유롭게 편집하십시오.

페이징은 고정 크기 메모리 블록에 프로세스가 할당되는 메모리 관리 체계입니다. 메모리 사용량이 높은 수준 (예 : 80 % 용량)으로 증가하면 페이징이 RAM에서 vRAM (가상 RAM)으로 확장되기 시작합니다.

vRAM은 시스템 스토리지, 일반적으로 하드 드라이브 또는 기타 상당한 크기의 스토리지 위치에 있습니다.

프로세스는 메모리로 실행되도록 하드 드라이브의 일부에 할당되며 해당 섹션을 RAM으로 취급합니다. 이는 완전히 정상적인 과정이지만 vRAM과 데이터를주고받는 데 시간이 많이 걸리면 시스템 성능이 저하됩니다.

전용 RAM은 빠른 연결을 제공하는 CPU에서 마더 보드를 통해 직접 액세스되지만 가상 RAM은 보드와 vRAM 위치 사이의 케이블 연결을 가로 질러야합니다.

그러나 이는 약간의 성능 영향 만 발생합니다. vRAM으로의 페이징 속도가 급격히 증가하면 (전용 RAM이 용량에 근접 할 때) 스 래싱이 발생합니다.

스 래싱은 메모리 페이지를 가상 메모리로 신속하고 빠르게 전송하는 방법입니다. 데이터를 가져오고 주소 지정하는 데 더 많은 시간을 소비해야하므로 성능이 크게 저하됩니다.

30 자릿수의 숫자를 쓰고 싶다고합시다. 메모장으로 화면 옆에 앉아서 메모하거나 (전용 메모리 사용) 5 개의 덩어리를 기억하고 다음 방으로 뛰어 들어 메모장의 가상 메모리를 사용하여 메모 할 수 있습니다. 둘 다 일을 끝내지 만 어느 것이 더 빠를까요?

해싱 에 대한 자세한 내용은 여기참조하십시오 !

Daniel B , xenoidJon Bentley를 포함한이 답변의 기여자들에게 큰 감사를드립니다 .


3
스 래싱이 의도적 인 것과는 다릅니다. 물리적 메모리에 대한 페이징 및 경쟁의 부작용 일뿐입니다. 또한 가상 메모리는 페이지를 디스크로 이동하여 "생성"되지 않습니다.
Daniel B

스 래싱은 부산물이지만, 프로세스가 실행되는 시간에 엄청나게 유용하여 그리드 락을 방지하는 데 도움이됩니다. 그리고 그렇습니다. 가상 메모리는 생성되지 않고 사용됩니다. 이 부분을 편집하겠습니다.
Will

8
아니요, 휴지통과 페이징을 혼란스럽게합니다. 쓰레기는 단지 병리학 적으로 페이징되고 있습니다.
xenoid

@xenoid Paging은 메모리 관리 체계입니다. 마치 내 차와 고속도로 시스템으로 사슴을 때리는 것을 혼동하는 것과 같습니다. 스 래싱은 성능 저하를 일으키는 프로세스입니다. 그러나 이것이 페이징 시스템의 결과라는 데 동의합니다.
Will

1
위키 답변으로 작성된 의견은 자유롭게 편집하십시오.
Will

1

OS가 소프트웨어를 계속 실행하기 위해서는 많은 페이징 (활성 프로그램의 일부로드)과 스왑 (RAM의 데이터를 HD로 또는 그 반대로 이동)을 수행해야하기 때문입니다. 사용 가능한 20 %보다 많은 공간이 필요할 수있는 새 페이지를로드해야하는 경우 OS는 RAM에서 기존 페이지를 교체해야하므로 곧 사용할 가능성이 적습니다. 특히 다른 프로그램을 시작할 때. RAM을 사용하지 않고 HD의 속도로 작업하고 있기 때문에 페이지를 스 와이프하고 다시 가져 오면 많은 시간이 걸리고 PC 성능이 크게 저하됩니다.

그것은 HDD에 약간 의 HD 파티션을 생성하고 전용 "스왑"( "실제"파일에는 사용하지 않음) 공간으로 할당하여 스와핑이 HD 조각화의 영향을 덜받는 데 도움이됩니다.


ROM은 캐싱, 페이징 등에 대해 말할 때 HD의 명명법입니다. 작업 메모리가 아닌 모든 것. 그리고 ROM은 대개 RAM보다 느리지 만 거의 항상 그렇습니다. 오래된 컴퓨터는 부팅 할 때 ROM에서 RAM (ROM Shadowing)으로 데이터를 빠르게 복사했기 때문에 복사했습니다.
Gilles Lesire

1
물론 ROM과 RAM도 비 휘발성 메모리와 휘발성 메모리로 사용됩니까? BTW ROM은 일반적으로 속도가 느리고 부팅시 성능 향상을 위해 ROM이 RAM (ROM Shadowing)에 복사됩니다. 그러나, 나는 당신의 nitpicking을 수정하기 위해 하나의 참조를 바꿀 것입니다. ;)
Gilles Lesire

1

하드 드라이브는 RAM보다 속도느리고 RAM 자체가 (전체 아키텍처에서) 시작하기에 빠르지는 않습니다. 액세스 속도 순서대로 (각 단계는 위 단계보다 속도가 느립니다)

  1. 프로세서 레지스터 — 실제적으로 레지스터는 1 프로세서 사이클 내에서 사용할 수 있습니다 . 프로세서가 초당 수십억 사이클 (초당 3 GHz = 30 억 사이클)을 수행한다는 점을 고려하면 이는 매우 빠릅니다.
  2. 프로세서 캐시 -수준에 따라 다르지만 여전히 빠릅니다 (L1 캐시의 경우 3-5주기 가용성).
  3. RAM (Random Access Memory) -임의 부분은 액세스 할 때의 상태를 알 수 없음을 의미합니다. 패키지 배달원을 중지하고, 패키지를 집어 들고, 문으로 걸어 가서 초인종을 울리고 응답을 기다리는 사람을 생각하십시오. 아마 당신은 전혀 기다리지 않거나, 스미스 부인이 집 뒤 문을 뒤섞을 때까지 1 ~ 2 분 정도 기다릴 수도 있습니다. 실제로, RAM에 액세스했을 때 RAM의 상태에 따라 14-27 사이클 사이 어디에서나 이야기하고 있습니다.
  4. 하드 디스크 드라이브 -현재 물리적 프로세스가 있으며 가능한 빨리 헤드가 움직일 때까지 기다리고 있고 헤드 아래로 트랙이 움직입니다. 실제로, 7,200RPM HDD는 3GHz 프로세서의 경우4ms 또는 약 750,000 회 정도의 회전을 완료 할 수 있습니다 . 느리다.

가상 메모리 관리자는 도박꾼입니다. 항상 모든 RAM이 필요하지 않다는 것을 내기하고 있습니다. 따라서 교육받은 추측을하고 문서 프로그램 (이 글을 읽는 동안 지난 10 분 동안 백그라운드에 있었음)이 아닌 주사위를 굴립니다. 정말 중요하며 HDD에 저장합니다.

그런 다음 문서를 다시 클릭하십시오! 이제 VMM은 모든 데이터를 HDD에서 다시로드해야합니다. 더 나쁜 것은, RAM이 적 으면 사용 가능한 공간을 확보하기 위해 다른 데이터 (도박을 더 많이)를 HDD로 푸시해야합니다. 리눅스는 여기 가장자리에 사는 것을 좋아합니다. 대부분의 RAM을 자주 사용하는 데이터로 채 웁니다 (프로세스가 적은 서버에 적합).


1
그렇습니다. 메모리 관리자는 도박꾼이지만 오해하기 쉽습니다. 메모리 액세스가 실제로 임의적이면 메모리 관리자가 자주 올바르게 잘못되어 전체 시스템이 손상됩니다. 그러나 프로그램은 강력한 참조 지역을 나타내는 경향이 있습니다. 즉, 대부분의 메모리 액세스는 비교적 작은 메모리 영역에 국한되는 경향이 있습니다. 그들은 움직이지만 시스템이 작동하기에 충분히 느립니다. 확률은 메모리 관리자에게 유리하며 실수는 신속하게 수정됩니다. 이것은 수십 년의 경험을 통해 입증되었습니다
LMiller7

랜덤 액세스 메모리의 랜덤은 임의의 메모리에 임의로 액세스 할 수 있다는 사실을 나타냅니다. (하드 드라이브 나 테이프에서와 같이 데이터가 읽기 헤드 아래를 통과 한 다음 순차적으로 데이터에 액세스 할 때까지 기다려야합니다.)
Phil

0

스 래싱 답변은 거의 그것을 못 박았습니다. 가능하다면 스왑 피스 (스왑 공간으로 이동하기 전에 시스템에서 사용할 수있는 램 양)를 줄임으로써이 문제가 얼마나 빨리 발생하는지 최소화 할 수 있습니다. 서버 응용 프로그램의 램이 99 %에 도달 할 때까지 시스템이 스왑에서 벗어나도록 설정하고 싶습니다. 기본값은 사실상 램의 80 % 만 사용하여 푸시에 대한 불이익없이 캐싱을 활용하기 위해 코드를 작성해야한다는 것을 의미하기 때문에 스왑 공간으로 시스템.

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