![用户空间内存会让系统失控吗?](https://linux22.com/image/155333/%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4%E5%86%85%E5%AD%98%E4%BC%9A%E8%AE%A9%E7%B3%BB%E7%BB%9F%E5%A4%B1%E6%8E%A7%E5%90%97%EF%BC%9F.png)
所以我正在阅读 Brian Ward 写的《Linux 工作原理》。他说,其中的用户空间应用程序出错不会破坏系统。
图 1-1。一般 Linux 系统组织 内核和用户进程的运行方式之间有一个关键的区别:内核在内核模式下运行,而用户进程在用户模式下运行。在内核模式下运行的代码可以不受限制地访问处理器和主内存。这是一个强大但危险的特权,它允许内核进程轻松地使整个系统崩溃。只有内核可以访问的区域称为内核空间。
相比之下,用户模式限制对内存子集(通常很小)的访问和安全的 CPU 操作。用户空间是指用户进程可以访问的主内存部分。如果一个进程出错并崩溃,其后果是有限的,并且可以由内核清除。这意味着,如果您的网络浏览器崩溃,它可能不会停止您在后台运行数天的科学计算。
理论上,用户进程失控不会对系统的其余部分造成严重损害。实际上,这取决于您所认为的“严重损害”以及进程的特定特权,因为某些进程被允许比其他进程执行更多操作。例如,用户进程是否可以完全破坏磁盘上的数据?有了正确的权限,是的,您可能会认为这相当危险。然而,有一些保护措施可以防止这种情况发生,并且大多数进程根本不允许以这种方式造成严重破坏。
例如,我读到过,Web 服务器在用户空间中运行,并且我看到它消耗了系统的所有内存并迫使服务器崩溃。但作者的说法与此相矛盾。
不知道是不是我理解错了作者的意思。我很抱歉。
有人可以解释一下用户空间应用程序是否会破坏系统以及原因吗?
感谢您的谦虚帮助。
答案1
我不认为你有什么特别的误解。是的,您读到的这两件事似乎确实不一致。作者(Brian Ward)未涉及的主题是拒绝服务攻击,尽管他们的名字不是总是恶意的。有时它们是偶然发生的。
我亲眼目睹了服务器被叉子炸弹。当然,服务器在技术上仍在运行,但没有其他服务可访问,并且意外的分叉炸弹预计运行时间约为一万亿年。大多数人会称之为崩溃。
拒绝服务攻击是不同的,因为它们由太多其他可接受的行动。例如,您可以请求网站的主页,这是可以接受的。现在,如果我们让一百万台计算机都请求它一亿次,那就会造成麻烦。
现在内核中有一些保护措施,这意味着它比您想象的更难做到。但基本原则是,运行许多线程的用户可以使用特定的(有限的)资源,以至于其他线程(来自其他用户)无法使用。挨饿了,无法使用该资源。
根据相关资源,内核可以使用类似的工具来防止这种情况发生cgroups。但是,如果您谈论更一般的情况,其中系统管理员/软件开发人员没有限制某些事情,那么您会发现诸如网络服务器发疯并耗尽所有可用资源之类的例子。
特别值得一提的一项资源是内存。当内存和交换空间完全耗尽时,内核将开始终止进程。因此,进程有可能强制内核杀死其他进程,这与某些人的看法相反,这并不能保证杀死麻烦的进程。
这意味着不受控制的用户空间程序可能会做一些最终迫使内核杀死完全不相关的程序的事情。即使系统运行正常,我仍将这种情况称为“造成严重破坏”。