当地址空间分配给一个进程之后,接下来的访问会导致实际物理地址的分配,但是这个时候才会发现内存不足,那么,现在要做的不是发送信号(这个是我猜的),而是直接找些进程来KILL了。 [/quote]
是的,内存不足不会引起段错误。段错误通常出现在访问了非法的地址后,非法地址分为3类:
1. 访问的地址没有对应的物理内存。这类错误主要出现在越界访问,例如栈越界。比如说当前进程的栈只有5个页和它对应,共20k大小(x86平台),你访问的地址超过了这个范围,就会发生segmentation fault。
2.对地址的操作与该地址的属性不符合。例如该地址对应的内存是只读的,如文本段,你却试图进行写操作。
3.低权限访问高权限地址。这类情况发生在用户进程试图访问内核空间。例如x86中,TASK_SIZE以上的地址为内核空间,当用户态进程试图访问这些地址时,segmentation fault。
需要特别指出的是,并非所有的栈越界都会产生segmentation fault。我个人对linux进程栈的初始分配策略还不太清楚,例如写一个函数,实际栈只需要几百个字节,但在x86上越界访问80k的地址也不会出错,所以我对一个进程初始栈大小是多少还比较迷惑。有清楚的朋友不妨讲解一下。
当内存不足时,kernel会首先调用free_more_page()函数释放一些页,例如page cache、slub,如果仍然不够,杀掉进程。还是不够,就启动臭名昭著的oom_killer了
也有可能是环境配置的问题