Memory 使用非活动内存对我有利。此代码在RAM或非活动内存中存储的是什么?

Memory 使用非活动内存对我有利。此代码在RAM或非活动内存中存储的是什么?,memory,memory-management,file-io,Memory,Memory Management,File Io,我正在OSX10.8.3上开发。下面的代码很简单。它可以执行两个操作。如果read函数未注释,则程序将在“address”处打开文件,并将其所有内容转换为数据。相反,如果memcpy函数未注释,程序将把mmapped内容复制到数据中。我正在开发一款mac电脑,它将常用文件缓存在RAM的非活动内存中,以便将来更快地访问。我已经关闭了文件控件和mmap中的缓存,因为我正在处理1GB或更大的文件。如果我没有设置NOCACHE选项,整个1GB将存储在非活动内存中 如果read函数未注释,则程序将按预期运

我正在OSX10.8.3上开发。下面的代码很简单。它可以执行两个操作。如果read函数未注释,则程序将在“address”处打开文件,并将其所有内容转换为数据。相反,如果memcpy函数未注释,程序将把mmapped内容复制到数据中。我正在开发一款mac电脑,它将常用文件缓存在RAM的非活动内存中,以便将来更快地访问。我已经关闭了文件控件和mmap中的缓存,因为我正在处理1GB或更大的文件。如果我没有设置NOCACHE选项,整个1GB将存储在非活动内存中

如果read函数未注释,则程序将按预期运行。没有缓存任何内容,每次运行程序时,读取整个1GB大约需要20秒

但是如果memcpy函数没有注释,则会发生一些变化。但我仍然没有看到内存的增加,而且在第一次运行时复制仍然需要20秒。但在前一次执行之后的每一次执行,都会在一秒钟内复制。这与将整个文件缓存在非活动内存中的行为非常类似,但我从未看到内存的增加。即使我不映射文件,只执行一次读取,它也会在同一时间执行,不到一秒钟

某些内容必须存储在非活动内存中,但我应该如何跟踪它?我想找到存储的内容,并将其用于我的优势

我使用活动监视器查看一般内存大小。我使用Xcode工具将最初的memcpy执行与read和memcpy都被注释的执行进行比较。我认为在分配、文件活动、读/写、VM跟踪器或共享内存工具方面没有区别

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mman.h>

int main(int argc, const char * argv[])
{
    unsigned char     *data;
    unsigned char     *mmapdata;
    size_t            length;

    int file = open("address", O_RDONLY);
    fcntl(file, F_NOCACHE, 1);

    struct stat st;
    stat("address", &st);
    length = st.st_size;

    data = malloc(length);
    memset(data,0,length);

    mmapdata = mmap(NULL, length, PROT_READ,MAP_SHARED|MAP_NOCACHE, file, 0);
    if (mmapdata == MAP_FAILED)
        fprintf(stderr, "failure");

//    read(file,data,length);
    close(file);

//    memcpy(data,mmapdata,length);
    munmap(mmapdata,length);

    free(data);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,const char*argv[]
{
无符号字符*数据;
未签名字符*mmapdata;
尺寸与长度;
int file=open(“地址”,仅限ordu);
fcntl(文件,F_NOCACHE,1);
结构统计;
统计数据(“地址”、&st);
长度=标准尺寸;
数据=malloc(长度);
memset(数据,0,长度);
mmapdata=mmap(NULL,长度,PROT_READ,MAP_SHARED,MAP_NOCACHE,文件,0);
如果(mmapdata==MAP_失败)
fprintf(标准“故障”);
//读取(文件、数据、长度);
关闭(文件);
//memcpy(数据、mmapdata、长度);
munmap(mmapdata,长度);
免费(数据);
返回0;
}
更新:


对不起,我不清楚。在程序执行期间,RAM的活动内存部分会根据数据I malloc和mmapped文件的大小而增加。这肯定是页面所在的位置。清理后,可用内存量恢复到原来的状态。非活动内存永远不会增加。操作系统不会真的扔掉活动内存是有道理的,因为空闲内存是无用的,但是这个过程与缓存不同,原因如下。我已经测试了两个场景。在这两种情况下,我都加载了一些总大小超过可用ram的文件。一种情况是缓存文件,另一种情况是不缓存文件。使用缓存,我的非活动内存会增加,一旦我填满ram,一切都会大大减慢。加载新文件将替换另一个文件分配的非活动内存,但此过程将比下一个场景花费更长的时间。下一个场景是关闭缓存。我再次运行该程序几次,加载足够的文件来填满我的ram,但非活动内存从未增加,活动内存总是恢复正常,所以看起来我什么也没做。与以前一样,我映射的文件加载速度仍然很快,但是映射新文件会在正常时间内加载,并替换其他文件。用这种方法,我的系统从不减速。为什么第二种情况更快?

如果文件的页面不驻留在内存中,操作系统如何使
mmap
文件上的
memcpy
工作?操作系统接受您的提示,即您不希望缓存数据,但如果它没有选择,或者它与内存没有更好的关系,则仍然希望缓存数据


您的页面具有最低优先级,因为操作系统认为您不会再次访问它们。但是它们必须是常驻的
memcpy
才能工作,而且操作系统不会仅仅为了拥有空闲内存(这是100%无用的)而丢弃它们。非活动内存比空闲内存好,因为它至少有可能保存I/O操作。

如果文件的页面不驻留在内存中,操作系统如何使
mmap
上的
memcpy
工作?操作系统接受您的提示,即您不希望缓存数据,但如果它没有选择,或者它与内存没有更好的关系,则仍然希望缓存数据


您的页面具有最低优先级,因为操作系统认为您不会再次访问它们。但是它们必须是常驻的
memcpy
才能工作,而且操作系统不会仅仅为了拥有空闲内存(这是100%无用的)而丢弃它们。非活动内存比空闲内存好,因为它至少有可能保存I/O操作。

我在问题末尾添加了一个更新。作为注释添加的时间太长。更新:第二种情况更快,因为您使用的内存优先级较低,因此不会将重复使用的数据从缓存中踢出。我在问题的末尾添加了一个更新。作为注释添加的时间太长。更新:第二种情况更快,因为您使用的内存优先级较低,因此不会将重复使用的数据从缓存中踢出。