我有兴趣了解计算机如何为虚拟内存中的文件(例如硬盘驱动器)上的文件分配变量,计算机如何确定知道数据的放置位置。它几乎在两种内存存储类型中都是随机的,但并不是因为它根本无法将数据放在已经占用或分配给另一个进程的硬盘驱动器的内存地址或扇区(任何位置)。当我在我的旧W95系统上研究Norton的速度磁盘(一个解压缩硬盘驱动器上的文件的程序)时,我注意到该程序表示硬盘驱动器的数据(不同数据类型的颜色编码可视化地图,例如交换文件)总是排在第一位。),由许多文件组成,遍布整个硬盘驱动器,空闲的未使用区域。除了这些领域中的一些,我看到看起来像混合数据和空白空间显示出一个参差不齐的模式。我想随便认为这是发生的。同样明智的是,当我研究用C编写的简单程序的内存地址时,我注意到我的程序的每个版本在更改后重新编译它 - 显示了段和偏移的不同地址。当我重新编译它时,我期待计算机使用相同的地址。有时使用相同的地址,有时则不同。同样,我想也可以认为它的随机内存位置也可以由程序选择。我认为内存分配或文件写入是基于第一个可用的空白空间,以连续的方式编写。
所以我的问题是,我想知道在普通计算机的逻辑工作中它是如何以及它是什么,它决定了以任意方式为任何类型的位置(物理RAM或动态)写入数据的位置?我需要研究哪些计算机科学领域(如果不是汇编语言)才能解释这几乎是随机的行为?
先谢谢
答案 0 :(得分:0)
您应该查看virtual memory and TLB (translation lookaside buffer)或paging。
实现虚拟内存和分页并非易事。整个系统的性能取决于它。如果操作不正确,您的系统将thrash。
现在是凌晨,所以维基百科现在必须做:http://en.m.wikipedia.org/wiki/Translation_lookaside_buffer
编辑:
您在碎片整理中看到的那些彩色斑点是硬盘上的块。每个块都有一些指定的大小。根据硬盘的碎片程度,您的硬盘部分可能如下所示:
*-*-***-***-*
其中*表示已满,而 - 表示空
这(上面)可以是一个应用程序/文件或多个文件的一部分;我将假设一个文件被拆分,以简化我的示例。在每个*的末尾有一个指向下一个* chunk所在的下一个位置的指针(这称为linked list)。你的硬盘(或内存)碎片越多,这些指向下一个大块的指针就越多。这又为下一个指针使用了更多的空间,而不是使用数据空间,结果在读取数据时会产生更多的开销。如果这是磁盘上的文件,如果您的数据没有组合在一起(局部性原则),您将有多次搜索(这很糟糕,因为它们很慢)。当您使用碎片整理时,它会移动并将所有块组合在一起(尽可能最好)。
*-*-***-***-*
变为
*********----
操作系统决定分页和虚拟内存寻址(等等)。 TLB是一个辅助此过程的硬件(缓存)(它将物理内存映射到虚拟内存地址以便快速查找)。 CPU通过MMU
与TLB通信回答您的问题
- 你应该学习操作系统。
- 是的,将文件放在HDD上的位置由操作系统决定。如果您删除了一个文件并再次下载,则无法保证将其放置在同一位置 - 很可能不会。
我在这里提到的所有这些组件和原则的一个很好的总结工作:Click Here。这是一本关于实时操作系统书籍幻灯片的ppt(如果我没错,就像我使用的那样错误)
答案 1 :(得分:0)
更广泛而直接来自计算机科学的东西将是一个链表。 http://en.wikipedia.org/wiki/Linked_list
想象一下,如果您有一个链接列表并且只是将项目添加到最后,这些项目可能会在内存或磁盘或其他任何地方线性生活。但是当你删除项目编号为7的项目编号为7时,删除项目编号8时,删除列表中间的一些项目。与内存分配的allocs或虚拟内存或硬盘扇区分配等一样,你对存储的分割速度有多快与您用于分配下一个项目的算法有关。
文件系统可以/确实使用链接列表类型方案来跟踪哪些扇区绑定到单个文件。它可以快速轻松地使用链接列表,但可以处理碎片。一个更慢的方法是没有碎片,但要不断地复制/移动文件以保持它们在线性扇区上。
malloc()分配方案和MMU分配方案也属于这一类。基本上每当你拿东西时,将它分成几部分,并在这些分数前面放置一个虚拟界面,给程序员/用户外观它们是线性的。 Malloc()(不计算通过MMU的虚拟内存)是分配这些分数的多个线性块以满足alloc需求的另一种方式,并且具有尝试保持可用的大块的alloc / free方案,为了以防万一,一个糟糕的malloc系统是你可以释放一半内存的系统,但是没有内存不足错误的最大malloc是一个内存的一小部分的malloc,比如你有一个免费的演出而且只能分配4096个字节。