当前位置: 首页 > news >正文

网站开发设计流程论文广州建设信息网

网站开发设计流程论文,广州建设信息网,广州游戏网站建设,wordpress中settingptmalloc内存分配和回收详解#xff08;文字版#xff09; 进程默认内存布局#xff08;x86#xff09; 从进程的内存布局可知#xff0c;.bss段之上的这块分配给用户程序的空间被称之为heap#xff0c;start_brk指向heap的开始#xff0c;而brk指向heap的顶部。可以使用…ptmalloc内存分配和回收详解文字版 进程默认内存布局x86 从进程的内存布局可知.bss段之上的这块分配给用户程序的空间被称之为heapstart_brk指向heap的开始而brk指向heap的顶部。可以使用系统调用brk()和sbrk()来增加表示heap顶部的brk值从而线性的增加分配给用户的heap空间。在使用malloc之前brk的值等于start_brk也就是说heap大小为0。 ptmalloc在开始时若请求的空间小于mmap分配阈值mmap threshold 默认值为128KB时主分配区会调用sbrk()增加一块大小为128KB chunk_sizealign 4KB的空间作为heap非主分配区会调用mmap映射一块大小为HEAP_MAX_SIZE32位1MB64位64MB的空间作为sub-heap。这就是ptmalloc所维护的分配空间。 ptmalloc内存管理设计假设 1、具有长生命周期的大内存分配使用mmap。 2、特别大的内存分配总是使用mmap。 3、具有短生命周期的内存分配使用brk因为用mmap映射匿名页当发生缺页异常时linux内核为缺页分配一个新的物理页导致多次清零操作很浪费系统资源所以引入了mmap分配阈值动态调整机制保证在必要的情况下才使用mmap分配内存。 4、尽量只缓存临时使用的空闲小内存块对大内存快或是长生命周期的大内存块在释放时都直接归还给操作系统。 5、对空闲的小内存块只会在malloc和free的时候进行合并free时空闲内存块可能放入bin中不一定归还给操作系统。 6、收缩堆的条件是当前free的块大小加上前后能合并chunk的大小大于64KB并且堆顶的大小达到阈值才有可能收缩堆把堆最顶端的空闲内存返回给操作系统。 7、需要长期存储的程序不适合用ptmalloc来管理内存。 8、为了支持多线程多个线程可以从同一个分配区中分配内存ptmalloc假设线程A释放掉一块内存后线程B会申请类似大小的内存但是A释放的内存跟B需要的内存不一定完全相等可能有稍许误差就需要不停的对内存块进行切割和合并这个过程可能产生内存碎片。 内存分配 1、获取分配区的锁为了防止多个线程同时访问同一个分配区在进行分配之前需要取得分配区域的锁。先查看线程私有实例中是否已经存在一个分配区如果存在尝试对该分配区加锁如果加锁成功使用该分配区分配内存否则该线程搜索分配区循环链表试图获得一个空闲没有加锁的分配区。如果所有的分配区都已经加锁那么ptmalloc会开辟一个新的分配区把该分配区加入到全局分配区循环链表和线程的私有实例中并加锁然后使用该分配区进行分配操作。开辟出来的新分配区一定为非主分配区因为主分配区是从父进程那里继承来的。开辟非主分配区时会调用mmap()创建一个sub-heap并设置好top chunk 每一个进程只有一个主分配区(main_arena)和若干非主分配区(non_main_arena)各arena通过一个循环链表来管理通过互斥锁(mutex)使线程对于该分配区的访问互斥。 通过chunk倒数第三个标志位区分是否为非主分配区。 2、将用户的请求大小转换为实际需要分配的chunk空间大小 加上chunk头部并进行字节对齐默认8字节对齐。 事实上由于chunk的空间复用例如32位系统实际的chunk大小用户请求大小 8 - 4 align to 8B 3、判断所需分配chunk的大小是否满足max_fast32位默认为64B如果是则转下一步否则跳到第五步。 4、首先尝试在fast bin中取一个所需大小的chunk分配给用户。如果可以找到则分配结束否则转下一步。 fast bins的分配遵循后进先出LIFO原则类似于栈。 fast bins包含10个bin大小从16B到88B相邻bin相差8B其中只有前七个作为空闲chunk链使用。 fast bins中的chunk不会修改最后一个标志位因此fast bin中的chunk不会合并。 5、判断所需大小是否处在small bin中即判断chunk_size 512B是否成立。如果chunk大小处在small bins中则转下一步否则转到第6步。 ptmalloc维护了一个bin数组共有128项其中序号为2-63的62项为small bin。 small bin中每个bin中的块大小相同相邻bin相差8B最小的16B最大的504B每个bin中都是双向循环链表。 分配时按照“small-first best-fit”原则。 6、根据所需分配的chunk的大小找到具体所在的某个small bin从该bin的尾部摘取一个恰好满足大小的chunk。若成功则分配结束否则转下一步。 7、到了这一步说明需要分配的是一块大的内存或者small bins中找不到合适的chunk。于是ptmalloc首先会遍历fast bins中的chunk将相邻的chunk进行合并并链接到unsorted bin中然后遍历unsorted bin中的chunk如果unsorted bin只有一个chunk并且这个chunk在上次分配时被使用过并且所需分配的大小属于small bins并且chunk的大小大于等于需要分配的大小这种情况下就直接将该chunk进行切割分配结束否则将根据chunk的空间大小将其放入small bins或是large bins中遍历完成后转入下一步。 ptmalloc中的bins数组第一个就是unsorted bin序号为1。 双向链表管理空闲chunk不排序当释放chunk时大小大于max_fast的首先链入unsorted bin中。 可看作是small bins和large bins的cache。 8、到了这一步说明需要分配的是一块大的内存或者small bins和unsorted bin中都找不到合适的chunk并且fast bins和unsorted bin中所有的chunk都清除干净了。从large bins按照“small-first best-fit”原则找到一个合适的chunk从中划分一块所需大小的chunk并将剩下的部分链接回bins中。若操作成功则分配结束否则转下一步。 bins数组序号为64-126的63个bin为large bins。 large bins中的chunk链大小并不是一个固定公差的等差数列而是分成6组bins每组bins是一个固定的等差数列每组的bin数目依次是32、16、8、4、2、1公差依次是64B、512B、4096B、32768B、262144B等。 9、如果搜索fast bins和bins都没有找到合适的chunk那么就需要操作top chunk来进行分配了。判断top chunk大小是否满足所需chunk的大小如果是则从top chunk中分出一块来否则转下一步。 chunk中有三种并非按照bins结构存储分别是top chunk、mmaped chunk、last remainder。 top chunk对于非主分配区会预先分配一块较大的空闲内存模拟sub-heap通过管理sub-heap来响应用户的需求因为内存是按地址从高到底进行分配的在空闲区的最高处必然存在一块空闲chunk叫做top chunk由于主分配区是唯一能够映射到进程heap区域的分配区它可以通过sbrk()来增大或是收缩进程heap的大小ptmalloc在开始时会预先分配一块较大的空闲内存heap。 mmaped chunk 当需要分配的chunk足够大而且fast bins和bins都不能满足要求甚至top chunk本身也不能满足要求时ptmalloc会使用mmap来直接使用内存映射来将页映射到进程空间。这样分配的chunk在被free时将直接解除映射于是就将内存归还给了操作系统。 last remainder 不存在于任何bins中当需要分配一个small chunk时但在small bins中找不到合适的chunk如果last remainder chunk的大小大于所需的small chunk大小last remainder chunk被分裂为两个其中一个chunk返回给用户另一个变成新的last remainder chunk。 10、到了这一步说明top chunk也不能满足分配要求所以于是就有了两个选择如果是主分配区调用sbrk()增加top chunk大小如果是非主分配区调用mmap来分配一个新的sub-heap增加top chunk大小或者使用mmap来直接分配。在这里需要依靠chunk的大小来决定到底使用哪种方法。判断所需分配的chunk大小是否大于等于mmap分配阈值如果是的话则转下一步调用mmap分配否则跳到第12步增加top chunk的大小。 对于非主分配区当bins和fast bins都不能满足分配的需要ptmalloc会设法在top chunk分出一块内存给用户如果top chunk本身不够大分配程序会重新分配一个sub-heap并将top chunk迁移到新的sub-heap上新的sub-heap与已有的sub-heap用单链表连接起来然后在新的top chunk上分配。 11、使用mmap系统调用为程序的内存空间映射一块chunk_size align 4KB大小的空间然后将内存指针返回给用户。 12、判断是否为第一次调用malloc若是主分配区则需要进行一次初始化工作分配一块大小为chunk_size 128KBalign 4KB大小的空间作为初始的heap。若已经初始化过了主分配区则调用sbrk()增加heap空间非主分配区则在top chunk中切出一个chunk使之满足分配需求并将内存指针返回给用户。 内存回收 1、free()函数同样首先需要获取分配区的锁来保证线程安全。 2、判断传入的指针是否为0若为0则什么都不做直接return否则转下一步。 3、判断所需释放的chunk是否为mmaped chunk如果是则调用munmap()释放mmaped chunk解除内存空间映射该空间不再有效。如果开启了mmap分配阈值的动态调整机制并且当前回收的chunk大小大于mmap分配阈值将mmap分配阈值设置为该chunk的大小将mmap收缩阈值设定为mmap分配阈值的2倍释放完成。否则下一步。 4、判断chunk的大小和所处的位置若chunk_sizemax_fast并且chunk不位于heap顶部也就是说并不与top chunk相邻则转到下一步否则跳到第6步。因为与top chunk相邻的小chunk也和top chunk进行合并所以这里不仅需要判断大小还需要判断相邻情况 5、将chunk放到fast bins中chunk放入到fast bins中时并不修改该chunk使用状态位P。也不与相邻的chunk进行合并。只是放进去释放结束返回。 6、判断前一个chunk是否处在使用中如果前一个块也是空闲块则合并并转下一步。 7、判断当前释放块的下一个块是否为top chunk如果是转第9步否则转下一步。 8、判断下一个chunk是否处在使用中如果下一个chunk也是空闲的则合并并将合并后的chunk放到unsorted bin中。注意这里在合并的过程中要更新chunk的大小以反映合并后的chunk的大小并转到10步。 9、如果执行到这一步说明释放了一个与top chunk相邻的chunk。则无论它有多大都将它与top chunk合并并更新top chunk的大小等信息转下一步。 10、判断合并后的chunk的大小是否大小FASTBIN_CONSOLIDATION_THRESHOLD默认64KB如果是的话则会触发进行fast bins的合并操作fast bins中的chunk将被遍历并与相邻的空间chunk进行合并合并后的chunk会被放到unsorted bin中。fast bins将变空操作完成转下一步。 11、判断top chunk的大小是否大于mmap的收缩阈值默认为128KB如果是的话对于主分配区则会试图归还top chunk中的一部分给操作系统。但是最先分配的128KB是不会归还的ptmalloc会一直管理这部分内存用于响应用户的分配请求如果为非主分配区会进行sub-heap收缩将top chunk的一部分返回给操作系统如果top chunk为整个sub-heap会把整个sub-heap还回给操作系统。做完这一步后释放结束返回。可以看出收缩堆的条件是当前free的chunk大小加上前后能合并chunk的大小大于64KB并且要top chunk的大小要达到mmap收缩阈值才有可能收缩堆。转载于:https://www.cnblogs.com/clingyu/p/8620764.html
http://www.zqtcl.cn/news/926572/

相关文章:

  • 网站没服务器行吗价格低廉怎么换个说法
  • 用wordpress编写网站完整网站开发视频教程
  • 电商型网站建设价格ppt制作网站
  • 东莞做个网站查询工商营业执照
  • 从网址怎么看网站的域名租用云服务器多少钱
  • 网站开发技术有个人网页首页设计图片
  • 一站式网站建设平台做电商网站需要做什么准备
  • 网站开发小程序快站模板
  • 江苏集团网站建设智慧养老网站开发
  • 外网网址可以做英语阅读的网站怎么原创视频网站
  • 宁波网站建设流程图自己做网站可以揽业务吗
  • 赤峰市建设网站东胜做网站
  • 有口碑的坪山网站建设微信扫一扫登录网站如何做
  • 自己建网站要花多少钱蓟县网站建设
  • 兖州中材建设有限公司网站wordpress免签约接口
  • 湖北网站seo设计成都疾控最新通告
  • 商丘网站建设推广公司配资网站建设多少钱
  • 手机网站怎么做SEO优化gzip压缩 wordpress
  • 上下框架 网站app营销的核心是什么
  • 网站开发哪里有培训wordpress 主题 网址导航
  • 深圳市宝安区怎么样百度禁止seo推广
  • 手机电商网站 模板常熟做网站优化
  • 免费的logo设计网站网页设计与制作dw
  • 线上调研问卷在哪个网站上做网页设计学生作业
  • 云南高端网站建设网页设计工作室选址依据
  • 免费的编程自学网站互联网公司网站建设ppt
  • 免费发帖的网站网站空间服务器费用
  • 商城类的网站一般怎么做做ps从哪个网站上下载图片大小
  • 怎么做网站链接支付免费推广网站搭建
  • 威海 网站建设刚刚北京传来重大消息