Windows 8.1에서 RAM이 부족할 때 프로세스가 가장 먼저 종료되지 않도록하는 방법이 있습니까?


18

Kinect v2의 색상, 적외선 및 깊이 데이터를 버퍼링하고 일부 처리를 수행 한 다음 압축되지 않은 형태로 디스크에 덤프하는 .NET 4.5 응용 프로그램을 작성했습니다. .NET 응용 프로그램은 하위 프로세스로 ffmpeg를 시작하고 H.264로 인코딩되도록 색상 데이터를 파이프합니다.

SSD를 사용하지 않기 때문에 비디오 데이터가 디스크에 쓸 수있는 것보다 빨리 도착합니다. 그러나 괜찮습니다 .RAM이 적을 때 비디오 프레임을 버리는 것이 허용됩니다. 내 유일한 요구 사항은 내가 유지하는 모든 것이 8-10 초의 비디오 청크에 인접해야한다는 것입니다. 따라서 8 ~ 10 초의 비디오 (약 1.5 ~ 2GB)를 버퍼링하기에 충분한 RAM이 없을 때 비디오 프레임을 삭제하기 위해 .NET 4.5 응용 프로그램에 몇 가지 논리를 추가했습니다.

그리고 페이지 스 래싱을 방지하기 위해 페이징 파일을 완전히 비활성화했습니다. 이로 인해 총 16GB의 실제 RAM이 남습니다.

내 문제는 해당 메커니즘을 사용하더라도 Windows 8.1에서 RAM이 부족하다는 사실을 알면 때로는 .NET 응용 프로그램 또는 ffmpeg 하위 프로세스가 여전히 종료되는 것입니다. 디스크에 쓸 수 있습니다. Windows가 중요하지 않은 프로세스를 먼저 종료하기 위해 내 프로세스가 다른 프로세스보다 중요하다는 것을 Windows에 알리는 방법이 있습니까?


10
나는 윈도우가 프로세스를 죽였다고 생각하지 않았다. 나는 이것이 리눅스 전용 기능이라고 생각했다.
Scott Chamberlain

4
@ScottChamberlain : Windows에서 페이징 파일을 끄는 일은 드물기 때문입니다. 그것은 당신에게 모든 종류의 예기치 않은 비정상적인 행동을 가져옵니다. 여기서 분명한 대답은 "페이징 파일을 끄지 마십시오. Windows에서 사용되지 않는 데이터를 RAM에 보관하여 앱에서 해당 RAM을 사용할 수 없도록합니다"
MSalters

1
이것이 StackOverflow 질문이라면, CreateMemoryResourceNotification덜 해킹 된 것을 지적 할 수 있습니다 .
MSalters

7
@Kal : 디스크 액세스가 병목 현상 인 경우 더 강한 압축을 사용하고 CPU가 병목 현상 인 경우 더 빠른 압축을 사용하십시오. 둘 다 병목 현상이 발생하면 전체 디자인을 다시 생각하고 다시 시작하거나 하드웨어를 개선하십시오.
Mooing Duck

1
@FactorMystic OMG 그는 무엇을 했습니까? 페이지 파일을 비활성화하면 사용 가능한 RAM이 크게 줄어 듭니다.
Aron

답변:


45

모든 RAM이 사용될 때 Windows는 프로세스를 종료하지 않습니다. 실제로 발생하는 것은 프로세스가 메모리를 할당하지 못하고 충돌하는 것입니다.

이것은 모든 실제 메모리가 사용 중이고 페이지 파일이 비활성화되어 메모리 관리자가 더 이상 사용되지 않는 페이지를 쓸 수 없기 때문에 발생합니다. 이렇게하면 실제 RAM이 가득 차고 프로세스 또는 그 밖의 다른 작업이 페이지 할당을 시도하면 실패합니다. 일부 응용 프로그램이 충돌합니다.

Technet의이 프레젠테이션은 다음과 같이 설명합니다. http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

페이지 파일은 초과 커밋에 대한 백스톱 역할을하여 모든 메모리를 활용할 때 응용 프로그램이 중단되는 것을 방지합니다.

가상 메모리는 최신 운영 체제가 리소스를 할당하는 방식의 근간이되므로 사용중인 RAM에 물건을 넣고 디스크에서 물건을주고받는 것입니다.

실제로 두 가지 답변이 있습니다.

  1. 디스크 스 래싱을 줄이려면 페이지 파일을 다시 활성화하고 컴퓨터의 RAM을 늘리십시오.
  2. 응용 프로그램의 메모리 요구 사항을 줄이십시오.

결론적으로 RAM은 캐시의 또 다른 수준이며 가상 메모리, 페이지 파일, 메모리 매핑 파일 및 기본적으로 이것에 이르는 모든 것들입니다. 메모리가 부족하면 추가해야합니다. 더.


4
또는 적게 사용하십시오.
nhgrif

1
데이터를 디스크에 충분히 빨리 쓸 수 없기 때문에 백 로그가 구축되고 있습니다. 동일한 디스크에서 가상 메모리를 활성화하면 도움이 될 것 같지 않습니다.
Alexander

3
실제로 페이지 파일은 디스크의 다른 위치에 있습니다. 우리는 그것이 SSD가 아니라는 것을 알고 있기 때문에 디스크 검색이 가장 느린 물리적 검색을 의미합니다.
MSalters

9
응용 프로그램에서 명시 적 메모리 관리가 필요한 것 같습니다.
Joe

1
@Joe 정확히이. 가비지 수집기는 이러한 유형의 상황에서 메모리 관리를 악몽으로 만들 것입니다. 이 유형의 상황은 모든 메모리 사용을 미세 조정했기 때문에 C ++에서 다루기가 쉽지 않습니다. 이 경우 C #에서도 잘 작동하는 디자인 패턴이 있지만 대부분의 사람들이 시도하는 것만 큼 간단하지는 않습니다.
Thebluefish

0

Windows 도구 패널 및 고급 설정을 통해 이동하고 필요없는 창 효과와 같은 불필요한 항목을 비활성화하고 Sysinternals Process Explorer 및 / 또는 시스템 모니터를 통해 CPU 또는 메모리를 낭비하는 외부 항목을 찾아 끄십시오.

더 중요한 것은 Process Explorer 및 / 또는 System Monitor를 사용하여 프로그램이 실행 중인지 확인하고 실패한 위치 및 방법을 정확히 확인하십시오. 메인 스레드 또는 ffmpeg 파트 중 어느 스레드가 메모리 부족으로 먼저 죽습니까? 예상치 못한 크기로 확장되는 특정 dll 또는 기타 공유 리소스가 있습니까? 아니면 데이터를 씹을 수있는 것보다 더 많이 물린 것을 제외하고는 실행이 올바르게 진행되고 있습니까?

문제의 본질을보다 정확하게 파악하면 해결 방향을 제시 할 수 있습니다. 예를 들어, 프레임 삭제 정책을보다 적극적으로 구현하면서 8-10 초 청크 기준에 맞게 최적화하여 전반적인 RAM 오버 헤드를 줄일 수 있습니다.

최종 제안 : 아마도 리눅스로 전환하는 것을 고려하고 그 동안 페이징 파일을 다시 활성화하십시오 (리눅스가 스왑 공간이라고 부르므로 스왑 만남과 같은 IMHO가 더 재미있게 들립니다!) 행운을 빈다.

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