C 编程中的“内存”究竟是什么?

ech*_*hmi 0 c memory computer-science

我很想知道“内存”到底代表什么。

当我编译并执行此代码时:

#include <stdio.h>
  
int main(void)
{
   int n = 50;
   printf("%p\n", &n);

}
Run Code Online (Sandbox Code Playgroud)

正如我们所知,我们得到一个十六进制输出,如:

0x7ffeee63dabc
Run Code Online (Sandbox Code Playgroud)

该十六进制地址在物理上代表什么?它是我计算机 L1 缓存的一部分吗?内存?固态硬盘?

我在哪里可以阅读更多关于此的信息,任何参考资料都会有所帮助。谢谢你。

一些背景: 经过几年的休息,我最近重新开始学习计算机科学(我在该行业担任低代码/无代码 Web 开发人员)并意识到我想要的知识存在一些差距上色。

在学习 C(通过CS50x)时,我正处于Memory的一周。我意识到我实际上并不知道这指的是什么 Memory。该课程要么假设学生已经知道这一点,要么假设它与本课程的上下文无关(这是一门介绍课程,因此抽象是有意义的,以避免陷入困境),但我很好奇,我会喜欢去追寻答案。

use*_*751 5

计算机体系结构 101

  • 在您的计算机中,有一个 CPU 芯片和 RAM 芯片。
  • CPU 的工作是计算事物。RAM 的工作是记住事物。
  • CPU负责。当它想记住某事或查找正在记住的某事时,它会询问 RAM。
  • RAM有一堆可以存储东西的插槽。每个时隙容纳 1 个字节。时隙号(数量不限狭槽,但数量时隙)称为地址。每个插槽都有不同的地址。它们从 0 开始并上升:0, 1, 2, 3, 4, ... 就像街道上的信箱一样,但从 0 开始。
  • CPU 告诉 RAM要记住哪些内容的方式是使用一个称为地址的数字。
  • CPU 可以说:“将数字 126 放入插槽 73224。” 它可以说,“哪个号码在插槽 97221 中?”
  • 我们通常用十六进制写插槽号(地址),前面有 0x 来提醒我们它们是十六进制的。这是传统。
  • CPU 如何知道它要访问哪个地址?很简单:程序会告诉它。

操作系统 101

  • 操作系统的工作是保持系统平稳运行
  • 当错误的程序被允许访问不属于它们的内存时,这不会发生。
  • 因此,操作系统决定允许程序访问哪些内存,不允许访问哪些内存。它告诉 CPU 这个信息。
  • “我可以访问这个内存吗?” 信息适用于称为“页面”的 4 KB 块。您可以访问整个页面,也可以不访问。那是因为如果每个字节都有单独的访问信息,那么仅存储访问信息就需要浪费一半的 RAM!
  • 如果您尝试访问 OS 说您无法访问的页面中的地址,CPU 会自动访问 OS,然后它会停止运行您的程序。

操作系统 102

  • 还记得 Windows 95 天的这个闪亮的新“虚拟内存”功能吗?
  • “虚拟内存”意味着您的程序使用的地址不是真正的 RAM 地址。
  • 每当您访问一个地址时,CPU 都会查找实际地址。这也使用页面。所以操作系统可以让任何“地址页面”转到任何“真实页面”。
    这些不是官方术语——操作系统设计者实际上说任何“虚拟页面”都可以“映射”到任何“物理页面”。
  • 如果操作系统想要一个物理页面但没有任何剩余,它可以选择一个已经使用的页面,将其数据保存到磁盘上,记下它在磁盘上,然后它可以重用该页面。
  • 如果程序试图访问磁盘上的页面怎么办?操作系统对 CPU 说谎:它说“不允许程序访问此页面”。即使是允许的。
  • 当CPU narcs 到操作系统时,操作系统不会停止程序。它暂停程序,找到其他东西存储在磁盘上以腾出空间,读取程序所需页面的数据,然后取消程序暂停并告诉 CPU“实际上,他现在可以访问这个页面了”。绝招!
  • 这就是虚拟内存。CPU 不知道磁盘上的页面和未分配的页面之间的区别。您的程序不知道磁盘上的页面和不在磁盘上的页面之间的区别。当您的程序必须从磁盘获取某些内容时,它会遇到一点小问题。
  • 了解虚拟页面是否实际存储在 RAM 中(在物理页面中)或是否在磁盘上的唯一方法是询问操作系统。
  • 虚拟页码不必从0开始;操作系统可以选择它想要的任何虚拟页码。

计算机体系结构 102

  • 缓存是 CPU 中的一小部分内存,因此它不必一直向 RAM 芯片询问。
  • CPU 第一次想从某个地址读取时,它会询问 RAM 芯片。然后,它选择要从其缓存中删除的内容,将其删除,并将刚刚读取的值放入缓存中。
  • 每当 CPU 想要从某个地址读取时,它首先检查它是否在缓存中。
  • 缓存中的东西也在RAM 中。这不是一个或另一个。
  • 缓存通常存储 64 字节的块,称为缓存行。不是页面!
  • 没有一个很好的方法来知道缓存行是否存储在缓存中。甚至操作系统也不知道。

编程语言设计101

C 不想让你知道所有这些东西。

C 是一组关于如何编写程序和不编写程序的规则。设计 C 的人不想解释所有这些东西,所以他们制定了关于你可以用指针做什么和不能做什么的规则,这就是它的结束。

例如,该语言不了解虚拟内存,因为并非所有类型的计算机都有虚拟内存。洗碗机或微波炉对它没有用处,这将是浪费金钱。

该十六进制地址在物理上代表什么?它是我计算机 L1 缓存的一部分吗?内存?固态硬盘?

地址 0x7ffeee63dabc 表示虚拟页面 0x7ffeee63d 中的地址 0xabc。它现在可能在您的 SSD 上或在 RAM 中;如果您访问它,那么它必须进入 RAM。它目前也可能在缓存中,但没有好的方法可以分辨。无论它去哪里,地址都不会改变。