在现在 CPU 和 OS 中,系统调用中的开销可能会是一个大问题。例如,固态硬盘比普通硬盘要快很多,但是,操作系统的开销可能比 I/O 操作本身的开销 更加昂贵。执行大量读写操作的程序可能就是操作系统开销的瓶颈所在。向量化 I/O 对此有一些帮助。因此要做 文件的内存映射,它允许一个程序仅访问内存就可以读或写磁盘文件。类似的映射也存在于像视频卡这样的地方。最终,云计算的经济性可能导致内核消除或最小化用户模式/内核模式的切换。
为此我写了一个 Go 语言操作 MMAP 内存映射文件的例子。
内存映射的好处是,消除了文件读写时的系统调用开销。只在初始化的时候有系统调用开销。后面即便遇到缺页异常也不过是 OS 的虚拟内存系统要操心的事情,应用进程本身并没有系统调用产生。如果频繁 IO,mmap 由于完全避免了初始化以后的系统调用,其性能很轻松的就在普通文件 IO 的 100 倍以上。
随着 CPU 核心的数目越来越多,系统调用的开销也越来越大。每次系统调用都会导致 L1 Data Cache 被清空,并导致缓存一致性协议忙上好一会。
未来,GO 和其它以 IO 为核心的语言,其性能优化的重点也将是减小 syscall 的频率。尤其是 CGO 和 GO syscall 的巨大性能开销更加迫切的需要用 mmap。
除了我上面写的那个例子,另外还推荐两个开源项目:
mmap-go
fs2 - File Structures 2
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于