2016-10-15 8 views
0

setrlimitgetrlimit을 사용하여 Linux 자원 제어를 배우고 있습니다. 아이디어는 특정 프로세스에 사용할 수있는 메모리의 최대 양을 제한하는 것이다setrlimit가 최대 메모리 용량 제한에 작동하지 않습니다

#include <sys/resource.h> 
#include <sys/time.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    // Define and object of structure 
    // rlimit. 
    struct rlimit rl; 

    // First get the limit on memory 
    getrlimit (RLIMIT_AS, &rl); 

    printf("\n Default value is : %lld\n", (long long int)rl.rlim_cur); 

    // Change the limit 
    rl.rlim_cur = 100; 
    rl.rlim_max = 100; 

    // Now call setrlimit() to set the 
    // changed value. 
    setrlimit (RLIMIT_AS, &rl); 

    // Again get the limit and check 
    getrlimit (RLIMIT_AS, &rl); 

    printf("\n Default value now is : %lld\n", (long long int)rl.rlim_cur); 

    // Try to allocate more memory than the set limit 
    char *ptr = NULL; 
    ptr = (char*) malloc(65536*sizeof(char)); 
    if(NULL == ptr) 
    { 
     printf("\n Memory allocation failed\n"); 
     return -1; 
    } 

    printf("pass\n"); 

    free(ptr); 

    return 0; 
} 

상기 코드 제한 100 바이트 (딱딱하고 부드러운)에 메모리. 그러나 malloc은 여전히 ​​오류없이 반환됩니다. 코드에 문제가 있습니까? 내가 얻은 결과는 다음과 같습니다.

Default value is : -1 
Default value now is : 100 
pass 

답변

1

아니요, 코드에는 아무런 문제가 없습니다. RLIMIT_AS즉발이 있다고 가정하는 것은 잘못된 것입니다. malloc()에 영향을줍니다. 요컨대, 후자 (일반적으로 많은 변형이 있음)는 brk() 또는 요청시 매핑 된 페이지가 mmap() 인 힙 (heap) 덩어리로 백업 메모리를 할당 한 다음 해당 덩어리를 개별 할당으로 조각합니다. 새 RLIMIT_ASbrk()mmap()에 대한 이후 호출에만 영향을주는 반면에 malloc() 호출을 충족시키기 위해 힙에 할당 된 충분한 공간이 이미 있습니다. 결국, 그것은 완벽하게 정상입니다.