sbrk 예제

sbrk는 기존의 UNIX C 컴파일러의 일부 버전과 호환됩니다. 그것은 370 환경에 적합하지 않습니다; 따라서 가능하면 malloc을 그 자리에 사용하십시오. Linux에서 sbrk()는 brk() 시스템 호출을 사용하는 라이브러리 함수로 구현되며 이전 break 값을 반환할 수 있도록 일부 내부 부기 기능을 수행합니다. brk() 및 sbrk()는 프로세스의 데이터 세그먼트의 끝을 정의하는 프로그램 중단의 위치를 변경합니다(즉, 프로그램 중단은 초기화되지 않은 데이터 세그먼트가 끝난 후 첫 번째 위치). 프로그램 중단을 늘리면 프로세스에 메모리를 할당하는 효과가 있습니다. 브레이크를 줄이면 메모리가 할당됩니다. sbrk는 바이트로 지정된 크기의 메모리 블록을 할당합니다. 블록은 프로그램 초기화시 할당된 영역에서 종속됩니다. 이 영역의 크기는 외부 변수 _mneed의 초기 값에 의해 결정됩니다.

이 변수가 설정되지 않은 경우 sbrk가 처음 호출될 때 100K의 기본 영역이 할당됩니다. brk 및 sbrk 호출은 호출 프로세스의 데이터 세그먼트에 할당된 공간의 양을 동적으로 변경합니다. 변경은 할당할 수 있는 최대 공간을 결정하는 프로세스의 프로그램 중단을 재설정하여 변경됩니다. 프로그램 중단은 데이터 영역의 현재 끝을 벗어난 첫 번째 위치의 주소입니다. 중단 값이 증가함에 따라 사용 가능한 공간의 양이 증가합니다. 사용 가능한 공간이 0값으로 초기화됩니다. [3] 중단 값은 메모리 관리 아키텍처에 적합한 크기로 자동으로 반올림될 수 있습니다. 중단 값은 할당되지 않은 메모리의 첫 번째 바이트의 주소입니다. 프로그램이 실행을 시작하면 중단 값이 코드 다음에 배치되고 프로그램의 상수 데이터가 표시됩니다.

메모리가 할당되면 할당 요청을 충족할 수 있을 만큼 큰 사용 가능한 블록이 없을 때 이 포인터가 진행됩니다. sbrk() 함수는 현재 중단 값에 증분 값을 추가하여 프로그램에 대한 새 중단 값을 설정합니다. 새로 할당된 공간은 0으로 설정됩니다. sbrk() 호출이 성공하면 새 메모리 블록의 시작에 대한 포인터가 반환됩니다. brk 및 sbrk는 프로세스의 데이터 세그먼트에 할당된 메모리 양을 제어하기 위해 유닉스 및 유닉스와 같은 운영 체제에서 사용되는 기본 메모리 관리 시스템 호출입니다. [1] 이러한 함수는 일반적으로 malloc와 같은 상위 수준의 메모리 관리 라이브러리 함수에서 호출됩니다. 원래 유닉스 시스템에서 brk와 sbrk는 응용 프로그램이 추가 데이터 공간을 확보할 수 있는 유일한 방법이었습니다. 이후 버전에서도 mmap 호출을 사용하여 이 작업을 수행할 수 있었습니다. [2] sbrk는 메모리 할당을 위한 융통성이 없는 메커니즘입니다. sbrk-managed 영역의 크기를 늘리기 위한 규정이 없습니다(이 용도로 사용 가능한 메모리를 사용할 수 있는 경우에도).

이 제한이 없는 malloc을 사용하면 가능한 경우 메모리 할당에 사용하는 것이 좋습니다. sbrk() 호출이 실패하면 -1이 반환됩니다. 오류가 발생하면 errno는 감지된 오류 유형을 나타냅니다. 무료 블록을 찾지 못하면 sbrk를 사용하여 OS에서 공간을 요청하고 연결된 목록의 끝에 새 블록을 추가해야합니다. sbrk (우리의 프로그램 나누기 값이 변경 되는 경우)에 대 한 호출 후 우리는 할당 된 크기와 함께 새 블록을 만듭니다. 이 블록의 메타데이터에는 크기, 다음 및 이전 블록이 포함되며 블록의 처음 24바이트(오버헤드)(36-38줄)에 할당됩니다. 사용자가 요청한 메모리를 훨씬 더 많이 할당했기 때문에 이 새 블록을 분할하고 요청된 크기와 동일한 크기로 반환합니다(줄 39-43). sbrk가 실패하면 malloc은 오류 메시지를 표준 출력에 인쇄합니다.

이것은 나쁜 생각이다. malloc에서 오류 메시지를 출력하는 것은 NULL을 반환하고 호출자에게 오류를 처리하도록 해야 합니다.

Comments

comments