[5월 1일 1교시] 메모리 관리
분기
지역분기(local jump)
- goto문 : 함수 안에서만 분기해야 한다.
비지역 분기(nonlocal jump)
#include<setjmp.h>
※ env는 전역변수로 설정.
int setjmp(jmp_buf env);
기능 : 호출한 함수의 (스택 환경과) 레지스터 환경을 env(환경변수 아님)에 저장.
리턴
- setjmp가 바로 호출시 0.
- longjmp를 호출하면 setjmp가 호출되어 0이외의 지정된 값(val).
void longjmp(jmp_buf env, int val);
기능 : 저장된 스택 환경과 레지스터 환경으로 복원. setjmp가 지정한 위치로 제어가 이동.
val : setjmp의 리턴값.
비지역 분기 시 변수 값의 변화
- CPU나 레지스터에 저장된 변수들은 setjmp 설정 시 값으로 복원.
- 메모리에 저장된 변수들은 longjmp 호출 시 값 유지.
최적화 컴파일
- 최적화 X : register 변수 이외에는 메모리에 할당. (register 키워드가 있다고 무조건 register에 저장하지 않음.)
- 최적화 O : volatile 변수 이외에는 레지스터에 할당. (volatile 키워드가 있다고 무조건 메모리에 저장하지 않음.)
자원의 제약
<sys/resource.h>에 정의되어 있음.
struct rlimit
{
rlim_t rlim_cur; // soft limit(연성 제약) : rlim_cur~rlim_max 값으로 설정 가능.
rlim_t rlim_max; // hard limit(경성 제약) : rlim_cur보다 작지 않은 값으로 낮출 수 있음.
}