2017-11-20 11 views
3

Windows에서 백그라운드 프로세스로 실행되는 C를 사용하는 WebSocket Server가 있습니다. 이 프로세스는 큰 이미지 데이터 (base64 형식)가 포함 된 요청을 수락합니다.무료 전화로 메모리 사용량이 감소하지 않습니다.

요청이 수신 될 때마다 메모리는 malloc을 사용하여 할당됩니다. 그리고 요청이 실행 된 후 free'd.

하지만 작업 관리자를 확인하면 메모리 사용량이 줄어들지 않습니다. 또한 다른 요청을 보내면 추가 메모리가 할당됩니다.

제 질문은 왜 프로세스가 할당 된 메모리를 해제하지 않았거나 이전에 할당 된 메모리를 다시 사용하지 않았습니까?

+0

Windows OS 버전은 무엇입니까? –

+0

Windows 7 Ultimate을 사용 중입니다. – Ronnie

답변

4

free의 기본 구현은 플랫폼에 따라 다르지만 실제로는 지연 집합 메모리 할당/할당 취소로 인해 발생합니다. 사용자의 OS (또는 메모리 관리 루틴)는 방금 해방 한 메모리를 인식하지만, 프로그램이 더 많은 메모리를 다시 요구할 가능성이 있기 때문에 다른 프로세스가 요청할 때까지 다른 프로세스가 해당 메모리를 사용할 수있게 만들지 않습니다 그것. 따라서 작업 관리자는 무료 통화에도 불구하고 프로그램의 메모리 사용량이 감소하지 않는다는 것을 보여줍니다.

프로그램에서 해제 한 다음 더 많은 메모리를 요청하면 기본 메모리 관리 루틴에서 해제 한 것과 동일한 메모리를 다시 제공 할 필요가 없습니다. 무료 블록을 결합하는 것은 coalescing이라고하며, 값 비싼 조작이므로 마지막 순간까지 지연되고 가능한 경우 완료되지 않습니다.

다른 프로그램을 시작하여 많은 양의 메모리를 요청할 수 있습니다. 원래 프로그램이 메모리를 적절하게 해제하면 새 프로그램이 메모리를 요청하자마자 메모리 사용이 중단됩니다.

+1

메모리를 보유할지 여부는 운영 체제가 아닌 인 - 메모리 관리 루틴에있을 수 있습니다. –

+0

다른 요청 (malloc 사용)을 처리하려고 할 때 왜 free'd 메모리 대신에 메모리 사용량이 다시 증가 했습니까? – Ronnie

+1

@ 로니 : 아마도 자유의 기억이 충분히 크지 않았을 것입니다 - 이것이 가장 일반적인 이유입니다. 즉, 1 MiB를 해제했으나 다음 요청은 1.2 MiB에 대한 것이었고 이미 사용 가능한 블록이 없었기 때문에 새로운 블록을 할당했습니다. 린스하고 반복하십시오. –