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