首页 > 其他分享 >mmap

mmap

时间:2022-10-31 16:56:42浏览次数:62  
标签:知识点 mmap 内存 go byte 硬盘

学习bolt源码 bbolt,发现有一处使用到mmap,  开始的时候不明白是什么东西,很是好奇,怎么就把硬盘上的文件读到内存了,并没有看到read方法,后来查了资料,知道原来使用了mmap,所谓mmap是讲文件映射到内存的方法,操作内存,数据就到了硬盘上,修改硬盘,数据也能刷到内存。 而且它有个好处就是能提高读写的性能,通常我们读取数据到程序,有两步,第一步是硬盘数据到页缓存,第二步是页缓存到用户的内存,为什么这样? 说是为了提高读写效率和保护磁盘,不是很明白为什么这样,这里先跳过, 有一篇博客讲了但是我还是不是很明白https://www.cnblogs.com/huxiao-tee/p/4660352.html。 mmap就是只需要硬盘到页缓存,然后通过指针修改内存中的数据。

这里有篇详细的文章描述mmap, 

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

我试着把这篇博客上的代码实现了一下,收获如下知识点

(1) 不同的环境,代码如果不一样,我们通过把文件名命名成  文件名_$GOOS.go来达到不同的系统,编译不同的代码的效果。   通过go env可以查看到你的GOOS变量。 

另外为了让Visual Code 不报错,我们可以加上在

//go:build !windows && !plan9 && !solaris && !aix

// +build !windows,!plan9,!solaris,!aix

(2)文件可以和内存的Size不一样,当文件Size比内存小的时候,超过的部分写不到文件。  

(3) GO 语言中对于中文占3个bytes, 英文占1个byte, 那么一个文件读出来是byte数组, 系统如何知道哪些byte应该在一起,哪些要分开呐?

原来对于UTF-8,  编码的时候已经有考虑,比如你是3个Byte,那么前三位就是1,第四位是0, 后面两个byte,一律设为10开头.  这样你读到第一个byte,就知道后面又几个了。没有提及的就是这个字符的unicode.    unicode( 开始使用2个字节,后来扩展到四个字节), 所以又得地方说unicode 可以容纳65536字符,有得地方说是100多万个字符。

比如♥,  通过byte看就是e2  99  a5,  二进制表示就是如下(16进制是2个8进制组成)

1110 0010

1001 1001

1010 0101

看到111,就知道它占3byte了。

 

收获有以上三点,通过学习一个知识点,扩展到另外几个知识点,能感觉到进步,这种感觉很好!

标签:知识点,mmap,内存,go,byte,硬盘
From: https://www.cnblogs.com/dk168/p/16844910.html

相关文章