- 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