110 likes | 708 Views
6.3 프로세스의 크기 변경 : brk , sbrk. 리눅스 시스템 프로그래밍 07 년 11 월 20 일 2005242068 엄익정. 목 차. 1. brk 함수 & sbrk 함수 들어가기 전 .. 2. brk () 3. sbrk () 4. 소스 분석 5. 실행. 1. brk 함수 & sbrk 함수 들어가기 전. 호출 프로세스의 데이터 세그먼트를 위해 할당된 공간을 동적으로 변경
E N D
6.3 프로세스의 크기 변경 : brk, sbrk 리눅스 시스템 프로그래밍 07년 11월 20일 2005242068 엄익정
목 차 • 1. brk함수 & sbrk함수 들어가기 전.. • 2. brk() • 3. sbrk() • 4. 소스 분석 • 5. 실행
1. brk함수 & sbrk함수 들어가기 전.. • 호출 프로세스의 데이터 세그먼트를 위해 할당된 공간을 동적으로 변경 • break값 – 데이터 세그먼트 끝의 다음에 있는 첫 번째 위치의 주소
프로세스의 구조와 브레이크 값(그림) 텍스트(text) etext 초기화된 데이터 (initializeddata) edata 브레이크 값 (breakvalue) 비초기화 데이터 (uninitialized data) end 스택(stack)
2. brk함수 • intbrk(void *endds); - 매개변수 : break 값 - 반환값: 성공하면 0 실패하면 -1 - break값을 endds로 설정하고 할당된 공간을 변경
3. sbrk함수 • void *sbrk(intincr); - 매개변수 : incr(증가값) - 반환값: 성공하면 변경 전의 break값 실패하면 -1 - break값을 변경함으로써 데이터 세그먼트로 확보된 영역을 변경
4. 소스 분석 (1/3) extern intetext, edata, end; main() { intbrk(), ret; char *sbrk(), *bv; system("clear"); printf("The program text ends at %07o\n", &etext); printf("The initialized data ends at %07o\n", &edata); printf("The uninitialized data ends at %07o\n", &end);
소스 분석 (2/3) bv = sbrk(0); printf("Current break value is %07o\n\n",bv); /* 01000 */ ret = brk(bv+512); printf("brk returned . . . . %d\n",ret); bv = sbrk(0); printf("Current break value is %07o\n\n",bv); ret = brk(&ret); printf("brk returned . . . . %d\n",ret); bv = sbrk(0); printf("Current break value is %07o\n\n",bv);
소스 분석 (3/3) /* 0100 */ bv = sbrk(64); printf("sbrk returned %07o\n",bv); bv = sbrk(0); printf("Current break value is %07o\n\n",bv); /* memory deallocation: -02000 */ bv = sbrk(-1024); printf("sbrk returned %07o\n",bv); bv = sbrk(0); printf("Current break value is %07o\n\n",bv); }