geektutu / blog

极客兔兔的博客,Coding Coding 创建有趣的开源项目。
https://geektutu.com
Apache License 2.0
166 stars 21 forks source link

Go Mmap 文件内存映射简明教程 | 快速入门 | 极客兔兔 #81

Open geektutu opened 4 years ago

geektutu commented 4 years ago

https://geektutu.com/post/quick-go-mmap.html

简单理解,mmap 是一种将文件/设备映射到内存的方法,实现文件的磁盘地址和进程虚拟地址空间中的一段虚拟地址的一一映射关系。也就是说,可以在某个进程中通过操作这一段映射的内存,实现对文件的读写等操作。修改了这一段内存的内容,文件对应位置的内容也会同步修改,而读取这一段内存的内容,相当于读取文件对应位置的内容。

bxclib2 commented 3 years ago

感谢您的教程。

func (demo *Demo) mmap() {
    b, err := syscall.Mmap(int(demo.file.Fd()), 0, defaultMemMapSize, syscall.PROT_WRITE|syscall.PROT_READ, syscall.MAP_SHARED)
    _assert(err == nil, "failed to mmap", err)
    demo.dataRef = b
    demo.data = (*[defaultMaxFileSize]byte)(unsafe.Pointer(&b[0]))
}

大佬可不可以讲下dataref的作用?

geektutu commented 3 years ago

文中有提到,dataRef 保留地址,用于后续取消映射。syscall.Munmap(demo.dataRef)。

acechef commented 2 years ago

兔兔太强了