学习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