我们知道C中的指针用于存储任何内存地址,但这是什么内存?我的意思是它是RAM还是硬盘? 对于变量,我可以断定它必须是RAM,因为变量仅在程序运行时存在。但功能怎么样?如果我创建一个指向函数的指针,那么它必须指向硬盘中函数的地址,因为即使程序没有运行,函数仍然存在。如果是这样,那么我们如何通过查看内存地址来知道它是对应RAM还是硬盘?
而且,例如,如果我有一个占用硬盘10MB的程序,当我运行程序时,首先将程序加载到RAM中。该程序在RAM中也占用10MB吗?如果没有,那么哪些因素决定了RAM中程序占用的内存?
答案 0 :(得分:1)
指针指向过程'虚拟地址空间。地址可能由RAM,磁盘或两者都支持。
例如:
您使用malloc
分配了一些内存。在这一点上它可能没有任何支持。
你写到那个记忆。现在它可能由RAM支持。
您的内存映射文件。此时它已备受文件支持。
你从那个记忆中读取。现在它由文件和RAM支持。
操作系统想要更多RAM用于磁盘缓存,并且您暂时无法访问该内存,因此它会丢弃您读取的页面,现在您的内存映射仅由该文件支持
操作系统窃取支持您使用malloc
分配的内存的页面并写入,现在该内存仅由页面文件支持。
而且,例如,如果我有一个占用硬盘10MB的程序,当我运行程序时,首先将程序加载到RAM中。
不适用于您可能使用的大多数现代操作系统。而是由可执行文件分配和支持10MB的虚拟地址空间。在访问页面时,页面将被读入RAM(并将分配RAM页面)。
该程序在RAM中也占用10MB吗?
还没有。但是在访问页面时将需要RAM。
如果没有,那么哪些因素决定了RAM中程序占用的内存?
根据为整个系统提供最佳性能的内容,操作系统必须做出决定。您可以将RAM视为缓存,当RAM可用以及访问或不访问数据时,OS会将内容移入和移出RAM。
答案 1 :(得分:0)
指针指向一些记忆,真实,同意。它指向的内存,取决于使用/环境。
详细说明,通常是针对用户空间程序,指针指向virtual address space中的某个地址。
另一方面,对于低级系统编程(例如在内核中)和没有MMU的操作系统,它指向物理内存。
我的意思是它是RAM还是硬盘?
两者都是,没有。这完全取决于。通常,在程序执行开始时,为每个进程分配一个虚拟地址空间。 MMU / OS的工作是确保所需的"实际"记忆可用"根据要求"。此外,这包括分页概念。
复制 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------|
显示,