Linux虚拟内存及内存映射

简介:

1.没有虚拟内存的CPU基本不能运行多任务操作系统,不能支持多进程。


2.实现虚拟内存技术主要有2种:段式内存管理和页式内存管理,目前页式内存管理占主流。


3.页式内存管理将内存划分成大小相同的页面,每个进程地址空间可以由多个页面构成,实现进程空间的隔离。


4。为什么要使用内存映射:传统读写文件的方式过程是open->read/write/lseek->close每一次调用都要执行系统调用,效率极低;如果多个进程要访问同一个文件,那么每一个进程都需要在自己的内存地址空间维护一个副本,这是一种浪费。而使用mmap将文件当做内存(数组等)操作就不存在这样的问题。

Linux内存映射:Linux内核将整个内存地址空间看做是一系列不同的"文件"映射,不过在这个叫内核对象。Linux加载内核到内存的过程就是内存映射的过程,甚至加载可执行文件的过程也是内存映射。


5.32位地址虚拟内存:32位的虚拟内存地址最大能管理4G的物理地址。32位的虚拟地址分成3部分:页面目录|页面表|页内偏移(10|10|12),页面目录能管理1024个页面表,页面表能管理1024个页面(每1024个页面就分成一个页面表,页面表地址放在页面目录数组中;1024个页面的地址放在页面表数组中)

           wKioL1hI0vnhblnjAAAfBkyFunQ381.png-wh_50

6.虚拟地址到物理地址的转换可以有很多应用:进程与进程之间可以虚拟地址相同但物理地址不同,从而达到空间上的真正隔离;利用页面交换技术可以将一个文件映射到内存中,使得mmap这样的系统调用得以实现;将相同的虚拟地址转换成相同的物理地址这样可以实现数据共享如线程;将硬件设备的控制存储区反映到虚拟内存中,可以通过内存直接控制设备;...


7.内存映射的缺点

内存映射可能存在的对存储物理空间的浪费:每次在不同或相同进程对同一个文件调用mmap时内存映射技术将总是分配一个新的页偏移为0的页面给进程,这样导致多次调用mmap写入的数据是不连续的。每次调用mmap写入的数据相对4096取余数越小,那么浪费的空间可能越多。


8.mmap系统调用

void* mmap(void* addr,size_t len,int prot,int flag,int filedes,off_t off);

int munmap(void* addr,size_t len); //释放映射


 #include <stdio.h>  

 #include <unistd.h>  

 #include <stdlib.h>  

 #include <string.h>  

 #include <fcntl.h>  

 #include <linux/fb.h>  

 #include <sys/mman.h>  

 #include <sys/ioctl.h>   

   

 #define PAGE_SIZE 4096  

   

 int main(int argc , char *argv[])

 {

     int fd;

     int i;

     unsigned char *p_map;


     //打开设备  

     fd = open("liujin.txt",O_RDWR);

     if(fd < 0)

     {

         printf("open fail\n");

         exit(1);

     }


     //内存映射  

     p_map = (unsigned char *)mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,fd, 0);

     if(p_map == MAP_FAILED)

     {

         printf("mmap fail\n");

         goto here;

     }

     snprintf(p_map+5,10,"bye!");

     //打印映射后的内存中的前10个字节内容  

     for(i=0;i<10;i++)  

         printf("%c\n",p_map[i]);  


 here:  

     munmap(p_map, PAGE_SIZE);  

     return 0;  

 } 


查看文件中的数据:od -tx1 -tc liujin.txt 




本文转自 a_liujin 51CTO博客,原文链接:http://blog.51cto.com/a1liujin/1880652,如需转载请自行联系原作者
相关文章
|
3月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
351 0
Linux内存问题排查命令详解
|
11月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
553 17
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
2301 6
|
7月前
|
缓存 Linux 数据安全/隐私保护
Linux环境下如何通过手动调用drop_caches命令释放内存
总的来说,记录住“drop_caches” 命令并理解其含义,可以让你在日常使用Linux的过程中更加娴熟和自如。
1276 23
|
9月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
329 27
|
10月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
420 48
|
10月前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
425 3
|
10月前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
990 2
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
1149 59
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
1981 58