当前位置:首页 > 内存 > 正文

匿名内存映射(内存重映射)

  • 内存
  • 2024-06-10 20:29:45
  • 381

一、CentOS下top和free命令查看系统中空闲内存的方法

下面介绍如何使用top和free命令查看系统中的空闲内存

那么运行top命令时会看到什么

[root@linuxzgf~]#top

内存:8174492ktotal,7124268kused并不意味着您的应用程序使用了7.1的内存。在这7.1G中:你需要free命令来使用应用内存+缓冲区+高速缓冲存储器。看看吧。

下图是一个例子(单位是MB)。

[root@linuxzgf~]#free-m

totalusedfreesharedbufferscached

内存:79826811117103505114

-/+buffers/cache:13466636

交换:169351116924

[root@linuxzgf~]#

在此示例中,使用程序只使用了1346MB的内存,还有6636MB的空闲内存。

一些简单的计算:

物理使用内存=实际使用内存-buffer-cache

=6811M-350M-5114M

物理可用内存=总物理内存-实际使用的内存+缓冲区+缓存

应用程序可用可用内存=总物理内存-实际已用内存

应用程序已用内存=实际已用内存-Buffer-Cache

原文解释:上网查一下:

Linux的基本概念是,core将使用尽可能多的RAM来缓存来自本地和远程文件系统的数据,以免浪费资源。与当前在RAM中运行的进程关联的潜在高速缓存是系统报告的缓冲区和页高速缓存的总和,并且当进程终止时不会回收高速缓存。但是,它会根据需要重新捕获,例如当您启动一个需要大量内存的进程时。Linux内核将从内存中检索缓存并将所得内存分配给新进程。

在某些地方,例如未知的内存映射(mmps)和共享内存区域,它们被报告为缓存;一般缓存由内核直接释放,不映射到进程的地址空间;虽然内核只是简单的映射了这些特殊的缓存。它们被映射到附加到它们的所有进程。


二、嵌入式中经常使用mmap这个函数,可以介绍一下作用吗如何使用mmap函数《UNIX网络编程卷2进程间通信》解释了mmap函数。该函数有三个主要用途:
1在内存中分配一个常规文件。通常用于需要频繁读写文件以达到较高效率的情况;
2特殊文件的匿名内存分配可以为关联进程内存提供共享内存空间。
函数:void*mmap(void*start,size_length,intprot,intflags,intfd,off_toffsize);
参数start:指向要映射的内存的起始地址映射,通常设置为NULL,让系统自动选择地址,并在分配成功后返回地址。
参数长度:表示文件在内存中映射了多少内容。
参数prot:映射区域的保护方式。可以是以下方法的组合:
PROT_EXEC映射区域可以执行
PROT_READ映射区域可以读取
PROT_WRITE映射区域可以写入
PROT_NONE映射区域不能保存Ta
参数标志:影响映射区域的各种属性。调用mmap()时必须指定MAP_SHARED或MAP_PRIVATE。
MAP_FIXED如果start参数指向的地址无法映射,则放弃映射,地址不会改变。通常不鼓励使用此标志。
MAP_SHARED写入映射区域的数据将被复制回文件,并允许映射该文件的其他进程共享。
MAP_PRIVATE对映射区域的写操作会产生映射文件的副本,即私有“写时复制”(copyonwrite)不会写回原始文件内容。
MAP_ANONYMOUS建立匿名映射。此时,fd参数将被忽略,不涉及任何文件,并且映射区域无法与其他进程共享。
MAP_DENYWRITE只允许对映射区域进行写操作,其他对文件的直接写操作将被拒绝。
MAP_LOCKED锁定映射区域,意味着该区域不会被替换(交换)。
参数fd:要分配到内存的文件描述。如果使用匿名内存映射,即标记MAP_ANONYMOUS,并将fd设置为-1。有些系统不支持匿名内存映射。可以使用fopen打开文件/dev/zero,然后映射该文件,以达到与匿名内存映射相同的效果。
参数offset:文件映射的偏移量,通常设置为0,表示从文件前面开始响应。
返回值:
如果映射成功,则返回映射区域的内存起始地址,否则返回MAP_FAILED(-1),并存储失败原因错误。
错误代码:
EBADF参数fd不是有效的文件描述符
EACCES访问权限不正确。如果是MAP_PRIVATE,则该文必须可读。如果使用MAP_SHARED,则必须存在PROT_WRITE并且文件必须可写。
EINVAL参数start、length或offset之一非法。
EAGAIN文件被锁定或锁定的内存过多。
ENOMEM内存不足。
mmap()系统调用有两种方式来共享内存:
(1)使用普通文件提供的内存分配:
适用于所有之间的进程。此时,需要打开或创建一个文件,然后调用mmap()
典型的调用代码如下:
fd=open(name,flag,mode);if(fd<0)...
ptr=mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
实现共享内存中通过mmap()通信的方法有很多特点和需要考虑的事情。可以参考《UNIX网络编程》第2卷。
(2)使用特殊文件提供匿名内存映射:
适用于具有亲和力的进程。由于父子进程之间有特殊的亲和力,所以在父进程中首先调用mmap(),然后再调用fork()。调用fork()后,子进程继承了父进程匿名分配的地址空间,同时也继承了mmap()返回的地址。这样父子进程就可以通过指定的区域进行通信。注意,这不是一般的继承关系。一般来说,子进程独立维护一些从父进程继承的变量。mmap()返回的地址由父进程和子进程共同维护。实现相关进程之间共享内存的最佳方式是使用匿名内存映射。此时不需要指定特定的文件,只需设置适当的标志即可。
本文来自CSDN博客转载请注明出处:

上一篇:文件映射内存

下一篇:内存映射概念