많은 사람들이 일단 메모리를 확보하면 즉시 운영 체제로 돌아와 다른 프로그램에서 사용할 수 있다는 인상을 받고있는 것 같습니다.
사실이 아닙니다. 운영 체제는 일반적으로 4KiB 페이지에서 메모리를 관리합니다. malloc
다른 종류의 메모리 관리는 OS에서 페이지를 가져오고 적절하다고 생각되면 하위 관리합니다. 그것은 아주 가능성이 있음을의 free()
것 없는 프로그램이 나중에 더 많은 메모리를 malloc을 것이라는 가정하에, 운영 체제에 페이지를 반환합니다.
나는 free()
결코 운영 체제에 메모리를 반환 하지 않는다고 말하지 않습니다 . 특히 많은 양의 메모리를 비우는 경우에 발생할 수 있습니다. 그러나 보장 할 수 없습니다.
중요한 사실 : 더 이상 필요하지 않은 메모리를 확보하지 않으면 추가 malloc이 더 많은 메모리 를 소비 하게 됩니다. 그러나 먼저 해제하면 malloc이 해제 된 메모리를 대신 재사용 할 수 있습니다.
이것이 실제로 무엇을 의미합니까? 즉, 프로그램에 더 이상 메모리가 필요하지 않다는 것을 알고 있다면 (예 : 정리 단계에 있음) 메모리를 해제하는 것은 그리 중요하지 않습니다. 그러나 프로그램이 나중에 더 많은 메모리를 할당 할 수 있으면 메모리 누수, 특히 반복적으로 발생할 수있는 메모리 누수를 피해야합니다.
또한 종료 직전에 메모리를 해제하는 것이 나쁜 이유에 대한 자세한 내용 은 이 주석 을 참조하십시오.
주석가는 호출 free()
이 다른 프로그램이 해제 된 메모리를 자동으로 사용하도록 허용하지 않는다는 것을 이해하지 못하는 것 같습니다 . 그러나 이것이이 답변의 요점입니다!
따라서 사람들을 설득하기 위해 free ()가 거의 수행하지 않는 예를 보여 드리겠습니다. 수학을 쉽게 따르기 위해 OS가 4000 바이트 페이지에서 메모리를 관리하는 것처럼 가장합니다.
10,000 개의 100 바이트 블록을 할당한다고 가정합니다 (간단하게하기 위해 이러한 할당을 관리하는 데 필요한 추가 메모리는 무시합니다). 1MB 또는 250 페이지를 소비합니다. 그런 다음이 블록 중 9000 개를 임의로 해제하면 1000 개의 블록 만 남게됩니다. 통계적으로 약 5 페이지의 페이지가 비어 있습니다. 다른 245는 각각 적어도 하나의 할당 된 블록을 가질 것이다. 100KB 만 할당하더라도 운영 체제에서 회수 할 수없는 메모리는 980KB입니다.
한편, 프로그램이 묶는 메모리의 양을 늘리지 않고도 malloc () 9000 블록을 더 만들 수 있습니다.
기술적 으로 메모리를 OS에 반환 할 free()
수있는 경우에도 그렇지 않을 수 있습니다. 빠른 운영과 메모리 절약 사이의 균형을 유지해야합니다. 또한 이미 많은 메모리를 할당 한 다음 해제 한 프로그램은 다시 그렇게 할 가능성이 있습니다. 웹 서버는 요청 후 요청 후 요청을 처리해야합니다. 일부 "느슨한"메모리를 사용 가능한 상태로 유지하면 OS에 항상 메모리를 요청할 필요가 없습니다.free()