NAME

brk, sbrk - 데이터 세그먼트 크기 바꾸기

SYNOPSIS

#include <unistd.h>

int brk(void *addr);
void *sbrk(intptr_t increment);

glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):

brk(), sbrk():
glibc 2.19부터:
_DEFAULT_SOURCE
|| ((_XOPEN_SOURCE >= 500) &&
! (_POSIX_C_SOURCE >= 200112L))
glibc 2.12부터 2.19까지:
_BSD_SOURCE || _SVID_SOURCE
|| ((_XOPEN_SOURCE >= 500) &&
! (_POSIX_C_SOURCE >= 200112L))
glibc 2.12 전:
_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500

DESCRIPTION

brk()sbrk()프로그램 단절점(program break)의 위치를 바꾼다. 프로그램 단절점은 프로세스의 데이터 세그먼트 끝을 규정한다. (즉, 프로그램 단절점은 비초기화 데이터 세그먼트의 끝 다음의 첫 위치다.) 프로그램 단절점을 올리면 프로세스에게 메모리를 할당하는 효과가 있고 단절점을 내리면 메모리를 해제하는 것이다.

brk()는 데이터 세그먼트의 끝을 addr에 지정한 값으로 설정한다. 단, 그 값이 적당하고, 시스템에 충분한 메모리가 있고, 프로세스의 최대 데이터 크기(setrlimit(2) 참고)를 초과하지 않아야 한다.

sbrk()는 프로그램의 데이터 공간을 increment 바이트만큼 올린다. increment를 0으로 해서 sbrk()를 호출하면 프로그램 단절점의 현재 위치를 알아낼 수 있다.

RETURN VALUE

brk()는 성공 시 0을 반환한다. 오류 시 -1을 반환하며 errnoENOMEM으로 설정한다.

sbrk()는 성공 시 이전 프로그램 단절점을 반환한다. (단절점이 올라갔다면 이 값이 새로 할당된 메모리 시작점에 대한 포인터다.) 오류 시 (void *) -1을 반환하며 errnoENOMEM으로 설정한다.

CONFORMING TO

4.3BSD, SUSv1. SUSv2에서 LEGACY로 표시됨. POSIX.1-2001에서 제거됨.

NOTES

brk()sbrk() 사용을 피하라. malloc(3) 메모리 할당 패키지가 메모리를 할당하는 이식성 있고 편리한 방식이다.

시스템마다 sbrk() 인자에 다양한 타입을 쓴다. 흔하게는 int, ssize_t, ptrdiff_t, intptr_t가 있다.

C 라이브러리/커널 차이

위에서 기술한 brk() 반환 값은 리눅스 brk() 시스템 호출을 위한 glibc 래퍼 함수가 제공하는 동작 방식이다. (다른 대부분의 구현에서도 brk() 반환 값이 그와 같다. 이 반환 값이 SUSv2에 명세되기도 했다.) 하지만 실제 리눅스 시스템 호출은 성공 시 새로운 프로그램 단절점을 반환한다. 그리고 실패 시 현재 단절점을 반환한다. glibc 래퍼 함수에서 약간의 작업을 해서 (즉 새 단절점이 addr보다 작은지 확인해서) 위에 기술한 0과 -1 반환 값을 제공한다.

리눅스에서 sbrk()brk() 시스템 호출을 사용하는 라이브러리 함수로 구현돼 있으며, 내부적으로 어떤 상태 관리를 해서 이전 단절점 값을 반환할 수 있다.

SEE ALSO

execve(2), getrlimit(2), end(3), malloc(3)


2021-03-22