背景
为什么突然想要学习linux系统函数呢,日常工作有没用到,那当时是准备晋升高工和跳槽了,正所谓 面试造火箭,工作拧螺丝。工作中螺丝拧久了,就忘了怎么去提升了,毕竟每天就用那点东西,其他都不会想去了解。这里自己整理了一下使用strace命令查到的系统函数的使用,下次再写一篇关于strace命令使用方法
函数使用
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
一种内存映射的方法
如果使用 strace ls -lh /www/index.php 这条命令,实际是去追踪ls如何去计算一个文件的大小和获取它的其他信息,这里会看到很多调用 mmap()这个系统函数
本质是 mmap会把 需要打开处理的文件地址映射到进程的地址空间里,也就是内存中,这样进程在处理这个文件的时候,可以直接在内存中处理,然后系统会把内存中的这些处理再写入硬盘中的原始的文件里,也就是脏页的回写,这样会快很多。这里有几点注意
1、mmap映射的是一个物理页(物理页是指真实存在的物理磁盘的大小,虽然我们是整个文件保存在计算机中,但实际上计算机在磁盘也会给这个文件数据进行分页,也就是类似这个文件是一本书,虽然书的内容被整个记录了,但是还是会被分页,32位系统一个物理页是4k,64位是8k),那如果这个文件是10k,那么mmap会映射出一个12k(假如是一个32位的系统)的内存的虚拟空间出来给进程处理,多出来的2k就补0
2、进程读取的时候,会读取上述所说的12k,这样可能会访问到多出的那2k的空白地址,这时候不会报错,但是不会执行任务操作
3、即使文件关闭了,该进程的映射区域还是不会变,因为mmap实际映射的是物理页大小的空间,而不是这个文件
具体更详细这里就不赘述,可以看下这位博主写的,地址是 https://www.cnblogs.com/huxiao-tee/p/4660352.html
来源:CSDN
作者:qq_41342577
链接:https://blog.csdn.net/qq_41342577/article/details/103652492