我知道在 32 位系统中,我们可以拥有的最大内存是 4GB(2^32)。但我不清楚这对文件意味着什么。
我认为我们的硬盘中可以有任意大小的文件,对吧?远远超过 4GB。那么 32 位系统和大文件有什么注意事项吗?
我假设某些 32 位程序无法加载超过 4GB 的文件,还是我错了?
答案1
只有当您的应用程序尝试将整个文件加载到内存中时,这才会产生影响。
对如此大的文件这样做的程序员应该被枪毙。有更好的方法。
有些软件可能会在处理非常大的文件(大文件指大于 2 GB)时出现问题,但此类软件在 64 位系统上通常也会出现问题。
在大多数情况下,这是因为程序员的软件是为较小的文件设计和测试的。软件包含逻辑错误,导致其无法正常处理非常大的文件。这不是操作系统本身的限制。
(非常常见的例子是使用有符号的 32 位数字来跟踪文件中的位置,这在 2 GB 边界处会出现问题。)
以您的示例视频为例:通常只有一小部分(实际播放的部分和额外几秒的缓冲时间)会加载到内存中。通常每次加载量不超过 2-3 兆字节。
至于硬盘上的任意大小文件:事实并非如此。
每个文件系统对任何单个文件的最大大小都有限制。
例如,对于 Fat32,该限制为每个文件 4 GB。NTFS 的限制为 16 TB。Linux 文件系统 ext3 的限制为 16GB、256GB 或 2TB,具体取决于文件系统使用的是 1K、2K 还是 4K 块。
答案2
我知道在 32 位系统中我们可以拥有的最大内存是 4GB(2^32)。
这是错误的;32 位 CPU 完全可以使用超过 4 GiB 的 RAM,就像 16 位 CPU 可以使用超过 64 KiB 的 RAM 一样。回想一下16 位 80286 可以寻址 16 MiB通过其 24 位地址总线(当时这被认为是一个巨大的内存量;80286 于 1982 年问世,并且1983 年推出第一台 3.5 英寸硬盘,容量为 10 MB贮存容量; 这IBM 个人计算机(基于 Intel 80286 设计,最低配备 256 KiB RAM)和 1979 年推出的Intel 8086 的地址空间为 1 MiB(并假设计算能力原装 IBM 5150 电脑可以升级到相同的 256 KiB RAM 容量,远远超出 16 位地址 64 KiB 的本机限制)。查找以下技术物理地址扩展,银行转换(尽管需要程序员小心谨慎,但由于其相对简单的实现,在早期的个人电脑和早期的电子计算机中很常见;阿波罗制导计算机采用的是分组切换设计)和分段内存模型,例如x86 内存分段模型。
在不依赖这些技术的情况下,最终限制内存寻址能力的因素是 CPU 原生地址总线,独立于CPU 的本机字宽,或通常所说的位数。即使 CPU 具有 16 位地址总线,也完全有可能制造出能够处理 64 位数据块的 CPU(这将使其成为 64 位 CPU);我看不出有任何这样的实际应用,但从技术上讲这并不矛盾。
现在,很多人不关心 32 位 CPU 上的这些技术,因为在它们在 PC 上很常见的时代,4 GiB 已经足够了,而且 32 位 CPU 通常有足够宽的地址总线,不用担心这个问题;即使是功能降低的80386SX 有 24 位可用地址总线,允许 16 MiB 的地址空间,同年还引入了20 MB 硬盘设置. 无需担心分段、PAE 和类似技术,生活很多对程序员来说更容易。但是,32 位服务器软件通常是为处理超过 4 GiB 的 RAM 而编写的。
当然,从长远来看,16 位软件通常可以处理大于 65,536 字节的文件。如果您希望软件能够原生处理无法放入单独分配的内存块中的大文件,则需要花点心思,但这绝对并非不可能。
但我不清楚这对文件意味着什么。我认为我们的硬盘中可以有任意大小的文件,对吧?远远超过 4GB。
不,你不能任意地即使受到可用物理存储空间的限制,文件系统也会限制文件的大小:在最低逻辑级别,文件系统限制了文件的大小,因为它需要能够在某个地方存储文件的大小。确切的限制因文件系统而异,有时也因设置而异。对于 NTFS、ext4 等现代文件系统,限制足够高,以至于您不太可能用单个磁盘达到这些限制,尽管可能如果您拥有大型存储阵列,则可能会出现问题。例如,NTFS(文件系统)支持最大 16 EiB 的文件大小,尽管NTFS 实现在 Windows 中目前(人为地)有限的最大文件大小略低于 256 TiB(Windows 8 和 Windows Server 2012 发布时从 16 TiB 提高)。
16 TiB 并不是一个过大的存储空间;您可以通过在 RAID-6 中运行例如 7 个 4 TB 的磁盘来实现这一目标,这当然是在个人的经济承受范围内的。
不同版本的 Windows 也做了同样的事情,人为地限制可用 RAM 的数量尽管底层架构允许使用更多功能。
那么 32 位系统和大文件有什么注意事项吗?我假设某些 32 位程序无法加载超过 4GB 的文件,还是我错了?
这取决于软件,在较小程度上也取决于它如何处理数据文件,所以是的,如果关键词是某些 32 位程序那么你的假设几乎肯定是正确的。不过,某些 64 位程序处理大型文件可能也不太好。我偶尔在工作中遇到这种情况;例如,Microsoft Word 2010 会拒绝加载任何大于 512 MB 的文件,即使我有足够的内存可用,如果只是想尝试使用它的话。
如果软件尝试一次性将整个文件加载到内存中(实际上不应该)并且没有人为的限制,当前操作系统的限制因素将是可用的虚拟内存大小。(注意:虚拟内存和交换是完全不同的两件事。你还需要考虑内存过度使用) 另一方面,如果软件一次只将文件的一部分加载到内存中,只要操作系统本身提供访问 32 位大小边界(4 GiB)之外的文件部分的功能,并且文件系统可以处理文件的大小,则文件的实际大小几乎不应该成为问题,如果是,则很可能是用户空间软件错误。