内存映射

mmap内存映射函数 (显示图片的新方法) ---- 也是Linux系统IO中的函数之一

基本概念

系统IO函数的共同点:就是他们的形参中一定有一个是文件描述符(除open)。

内存 映射的意思:拆
    内存:普通运存,显存(集显和独显),是一块内存空间,存放显示画面的像素点。  
    映射:两个集合中的元素,都具有一一对应的关系。
    
    显存     :集合A 存放显示画面的像素点。 
    设备文件 :集合B fb0就是用来存放像素点的!
    
把指定一个文件映射进内存里面,是的,文件中的数据位置和内存中的数据位置一一对应。     有一方的数据位置上的数据改变了,另外一方也会跟着改变           
    
关于mmap映射的集合:
    集合A:内存
    集合B:被映射的文件
问题:一个文件算不算一个集合? 算

mmap 内存映射比 write 函数效率更快的主要原因有几点:

减少数据拷贝:使用 mmap 内存映射,可以将文件直接映射到进程的地址空间中,避免了在用户空间(内存)和内核空间(磁盘)之间频繁的数据拷贝(IO)操作。而使用 write 函数则需要先将数据从用户空间拷贝到内核缓冲区,再进行实际的写入操作,涉及了额外的数据拷贝过程。
    减少系统调用:mmap 内存映射只需要进行一次系统调用来建立映射关系,之后对内存的读写操作都直接在用户空间进行,不需要再进行系统调用。而使用 write 函数每次写入都需要进行系统调用,会增加系统调用的__性能__开销。
    页面缓存利用:mmap 映射的文件数据会被缓存在页面缓存中,这意味着多个进程可以共享同一份数据副本,减少了物理内存的占用。而使用 write 函数每次写入都会导致数据在内核态和用户态之间的复制,没有利用到页面缓存。

基本用法--- man 2 mmap

源文件的文本数据大小一样。不要映射空文件,因为空文件里面没有空间(没数据位置)。

prot:映射空间的权限   PROT_READ | PROT_WRITE
       PROT_EXEC  Pages may be executed. 

       PROT_READ  Pages may be read.

       PROT_WRITE Pages may be written.

       PROT_NONE  Pages may not be accessed.

flags:映射空间的属性:默认设置的是共享属性
    MAP_SHARED:
                共享属性
                通过对映射指针解引用赋值数据,数据会回写到打开的原文本(fb0),而且原文本中的数据会共享给其他进程(血缘关系的进程)。
                
    MAP_PRIVATE:
                私有属性                    
                 通过对映射指针解引用赋值数据,数据不会回写到原文本,而且原文本中的数据不会共享给其他进程(血缘关系的进程)。
                 
fd:要想映射的文件的文件描述符,打开它的时候如果你想具有共享属性的映射,打开文件的方式要可读可写不然会映射失败。

offset:偏移量 设置原文件的映射位置到文件首部的偏移量,0表示文件首部开始映射。存储单位是页存储,一页 = 4096

image

posted @ 2024-07-05 17:27  WJnuHhail  阅读(1)  评论(0编辑  收藏  举报