2010-01-16 7 views
7

sbrk()에 대한 자세한 내용은 어디에서 확인할 수 있습니까?sbrk()는 C++에서 어떻게 작동합니까?

어떻게 작동합니까?

귀찮은 malloc()new() 대신 어떤 상황에서 sbrk()을 사용하고 싶습니까?

btw, sbrk()에 대한 확장은 무엇입니까?

답변

8

the specification for brk/sbrk을 살펴보십시오.

호출은 기본적으로 OS에 이전 "중단 값"을 일정량만큼 증가시켜 응용 프로그램에 더 많은 메모리를 할당하도록 요청합니다. 이 금액 (첫 번째 매개 변수)은 응용 프로그램이 가져 오는 추가 메모리의 양입니다.

대부분의 기초적인 malloc 구현은 sbrk 시스템 호출을 기반으로하여 분할되고 추적되는 메모리 블록을 얻습니다. mmap 함수는 일반적으로 더 나은 선택으로 받아 들여집니다 (dlmalloc과 같은 malloc이 #ifdef를 지원하는 이유입니다). "어떻게 작동하는지"에 관해서는

, 그 가장 간단한 수준에서는 sbrk이 같은 것을 볼 수 있었다 :

uintptr_t current_break; // Some global variable for your application. 
         // This would probably be properly tracked by the OS for the process 
void *sbrk(intptr_t incr) 
{ 
    uintptr_t old_break = current_break; 
    current_break += incr; 
    return (void*) old_break; 
} 

현대 운영 체제는 훨씬 더 많은 일을 할 것 같은 주소 공간에 맵 페이지 등을 할당 된 각 메모리 블록에 대한 추적 정보를 추가 할 수 있습니다.

+0

함수는 참조에 'LEGACY'로 표시되어 있습니다. 현재 SUS 사양 (http://www.opengroup.org/onlinepubs/9699919799/toc.htm)으로 이동하면 해당 (brk, sbrk)가 없습니다. –

+0

좋은 점 - 구현에서 하위 호환성을 신경 쓰지 않기로 결정하면 이러한 함수를 사용하면 이식성 문제가 발생할 수 있습니다. –

4

sbrk는 꽤 쓸모가 없습니다. 요즘에는/dev/zero에서 일부 페이지를 매핑하기 위해 mmap을 사용합니다. 확실히 malloc이나 친구 대신에 사용하는 것이 아니라, 구현하는 방법입니다. 물론, 고대 코드와의 하위 호환성에 신경을 쓰는 posix 기반 운영 체제에만 존재합니다.

Malloc과 New가 너무 성가신 경우 가비지 콜렉션을 조사해야하지만 잠재적 인 성능 비용이 있으므로주의해야합니다.

0

이는 malloc이 "번거롭기"란 의미에 따라 다릅니다. sbrk는 자신의 메모리 할당자를 구현하지 않는 이상 일반적으로 더 이상 직접적으로 사용되지 않습니다. IE, 연산자가 "new"를 무시합니다. 그렇다면 malloc을 사용하여 초기 메모리를 제공 할 수도 있습니다.

sbrk() 위에 malloc()을 구현하는 방법을 보려면 http://web.ics.purdue.edu/~cs354/labs/lab6/을 확인하십시오.

현대적인 시스템에서는이 인터페이스를 만지지 않아야합니다. malloc을 호출하고 새로운 성가신 코드를 작성 했으므로 코드에 sbrk를 안전하고 적절하게 사용하는 데 필요한 모든 경험이 없다고 생각됩니다.

1

malloc 또는 free 대신 sbrk을 사용하지 마십시오. 이식성이 없으며 일반적으로 표준 C 라이브러리의 구현 자 또는 사용 가능하지 않은 경우에만 사용됩니다.()

설명

BRK를 end_data_segment 지정된 값, 즉 값 합당한 경우, 시스템은 수행에 데이터 세그먼트의 끝을 설정 그것 man page 꽤 잘 설명있어 메모리가 충분하고 프로세스가 의 최대 데이터 크기를 초과하지 않습니다 ( setrlimit (2) 참조).

sbrk()는 프로그램의 데이터를 증분 바이트만큼 씩 증가시킵니다. sbrk()는 시스템 호출이 아니며 단지 C 라이브러리 래퍼입니다. 증분 0이 sbrk()를 호출하면 프로그램 중단의 현재 위치를 찾을 수 있습니다 ( ).

성공 반환 값

, BRK()는() 제로와는 sbrk를 반환 에 새로운 영역의 시작을 가리키는 포인터를 반환합니다. 오류시에는 -1이 반환되고 errno는 ENOMEM으로 설정됩니다.

마지막으로, mallocfree가 복잡하지 않습니다 - 그들은 할당하고 자신의 메모리 할당을 구현하려는 경우에도 C에서 메모리를 해제 할 수있는 표준 방법입니다, 그냥 기본으로 mallocfree를 사용하는 것이 가장 좋습니다 - 일반적인 접근 방식은 malloc로 한 번에 큰 덩어리를 할당하고 이름 sbrk의 기원을 다시


(이 suballocators, 또는 풀, 일반적으로 구현하는 것입니다) 그것에서 메모리 할당을 제공 (또는 것입니다 그 사촌 brk), ave는 힙의 끝이 "중단"이라고 알려진 포인터로 표시된다는 사실과 관련이 있습니다. 힙은 BSS 세그먼트 바로 다음부터 시작하여 일반적으로 스택쪽으로 증가합니다.

1

당신은이 C++로 태그를 붙였습니다. 그렇다면 새로운 것보다는 '성가신'malloc()을 사용해야 할 이유가 무엇입니까? 나는 어떤 경우에 malloc에 ​​대해 성가신 일인지 확신하지 못한다. 내부적으로는 그렇지만 왜 신경을 썼겠습니까? 그리고 만약 당신이 (예를 들어 결정론의 이유로) 신경을 쓰면 큰 풀을 할당하고 그 풀에 자신의 할당자를 구현할 수 있습니다. 물론 C++에서는 새로운 연산자를 오버로드하여이를 수행 할 수 있습니다.

sbrk는 C 라이브러리를 기본 시스템의 OS 메모리 관리에 연결하는 데 사용됩니다. 따라서 sbrk()를 사용하는 대신 OS 호출을 작성하십시오. 작동 원리는 시스템에 따라 다릅니다. 예를 들어 Newlib C 라이브러리 (일반적으로 GNU 컴파일러와 함께 '베어 메탈'임베디드 시스템에서 사용됨)를 사용하는 경우 implement sbrk yourself을 사용해야하므로 해당 상황에서 작동하는 방식은 필요한 경우 힙 확장 또는 실패 동작.

링크에서 알 수 있듯이 극히은 직접 사용하기가 번거롭기 때문에 malloc과 new가 제공하는 모든 기능에서이 코드를 랩핑 할 수 있습니다.

관련 문제