【问题标题】:Are Unix/Linux systems vulnerable to leaking global kernel objects?Unix/Linux 系统是否容易泄露全局内核对象?
【发布时间】:2011-07-09 10:01:20
【问题描述】:

在 Windows 中,系统维护了一些对象 - 事件、文件访问句柄、窗口、计时器等,这些对象不是无限的,因此系统中的所有程序都可以创建不超过 50k 的对象(我是不确定确切的数字,但对于这个问题不是很关键)。

因此,如果某个程序运行了很长时间并创建了很多对象并且没有释放它们(就像内存泄漏,但这里系统对象被泄漏),系统最终会耗尽对象和其他尝试尝试的程序做一些需要创建任何新系统对象的事情开始从系统函数中获取错误指示。例如,程序 A 运行并泄漏系统可用的所有对象,然后程序 B 尝试打开文件并失败,只是因为系统没有资源来服务该请求。此时唯一的解决方案是重新启动程序 A,以便系统回收泄漏的资源。

在 Unix/Linux 系统上是否存在同样的问题,或者它们是否受到某种保护?

【问题讨论】:

  • 我不确定“泄漏”是否正确。也许“精疲力竭”会更准确。内核尽最大努力确保没有资源泄漏——就像完全丢失的资源一样。它对消耗大量资源的不良程序无能为力 - 除非确保在程序终止时清理混乱。而且,在 Linux 上,在内存滥用的情况下,它会启动 OOM Killer。

标签: windows linux unix resources operating-system


【解决方案1】:

它们会遇到相同的问题,但在某种程度上可能会被强化/限制。通常默认情况下,每个进程的限制方式低于可能导致系统范围问题的任何内容。你所要做的就是启动很多进程。其中一些限制可以通过ulimit 命令查看。一些 *nix 可以为每个用户设置限制(请参阅某些 linux 系统上的 /etc/security/limits.conf)

但是如果你取消限制,或者有很多进程做坏事,系统范围的总限制通常受可用资源(内存)的限制

如果您想演示资源限制,请在 bash shell 中运行 this command 并查看您的系统是否仍然可用:

:(){ :|:& };: 

【讨论】:

  • 警告:在某些 unix 系统上,fork 炸弹会使操作系统完全无响应(需要硬重启)。不要在家里尝试这个(更不用说在工作中了)!
  • 我不知道表情可以杀人!
【解决方案2】:

Unix/Linux 中的两个错误号是:

  • ENFILE (23):系统中打开的文件过多
  • EMFILE (24):打开的文件太多

第一个是系统范围的限制,第二个是每个进程的限制。系统范围的限制通常足够大,以至于现在大多数系统都不会遇到它,但在 PDP-11 计算机时代,它 (ENFILE) 是一个真正的问题。

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多