每当某个进程试图增加其内存大小时,就受制于其所附加的 lnode 的内存限制(总和或者每一进程)。一个进程有五个方法可以用来尝试增加其内存大小:
调用分配例行程序,诸如 malloc(3C),其结果是调用 sbrk(2)系统调用。如果超过了内存设置,调用将返回一个错误,其 errno 设置为 ENOMEM。
扩充堆栈,促成一个堆栈故障,这样通常会促使向进程提供另外一个内存页。如果超过了内存限制,将会向进程发送一个 SIGSEGV 信号。
使用 mmap(2)。
使用 fork(2)。当子地址空间仍旧由父进程拥有时,子地址空间被复制。在复制过程中,新的地址空间不会超过 memory.plimit,因为父进程必须业已是在限制范围内;但是,分配要受制于 memory.limit。
使用 exec(2)。在 exec 过程中,随着旧的地址空间被废弃,内存利用率首先减少。但是,如果新的程序的地址空间较大,并导致超过限制,则 exec 也可能失败。