“기억이없는”을 처리하는 올바른 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1439977

  •  10-07-2019
  •  | 
  •  

문제

최근에 CCTV 프로그램을 위해 Windows의 비디오 플레이어 프로그램에서 작업합니다. 프로그램이 동시에 많은 비디오 스트림을 디코딩하고 재생해야하므로 Malloc이 실패 할 상황을 충족시키고 모든 Malloc 후에 확인을 추가 할 수 있다고 생각합니다.

그러나 장르에서 말하면, 오픈 소스 프로젝트에서 읽은 오픈 소스 프로그램 코드에서는 Malloc의 결과를 확인하는 것을 거의 찾지 못합니다. 따라서 Malloc이 실패하면 대부분의 프로그램이 충돌합니다. 그게 혐의가 아닌가?

Linux에서 서버 프로그램을 작성하는 동료는 100 개의 클라이언트 연결에 충분한 메모리를 할당합니다. 따라서 그의 프로그램은 101 고객을 거부 할 수 있지만 Malloc의 실패를 결코 충족시키지 못할 것입니다. 그의 접근 방식은 데스크탑 애플리케이션에도 적합합니까?

도움이 되었습니까?

해결책

Linux에서 malloc() 대신, OOM 킬러는 트리거되고 시스템이 끝날 때까지 임의의 프로세스를 죽이기 시작합니다. Linux는 오늘날 사용중인 가장 인기있는 유닉스 파생물이므로 많은 개발자들이 결과를 확인하지 않는 법을 배웠습니다. malloc(). 그것이 아마도 당신의 동료들이 무시하는 이유 일 것입니다 malloc() 실패.

실패를 지원하는 OS에서는 두 가지 일반적인 패턴을 보았습니다.

  • 결과를 확인하는 사용자 정의 절차를 작성하십시오 malloc(), 및 전화 abort() 할당이 실패한 경우. 예를 들어, glib 및 gtk+ 라이브러리는이 접근법을 사용합니다.

  • 할당 실패시 청소할 수있는 캐시와 같은 "퍼지 가능"할당의 글로벌 목록을 저장하십시오. 그런 다음 할당을 다시 시도하고 여전히 실패한 경우 표준 오류보고 메커니즘 (동적 할당을 수행하지 않음)을 통해보고하십시오.

다른 팁

표준화 된 API를 따르십시오

Linux에서도 Ulimit을 사용하여 Prompt Malloc Error 리턴을 얻을 수 있습니다. 그것은 단지 그것이 무제한으로 기본값을 얻는 것입니다.

출판 된 표준을 준수 해야하는 확실한 압력이 있습니다. 대부분의 시스템에서 장기적으로, 그리고 결국 Linux에서도 malloc(3) 올바른 실패의 표시를 반환합니다. 데스크탑 시스템에는 가상 메모리와 요구 페이징이 있지만 확인하지 않는 것은 사실이지만 malloc(3) 메모리 누출이없는 디버그 된 프로그램에서만 작동합니다. 잘못된 일이 있으면 누군가가 ulimit 그리고 그것을 추적하십시오. 갑자기 malloc 점검이 의미가 있습니다.

NULL을 확인하지 않고 Malloc의 결과를 사용하는 것은 Malloc이 실패 할 수있는 플랫폼에서 사용할 수있는 코드에서 용납 할 수 없습니다. 나는 미래를 포기할 수없고, 내 코드가 어디로 갈지 모르기 때문에 Malloc의 수표로 코드를 쓸 것입니다.

Malloc가 실패한 경우해야 할 일에 대한 전략은 Applciation의 종류와 사용중인 라이브러리에서 얼마나 많은 신뢰를 가지고 있는지에 달려 있습니다. 어떤 상황에서해야 할 유일한 상황은 전체 프로그램을 중단하는 것입니다.

알려진 메모리 할당량과 일부 청크에서 구문 분석을 실현한다는 아이디어는 실제로 밈을 소진하지 않도록 조향하는 것이 좋습니다. 응용 프로그램의 메모리 사용량이 예정된 경우 좋은 것입니다. 코드에서 사용할 수있는 자신의 메모리 관리 루틴을 작성하도록 확장 할 수 있습니다.

작업중인 응용 프로그램 유형에 따라 다릅니다. 응용 프로그램이 작동하는 경우 개별 작업이 실패 할 수있는 개별 작업으로 나뉘어지면 메모리 할당 점검을 우아하게 복구 할 수 있습니다.

그러나 많은 경우에 Malloc 실패에 응답하는 유일한 합리적인 방법은 프로그램을 종료하는 것입니다. 코드가 피할 수없는 널리 회의에서 충돌하도록하면이를 달성 할 수 있습니다. 오류를 설명하는 로그 입력 또는 오류 메시지를 버리는 것이 항상 더 낫지 만 실제 세계에서는 제한된 일정을 연구합니다. 때로는 Pedantic 오류 처리의 투자 수익률이 없습니다.

이 경우에 해제 될 수있는 버퍼를 항상 확인하고 사전 할당하여 사용자에게 데이터를 저장하고 응용 프로그램을 종료하도록 경고 할 수 있습니다.

쓰기 앱에 따라 다릅니다. 물론 항상 Malloc ()의 반환 값을 확인해야합니다. 그러나 OOM을 우아하게 처리하는 것은 저수준 중요한 시스템 서비스와 같은 경우 또는 사용될 수있는 라이브러리를 작성할 때만 적합하게 의미가 있습니다. OOM에 중단되는 malloc 래퍼가 있으면 많은 앱과 프레임 워크에서 매우 일반적입니다. 종종 그 래퍼는 xmalloc () 또는 이와 유사합니다.

Glib의 g_malloc ()도 중단되고 있습니다.

당신이 엄청난 양의 메모리를 처리하고 "이제 메모리 영역이 있고 B 조각이 필요하지 않으며 원하는대로 할 필요가 없다"와 같은 Linux에 진술을하고 싶다면 mmap ()를 살펴보십시오. MadVise () 재고 GNU C 라이브러리에서 제공되는 기능 제품군. 사용 패턴에 따라 코드는 Malloc을 사용하는 것보다 훨씬 간단해질 수 있습니다. 이 API는 또한 Linux가 한 번만 읽거나 쓰려는 파일을 캐싱하여 메모리를 낭비하지 않도록 도울 수 있습니다.

그것들은 GNU LIBC 정보 문서에 멋지게 문서화되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top