香河住房与建设局网站网站没有备案是假的吗
web/
2025/10/2 23:25:58/
文章来源:
香河住房与建设局网站,网站没有备案是假的吗,山东网站优化公司,开发个app的公司在哪malloc() 分配的是虚拟内存。
如果分配后的虚拟内存没有被访问的话#xff0c;虚拟内存是不会映射到物理内存的#xff0c;这样就不会占用物理内存了。
只有在访问已分配的虚拟地址空间的时候#xff0c;操作系统通过查找页表#xff0c;发现虚拟内存对应的页没有在物理内…malloc() 分配的是虚拟内存。
如果分配后的虚拟内存没有被访问的话虚拟内存是不会映射到物理内存的这样就不会占用物理内存了。
只有在访问已分配的虚拟地址空间的时候操作系统通过查找页表发现虚拟内存对应的页没有在物理内存中就会触发缺页中断然后操作系统会建立虚拟内存和物理内存之间的映射关系。
malloc() 在分配内存的时候并不是老老实实按用户预期申请的字节数来分配内存空间大小而是会预分配更大的空间作为内存池。
#include stdio.h
#include malloc.hint main() {printf(使用cat /proc/%d/maps查看内存分配\n,getpid());//申请1字节的内存void *addr malloc(1);printf(此1字节的内存起始地址%x\n, addr);printf(使用cat /proc/%d/maps查看内存分配\n,getpid());//将程序阻塞当输入任意字符时才往下执行getchar();//释放内存free(addr);printf(释放了1字节的内存但heap堆并不会释放\n);getchar();return 0;
} 大约分配16KB 为什么打印的地址比mmap映射的地址多10个Byte 是因为free()调用的时候因为分配地址的时候就多了10Byte的头部用来描述分配到内容所以free不需要额外的地址。
free 释放内存会归还给操作系统吗 这是因为与其把这 1 字节释放给操作系统不如先缓存着放进 malloc 的内存池里当进程再次申请 1 字节的内存时就可以直接复用这样速度快了很多。
当然当进程退出后操作系统就会回收进程的所有资源。 malloc 通过 brk() 方式申请的内存free 释放内存的时候并不会把内存归还给操作系统而是缓存在 malloc 的内存池中待下次使用malloc 通过 mmap() 方式申请的内存free 释放内存的时候会把内存归还给操作系统内存得到真正的释放。
频繁通过 mmap 分配的内存话不仅每次都会发生运行态的切换还会发生缺页中断在第一次访问虚拟地址后这样会导致 CPU 消耗较大。
通过 brk() 系统调用在堆空间申请内存的时候由于堆空间是连续的所以直接预分配更大的内存来作为内存池当内存释放的时候就缓存在内存池中。
等下次在申请内存的时候就直接从内存池取出对应的内存块就行了而且可能这个内存块的虚拟地址与物理地址的映射关系还存在这样不仅减少了系统调用的次数也减少了缺页中断的次数这将大大降低 CPU 的消耗。 当执行 free() 函数时free 会对传入进来的内存地址向左偏移 16 字节然后从这个 16 字节的分析出当前的内存块的大小自然就知道要释放多大的内存
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85887.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!