指针指向什么类型的内存地址?

时间:2017-04-18 07:28:07

标签: pointers memory memory-management

我们知道C中的指针用于存储任何内存地址,但这是什么内存?我的意思是它是RAM还是硬盘? 对于变量,我可以断定它必须是RAM,因为变量仅在程序运行时存在。但功能怎么样?如果我创建一个指向函数的指针,那么它必须指向硬盘中函数的地址,因为即使程序没有运行,函数仍然存在。如果是这样,那么我们如何通过查看内存地址来知道它是对应RAM还是硬盘?

而且,例如,如果我有一个占用硬盘10MB的程序,当我运行程序时,首先将程序加载到RAM中。该程序在RAM中也占用10MB吗?如果没有,那么哪些因素决定了RAM中程序占用的内存?

2 个答案:

答案 0 :(得分:1)

指针指向过程'虚拟地址空间。地址可能由RAM,磁盘或两者都支持。

例如:

  1. 您使用malloc分配了一些内存。在这一点上它可能没有任何支持。

  2. 你写到那个记忆。现在它可能由RAM支持。

  3. 您的内存映射文件。此时它已备受文件支持。

  4. 你从那个记忆中读取。现在它由文件和RAM支持。

  5. 操作系统想要更多RAM用于磁盘缓存,并且您暂时无法访问该内存,因此它会丢弃您读取的页面,现在您的内存映射仅由该文件支持

  6. 操作系统窃取支持您使用malloc分配的内存的页面并写入,现在该内存仅由页面文件支持。

  7.   

    而且,例如,如果我有一个占用硬盘10MB的程序,当我运行程序时,首先将程序加载到RAM中。

    不适用于您可能使用的大多数现代操作系统。而是由可执行文件分配和支持10MB的虚拟地址空间。在访问页面时,页面将被读入RAM(并将分配RAM页面)。

      

    该程序在RAM中也占用10MB吗?

    还没有。但是在访问页面时将需要RAM。

      

    如果没有,那么哪些因素决定了RAM中程序占用的内存?

    根据为整个系统提供最佳性能的内容,操作系统必须做出决定。您可以将RAM视为缓存,当RAM可用以及访问或不访问数据时,OS会将内容移入和移出RAM。

答案 1 :(得分:0)

指针指向一些记忆,真实,同意。它指向的内存,取决于使用/环境。

详细说明,通常是针对用户空间程序,指针指向virtual address space中的某个地址。

另一方面,对于低级系统编程(例如在内核中)和没有MMU的操作系统,它指向物理内存。

  

我的意思是它是RAM还是硬盘?

两者都是,没有。这完全取决于。通常,在程序执行开始时,为每个进程分配一个虚拟地址空间。 MMU / OS的工作是确保所需的"实际"记忆可用"根据要求"。此外,这包括分页概念。

wikipedia

复制
           0                                            4GB
VAS 1      |---vvvv-------vvvvvv---vvvv----vv---v----vvv--|
mapping        ||||       ||||||   ||||    ||   |    |||
file bytes     app1 app2  kernel   user   system_page_file
mapping             ||||  ||||||   ||||       ||   |
VAS 2      |--------vvvv--vvvvvv---vvvv-------vv---v------|

显示,

  • 进程" app1"
  • 的虚拟地址空间
  • 进程" app2"
  • 的虚拟地址空间
  • 内核进程的虚拟地址空间
  • 用户空间库的虚拟地址空间
  • 页面文件的虚拟地址空间映射,用于访问虚拟内存。