我对操作系统内部工作原理了解不多,那么为什么我们对 Linux 中打开文件和运行进程的最大数量有限制?
如果有人能帮助我理解我将不胜感激。
答案1
这主要是出于历史原因。在较旧的 Linux 主机上,许多用户会连接并使用主机的资源。当然,有必要进行限制,而且由于文件句柄和进程等操作内置在内核中,因此限制了这些操作。它还有助于限制类似叉子炸弹. 使用进程限制来防御表单炸弹这里。
它还通过不允许失控的分叉和文件打开(类似于分叉炸弹试图做的事情)来帮助控制复杂的服务和守护进程。
另外需要注意的是可用的 RAM 和 CPU 数量,以及 32 位计数器只能引用这么多(32 位计数器只能计数 4294967296 个条目),但这些限制远远高于程序员和系统管理员通常设置的限制。无论如何,早在您拥有 4294967296 个进程之前,您的机器可能已经重新启动,要么按计划重新启动,要么由于缺乏其他资源而开始锁定。
除非你运行泰坦由于其内存为 584 TiB(您不会用到,因为 Linux 无法在超级计算机上以单个实例的形式运行),您可能不会很快达到此进程限制。即便如此,假设没有共享内存,平均进程也只有大约 146KB 的内存。
答案2
生活中和 Linux 中,大多数事物都有限制。有时这些限制非常高,不值得担心,有时这些限制又太低,可能是由懒惰的程序员随意设定的,也可能是硬件限制。
当程序员做出决定(例如字段(例如地址)中允许的最大字符数)时,就会出现任意限制。设置一些任意限制比根据需要动态分配内存要容易得多。您不想将所有可用内存分配给一个简单的输入字段,但您也不想让输入覆盖其他可能很重要的内存。对于打开的文件和进程,可能存在任意限制,也可能受可用内存限制。如果是后者,那么当您接近限制时,就会开始发生不好的事情,系统可能会挂起,因此,在发生这种情况之前设置一个限制通常是件好事。有时,任意限制可能在启动时根据内存或磁盘空间确定,并且通常相当智能,但仍然是任意的 - 有人决定性能在何处变得无法容忍或危险,并设置限制以避免这种情况。
然后是硬件设置的限制,例如整数或字符的大小。如果您使用的是 32 位系统,那么整数的最大大小会受到限制(如果是无符号整数,则为 4,294,967,295;如果是带符号整数,则为 4,294,967,295 的一半)。
答案3
对于进程,/proc/sys/kernel/pid_max 是允许的最大 pid,因此这是任何时刻可以运行的进程数量的硬性限制。但是,内存限制通常在此之前就已经发挥作用。
对于整个机器上打开文件的上限,/proc/sys/fs/file-max 是硬限制;它基于机器中的内存量,因此会有所不同。内核将其设置为:
n = (mempages * (PAGE_SIZE / 1024)) / 10;
files_stat.max_files = max_t(unsigned long, n, NR_FILE);
每 1 MB RAM 大约有 100 个。
每个进程的限制不同。ulimit 将定义这些。
答案4
我们有一个限制,因为计算机有限制,我有 4GB 的 RAM,所以我现在无法运行 15 个游戏,可以吗?
我很可能可以运行它但会产生一些滞后但这不是人为的,这是你的 PC 和 Linux 内核的限制,你需要更好的内核和大量的 RAM 才能容纳任何抛给你的程序。
就像我的笔记本电脑运行 Windows 7 时,我可以玩战地,但它占用了 80% 的内存,所以如果我尝试玩“极品飞车”,这通常需要 60%,我可以同时打开两者,但我的整个系统都会变慢,因为我正在运行 2 个重型程序,它们都在争夺内存(随机存取存储器)
简而言之,普通计算机无法同时运行很多程序,音乐、记事本、浏览器、电子邮件、游戏,您认为这些对计算机来说很多,但那仅仅是,像魔兽世界这样的游戏会占用更多的 RAM 并使您的计算机难以应付(除非您像昂贵的笔记本电脑一样拥有 8-16 GB 的 RAM!)