操作系统告诉子进程的“可用内存”

操作系统告诉子进程的“可用内存”

我想知道操作系统如何让子进程知道有多少可用内存。

假设整个计算机内置了 1GB RAM 内存。操作系统运行时会使用 100MB(我不知道操作系统实际上使用了多少)。因此还剩下 900MB。

然后运行 ​​10 个程序。每个程序创建 10 个子进程。问题是,这些父进程和子进程认为它们可用的总内存是多少。

作为问题的第二部分,为了使它更复杂一些,假设应用程序已经运行了一段时间,现在计算机上有 500MB 可用空间(假设操作系统使用了 100MB 以上,应用程序使用了 300MB 以上,才达到剩余 500MB 的水平)。现在的问题是这些父进程和子进程此时将可用内存视为什么。它是否与以前相同,还是不同,以及它有何不同。

之所以问这个问题,是因为我读过虚拟内存其中指出:

虚拟内存[是一种]提供“给定机器上实际可用的存储资源的理想化抽象”的技术,它“给用户创造了非常大的(主)内存的错觉”。

因此,基本上,听起来情况 (1) 中的每个进程都会被告知“您有 1GB 可用内存”,或者“您有 900MB 可用内存”。如果它说全部的就整台计算机或总体而言 - 操作系统的使用情况。

然后对于情况 (2),它会显示“1GB 可用”、“900MB 可用”、“600MB 可用”或“500MB 可用”。同样的情况,我不确定它会说什么。

它也可能与这些值不同。操作系统可以以某种方式估算 100 个子进程的可用内存,也许会将其平均分配。因此,如果计算机上剩余 500MB,则意味着每个进程都会被告知“您有 500 / 100 == 5MB 的可用空间”。但如果是这样的话,如果一个进程用完了 5MB,而还剩下 495MB,不知道它是否可以开始使用这个,并被告知可用的新数字。这就是为什么我不认为这是通常的做法,相反,操作系统似乎会告诉大概计算机上有什么整体而言(所以是 1GB)。

另外,我认为它总是显示“1GB”的原因在于我不确定是否有办法确定单个进程正在使用多少内存(或者操作系统是否知道它正在使用多少内存)。如果操作系统知道它本身使用了多少,那么它似乎会报告 900MB。

另一个令人困惑的地方是,如果内存使用量不断变化,并且操作系统告诉每个进程总内存是多少(已用内存),那么如果您尝试访问更多内存,就必须不断检查有多少内存可用。也就是说,您无法在程序启动时缓存内存使用量。可能是程序闲置了几个小时,在“计算机上”以 100MB 内存启动,但之后再次检查时发现“哦,等等,只有 5MB 可用”。出于某种原因,这似乎是不受欢迎的行为,但我不确定。

任何有助于理解操作系统如何告知子进程在不同时间点有多少可用内存的帮助都会很有帮助。谢谢。

答案1

操作系统不会“告诉”程序有关可用内存的任何信息。

每个程序都在自己的虚拟内存区域中运行,在该区域中,它可以访问(它所认为的)整个潜在的允许的内存地址空间。对于 32 位进程,它所知道的“内存”是整个 4GB 可寻址内存,对于 64 位进程,空间要大得多。进程可以从该区域分配内存,然后告诉操作系统它需要用物理内存支持该地址空间的区域,以便可以读取和写入,但程序(理论上)拥有它想要的内存量。

在只有 1GB RAM 的系统上,这意味着当物理内存已满时,操作系统就会开始将数据推送到交换文件或分区。此操作无需实际进程的参与,而实际进程的内存正在被调出。如果进程尝试访问调出的内存,则操作系统会暂停该进程,从磁盘中拉回数据并恢复该进程。

程序可以询问有多少物理 RAM 是空闲的,这样它们可以在内存不足的情况下限制自己,但是它们不会受到操作系统的人为限制,除非它用完了物理 RAM 和交换空间,在这种情况下程序在尝试分配内存时只会收到错误。

答案2

在现代操作系统上运行的一大优点是应用程序无需知道系统中有多少 RAM 或有多少可用。事实上,大多数应用程序都对 RAM 细节、CPU 有多少个核心、物理驱动器的大小和数量、计算机是否连接到网络或互联网等一无所知。这是理所当然的。操作系统的设计就是为了以这种方式使用。

操作系统为应用程序提供了一个独立于硬件的标准虚拟化环境。应用程序不直接访问 RAM,而是仅访问与 RAM 大小无关的虚拟地址空间。对于应用程序来说,这就是内存。RAM 只是一种性能优化(在当前技术下是必要的)和实现细节。应用程序代码和数据的部分将位于 RAM、页面文件或原始文件中。这可以根据应用程序的需求和资源可用性而变化。这些细节由操作系统管理,对于应用程序来说是不可见的,即使应用程序想要查找也无法找到。

对于需要此信息的应用程序,可以从操作系统请求硬件详细信息,但很少有应用程序这样做。大多数情况下,只有系统实用程序才需要此信息。大多数应用程序对此的需求很少,就像普通驾驶员不需要了解点火正时或燃料混合物一样。

所有这些都是好事。这意味着应用程序开发人员可以将时间投入到应用程序的需求中,而不必处理运行它的硬件的复杂细节。这就是操作系统的用途。这意味着为具有 4 MB RAM 的 Windows 95 设计的正确编写的应用程序可以在具有许多 GB RAM 的现代 Windows 10 系统上运行。并且应用程序的运行方式相同,并且不知道其中的区别。并非所有应用程序都编写得那么好。当然,现代系统的性能会更好,并为用户提供更多功能,但应用程序对此一无所知。

这意味着操作系统设计人员和开发人员需要做大量的工作,但数百万用户将从中受益。

相关内容