2010-08-09 4 views

답변

2

OS는 무료가 시스템 호출되지 않습니다, 실마리가되지 않습니다. 그러나 C 라이브러리 메모리 할당 시스템은 원래 malloc()에 의해 메모리가 할당되었을 때 어떤 식 으로든 크기를 기록 할 것이기 때문에 얼마나 많은 메모리를 확보해야하는지 알 수 있습니다.

0

크기는 내부적으로 할당 자에 저장되며 사용 가능하게 전달한 포인터는 해당 데이터에 도달하는 데 사용됩니다. 아주 기본적인 접근법은 포인터 앞에 크기 4 바이트를 저장하는 것이므로 포인터에서 4를 빼는 것은 포인터의 크기를 알려줍니다.

OS가 직접 처리하지 않는다는 점에 유의하십시오.이 코드는 C/C++ 런타임 할당기에 의해 구현됩니다.

0

malloc을 호출하면 C 라이브러리가 자동으로 힙에 공간을 조각합니다. 힙에서 작성된 항목은 동적으로 작성되므로 특정 시점의 힙에있는 내용은 스택의 내용과 동일하지 않습니다. 따라서 라이브러리는 힙에 할당 한 모든 메모리를 추적합니다. 힙은 다음과 같이 수있는 몇 가지 지점에서

:

   p---+ 
        V 
    --------------------------------------- 
... | used (4) | used (10) | used (8) | ... 
    --------------------------------------- 

라이브러리 것은 각 블록에 할당되는 메모리의 양을 추적합니다. 이 경우 포인터 p는 가운데 블록의 시작을 가리 킵니다.

우리는 다음 호출 할 경우

free(p); 

다음 라이브러리가 ... 지금과 같이, 힙에 당신을 위해

   p---+ 
        V 
    ---------------------------------------- 
... | used (4) | unused(10) | used (8) | ... 
    ---------------------------------------- 

을이 공간을 확보합니다, 다음 번에 당신을

void* ptr = malloc(10); 

새로 할당되지 않은 공간이 프로그램에 할당 될 수 있습니다. 다시 말해 우리 프로그램에서 사용하는 전체 메모리 양을 줄일 수 있습니다.

  ptr---+ 
        V 
    ---------------------------------------- 
... | used (4) | used(10) | used (8) | ... 
    ---------------------------------------- 

라이브러리가 내부적으로 크기를 관리하는 방식이 다릅니다. 이를 구현하는 간단한 방법은 각 블록의 크기를 유지하기 위해 할당 된 각 블록의 시작 부분에 추가 바이트 양을 추가하는 것입니다 (이 예에서는 1이라고 말합니다).그래서 힙 메모리의 이전 블록은 다음과 같을 것이다 :

bytes: 1 4 1 10 1 8 
    -------------------------------- 
... |4| used |10| used |8| used | ... 
    -------------------------------- 
       ^
        +---ptr 

을 이제, 우리는 블록 크기를 2로 나눌 수 반올림 될 것이라고 말한다면, 그들은 우리가 크기의 끝에 여분의 비트를 (우리는 항상 우리가 편리하게 해당 블록이 사용되거나 사용되지 않는 여부를 확인하는 데 사용할 수있는 0으로 가정 할 수 있기 때문에

을 우리는 자유에 대한 포인터를 전달하는 경우 :.

free(ptr); 

도서관은 이동 것 포인터가 1 바이트 뒤로 주어지고, 사용되지 않거나 사용되지 않는 비트가 사용되지 않는 것으로 변경됩니다. 우리는 블록을 해제하기 위해 블록의 크기를 실제로 알 필요조차 없습니다. 동일한 양의 데이터를 재 할당하려고 할 때만 문제가됩니다. 그런 다음, malloc 호출은 다음 블록이 사용 가능한지 확인하기 위해 줄을 따라 내려갑니다. 여유 공간이있는 경우 올바른 크기이면 해당 블록이 사용자에게 반환되고 그렇지 않으면 힙 끝에 새 블록이 잘리고 필요하면 OS에서 더 많은 공간이 할당됩니다.

+0

일부 implmenentations는 크기를 저장하는 청크의 일부로 크기를 저장하지 않지만 대신 메모리 주소를 크기가 저장된 내부 데이터 구조에 대한 인덱스로 사용합니다. – nos

+0

@nos 사실,하지만이 방법은 구현할 수있는 간단한 방법이라고 생각합니다. 내가하지 않았다면, 나는 의미했다. – KLee1

관련 문제