Friday, May 9, 2008

Memory, Locking

알다시피 Linux는 demang paging(필요하면 그때 swap in 해주고 안쓰면 디스크로 다시 swap out하는) 이다. 그래서 실제 가지고 있는 물리적 메모리 공간 보다 더 큰 공간을 가상으로 제공해준다. 하지만, 경우에 따라서 자신의 메모리가 디스크로 swap out 되면 안되는 경우도 있다.

  • Determinism 특정 메모리에 올라가 있는 루틴이 일정시간내에 반드시 끝나야 하는 경우이다. 디스크에 swap out 되어 있으면 swap in 하는데 걸리는 시간이 상당하므로 정해진 시간에 응답하지 못할 수도 있다.

  • Security암호화된 비밀 정보를 디스크에서 읽어 복호화 한다음 메모리에 가지고 있었는데, 이 영역이 swap out되면 디스크에 복호화된 비밀정보가 남아 보안상의 취약점이 될 수 있다.


그래서 메모리의 일정 부분은 swap out 되지 않도록 잠글 수 있는데, 이 때 사용되는 함수가 mlock() 이다.

#include <sys/mman.h>

int mlock(const void *addr, size_t len);
int mlockall(int flags);

그 외에 특정 프로세스의 모든 부분을 locking 하고싶은 경우에는 mlockall()을 사용하면 된다. mlockall()에서 사용되는 flag으로는 아래 두가지가 있는데 일반적으로 두개를 다 OR해서 사용한다.

  • MCL_CURRENT 현재 프로세스가 사용하는 모든 메모리를 lock

  • MCL_FUTURE 앞으로 사용할 메모리까지도 lock


lock된 메모리의 해제는 munlock(), munlockall(void)을 통해 진행하면 된다. CAP_IPC_LOCK이 설정된 경우에는 무한정으로 메모리를 잠글 수 있지만, 그렇지 않은 경우에는 RLIMIT_MEMLOCK 에 설정된 바이트 까지만 locking할 수 있다. (default로 32KB 이다)

특정 페이지가 디스크에 있는지, 메모리에 있는지를 확인하는 함수로 mincore()가 있다. 아래와 같은데, 이 함수는 bit vector 형식으로 페이지의 메모리/디스크 상주 여부를 리턴해준다.

#include <sys/mman.h>
#include <unistd.h>

int mincore(void *start,
size_t length,
unsigned char *vec);

안따깝게도 이 함수는 MAP_SHARED 옵션으로 mmap 맵핑된(실제 파일에) 영역에 대해서만 정상적으로 동작한다.

No comments:

Post a Comment