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())で割り当て、個々の割り当てにそのチャンクをカーブします。新しいRLIMIT_ASbrk()mmap()の後続の呼び出しにのみ影響するのに対して、malloc()コールを満たすヒープにはすでに十分な領域が割り当てられている可能性があります。全体的に、それは完全に正常です。

関連する問題