MLOCK(2)

명칭
mlock, munlock - 물리 페이지를 메모리내에서 락 (언로크) 한다

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/mman.h> int mlock(const void *addr, size_t len) int munlock(const void *addr, size_t len)

해설
mlock() 시스템 콜은, addr (으)로부터 개시한다 len 바이트의 가상 주소 범위에 대응하는 물리 페이지를 메모리에 잠급니다. munlock() 호출은, 1 개(살) 이상의 mlock() 호출에 의해 락 되고 있었다 페이지를 언로크 합니다. 이러한 양쪽 모두에 대해, addr 파라미터는 페이지 사이즈의 정수배가 아니면 안됩니다. len 파라미터가 페이지 사이즈의 정수배가 아닌 경우, 끝맺을 수 있습니다. 범위 전체가 확보되고 있을 필요가 있습니다.

mlock() 호출의 뒤, 지시받은 페이지는, 언로크 될 때까지 비상주페이지 폴트도 어드레스 변환 fault도 일으키지 않습니다. 그러나, TLB 의 관리를 소프트웨어로 실장하고 있는 아키텍쳐에서는, 보호 위반 fault, 또는 TLB 미스 fault를 일으킬 가능성은 있습니다. 페이지에 관한 모든 락 된 매핑이 삭제될 때까지 물리 페이지는 메모리에 머뭅니다. 복수의 프로세스가, 각각의 가상 주소 매핑으로부터 같은 물리 페이지를 잠근다 가능성이 있습니다. 같이 1 개의 프로세스가 같은 페이지에 대한 다른 복수의 가상 매핑에 의해, 또는 같은 주소 범위에의 네스트 했다 mlock() 호출에 의해, 페이지를 다중에 잠근다 가능성이 있습니다. 언로크는, munlock() 에 의해 명시적으로, 또는 munmap() 에 의해 암묵적으로 행해집니다. munmap() (은)는 MAP되어 있지 않은 주소 범위의 할당을 해제합니다. 락 된 매핑은 fork(2) 에 의한 child process에는 계승되지 않습니다.

물리 메모리는 잠재적으로 부족한 리소스이므로, 프로세스는 어느 정도 잠글 수 있을까의 제한을 받습니다. 1 개의 프로세스는, 시스템 전체에 공통의 ``고정된 페이지''한계, 또는 프로세스마다의 RLIMIT_MEMLOCK 리소스 한계의 언젠가 작은 (분)편의 값까지 mlock() 할 수 있습니다.

이러한 호출을 이용할 수 있는 것은 슈퍼 유저 뿐입니다.

반환값

호출이 성공하면(자), 범위내의 모든 페이지가 락 (언로크) 됩니다. 실패했을 경우는, 범위내의 모든 페이지의 락 상태는 변경되지 않습니다.

에러
mlock() (은)는 다음의 경우에 처리를 실패합니다.

[EPERM]
    호출측이 슈퍼 유저가 아닙니다.

[EINVAL]
    지정된 주소가 페이지 경계에 정렬되어 있지 않은지, 또는 길이가 부입니다.

[EAGAIN]
    지시받은 범위의 락에 의해, 락 된 메모리에 대한 시스템 한계 또는 프로세스마다의 한계를 초과해 버립니다.

[ENOMEM]
    지시받은 주소 범위의 일부를 할당할 수 있고 있지 않습니다. 페이지의 fault / 매핑으로 에러가 있었습니다.
munlock() (은)는 다음의 경우에 실패합니다.

[EPERM]
    호출측이 슈퍼 유저가 아닙니다.

[EINVAL]
    지정된 주소가 페이지 경계에 정렬하고 있지 않는지, 또는 길이가 부입니다.

[ENOMEM]
    지시받은 주소 범위의 일부를 할당할 수 있고 있지 않습니다. 지시받은 주소 범위의 일부가 락 되고 있지 않습니다.

관련 항목
fork(2), mincore(2), minherit(2), mmap(2), munmap(2), setrlimit(2), getpagesize(3)

버그
Sun 의 실장과 달리, 같은 주소 범위에 관한 복수의 mlock() 호출에 대해서, 실제로 페이지를 언로크 하기 위해서 대응하는 수의 munlock() 호출이 필요합니다. 즉 mlock() 의 네스트입니다. 이것은 실장상의 결과이며 사양은 아니라고 생각할 필요가 있습니다.

프로세스마다의 리소스의 한계는 락 된 가상 메모리의 양에의 제한으로, 시스템 전체에 공통의 제한은 락 된 물리 페이지의 수에 대한 물건입니다. 이와 같이, 2 개(살)의 다른 매핑으로부터 같은 물리 페이지를 잠그면(자) 프로세스마다의 제한에 대해서는 2 페이지로서 카운트 되어 시스템 제한에서는 1 페이지만으로서 카운트 됩니다.

프로세스마다의 리소스 제한은 현시점에서는 서포트되고 있지 않습니다.

역사
mlock() 함수와 munlock() 함수는 4.4BSD 그리고 처음 등장했습니다.