2012-11-08 5 views
3

빠른 질문이 있으니 메모리 할당 주소는 언어 컴파일러에 의해 선택되거나 메모리 요청 주소를 선택하는 OS입니까?OS 메모리 할당 주소

가상 메모리에 대해서는 의심의 여지가 있습니다. 프로세스가 "모든 메모리를 소유하고 있다고 생각하게하십시오"라고 신속하게 설명 할 수 있지만 64 비트 아키텍처에서는 메모리 주소에 48 비트 만 사용됩니다. 프로세스가 더 높은 주소를 원하십니까?

int a = malloc(sizeof(int));을하고 이전 시스템 호출에서 남은 메모리가 없으므로 OS에 더 많은 메모리를 요청해야하며 컴파일러가이 변수를 할당 할 메모리 주소를 결정하는 사람인지 또는 운영 체제에 메모리를 요청하면 메모리에서 반환 된 주소에 메모리를 할당합니다.

답변

2

특히 동적 메모리 할당이므로 컴파일러가 아닙니다. 컴파일은 실제로 프로그램을 실행하기 전에 잘 수행됩니다.

정적 변수에 대한 메모리 예약은 컴파일 할 때 발생합니다. 정적 메모리 할당은 사용자가 Main을 정의하기 전에 시작될 때 발생합니다.

정적 변수는 실행 파일 자체에서 공간을 제공 할 수 있습니다. 그러면 메모리가 프로세스 주소 공간에 매핑됩니다. 이것은 단지 몇 번에 불과합니다. (?) 나는 실제로 컴파일러를 "결정"하는 이미지를 만들 수 있습니다.

동적 메모리 할당 중에 프로그램은 OS에 메모리를 요청하고 메모리 주소를 반환하는 OS입니다. 이 주소는 예를 들어 포인터에 저장됩니다.

0

동적 C/C++의 메모리 할당은 런타임 라이브러리 함수에 의해 간단히 수행됩니다. 이러한 기능은 표준을 준수하는 행동을하는 한 즐겁습니다. 준수하지만 쓸모 malloc()의 사소한 구현은 다음과 같습니다

void * malloc(size_t size) { 
    return NULL; 
} 

요구 사항은 매우 편안하다 - 포인터가 적절하게 정렬되어야하고 이전에 free()d 있지 않았다면 포인터는 고유해야합니다. 다소 바보 같지만 다소 휴대 가능하고 스레드 안전 메모리 할당자가 절대적으로 아래에있을 수 있습니다. 주소는 컴파일러가 결정한 풀에서 가져옵니다.

#include "stdint.h" 
// 1/4 of available address space, but at most 2^30. 
#define HEAPSIZE (1UL << (((sizeof(void*)>4) ? 4 : sizeof(void*)) * 2)) 
// A pseudo-portable alignment size for pointerŚbwitary types. Breaks 
// when faced with SIMD data types. 
#define ALIGNMENT (sizeof(intptr_t) > sizeof(double) ? sizeof(intptr_t) : siE 1Azeof(double)) 

void * malloc(size_t size) 
{ 
    static char buffer[HEAPSIZE]; 
    static char * next = NULL; 
    void * result; 
    if (next == NULL) { 
     uintptr_t ptr = (uintptr_t)buffer; 
     ptr += ptr % ALIGNMENT; 
     next = (char*)ptr; 
    } 
    if (size == 0) return NULL; 
    if (next-buffer > HEAPSIZE-size) return NULL; 
    result = next; 
    next += size; 
    next += size % ALIGNMENT; 
    return result; 
} 

void free(void * ptr) 
{} 

실제 메모리 할당 자는 정적 메모리 풀에 의존 아니라 새로 매핑 된 메모리를 제공하기 위해 OS를 호출하지 않습니다.

올바른 생각 방법은 다음과 같습니다. 포인터를 malloc()에서 가져올 것입니다. 0이 아닌 인수를 사용하여 malloc()을 호출 한 경우 고유하고 올바르게 정렬 된 메모리를 가리키는 것만 알 수 있습니다. 그게 다야.