컴퓨터 공부/Advanced UNIX System Programming

[5월 1일 1교시] 메모리 관리

려리군 2009. 5. 1. 09:41

분기

지역분기(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보다 작지 않은 값으로 낮출 수 있음.

}