当我的某个程序意外泄漏内存或堆栈溢出时,操作系统使用哪些方法来防止崩溃或不稳定的行为?
答案 0 :(得分:3)
简要说明:内存管理。
通常,每个进程都分配有限(但通常是可调整的)堆栈空间,因此单个进程不能用尽足以导致整个系统出现问题。
如果某个进程尝试访问已分配给它的内存之外的内存,那么(最坏的情况)会使进程本身崩溃;这样可以释放为该进程分配的资源,而无需踩到其他进程。
答案 1 :(得分:2)
操作系统通常不会防止程序中的内存泄漏;但是一旦你的应用程序结束,它的所有内存都会被回收。如果您的应用程序永远不会结束,那么当内存不足时,操作系统最终会遇到麻烦。
关于堆栈溢出,它们可以检测到您已经完成了堆栈大小。可靠性是在堆栈之后标记几页作为受保护的内存,如果您尝试访问它,那么您将得到段错误,您的程序将被终止。
答案 2 :(得分:2)
非常好的问题,谢谢你的提问。我可以想到三个问题。而且,对于每个问题,有两种情况。
堆栈溢出:如果您的程序是用汇编语言编写的,则操作系统可以检测到堆栈溢出,因为所有堆栈操作都是软件操作。运行时系统管理软件堆栈并知道何时发生溢出。
如果您已经用汇编语言编写程序并且错误地弹出硬件堆栈,那么操作系统无法保存您。坏事可能发生。
越界内存访问:当您的C ++程序启动时,操作系统会代表您将内存限制设置到CPU中。如果程序试图访问这些边界之外的内存,则CPU会引发硬件中断。操作系统在处理中断时可以告诉您程序出现异常。例如,当您尝试取消引用NULL指针时会发生这种情况。
但是,汇编语言程序可以尝试读取或写入任何内存。如果您的程序是礼貌的并且由操作系统以通常的方式启动,则操作系统可以捕获该错误。但是如果你的程序是邪恶的并且以某种方式开始在操作系统的范围之外,它可以做一些真正的损害。
内存泄漏:抱歉,没有人可以帮到你。