首页天道酬勤线程池的底层原理,arraylist底层原理

线程池的底层原理,arraylist底层原理

张世龙 05-12 22:38 111次浏览

在《Linxu进程的内存管理》中,发现进程内存的最小单位是vma,并且根据用途分为不同类型的vma。 例如

heap:动态分配和释放的内存

stack:包含局部变量和实现函数调用

映射:将文件区间映射到虚拟地址空间的内存映射

文本、数据、bss

这要看进程动态申请的内存。 我们知道进程动态申请内存的函数是malloc。 这里介绍一个名为heap和mmap的vma。

malloc位于linux标准libc库类型中,malloc函数的实现由分配内存的size决定使用哪个分配函数,如果size小于或等于128KB,则调用brk分配如果size大于128KB,则调用mmap分配内存。 可以使用M_MMAP_THRESHOLD选项调整size。 下图:

sys_brk分配过程主要是调整brk位置

在sys_mmap分配期间,主要在堆和堆栈中间(内存映射段)查找可用的虚拟内存

brk堆存储器从低地址向高地址方向增加。 分配内存时,将heap段的最高地址指针mm-brk扩展到最高地址。 释放内存时,将mm-brk收缩到低地址。

此申请完成后,只能打开空间,通常不能立即分配物理内存。 物理内存分配在访问时出现缺页异常后处理。 这篇后续文章进一步分析吧。

syscall_define1(brk,unsignedlong,brk )…//都需要页面对齐,便于映射。 mm-brk可被理解为end_brk,即,当前过程堆栈中的最后一个newbrk=page_align ) brk的OLDbrk=page_align(mm-brk ); if(oldbrk==newbrk ) gotoset_brk;/*如果收缩到alwaysallowshrinkingbrk.*/if (brk=mm-brk ) heap,则调用free将满足此条件,减少堆,然后返回unmapif (! do_munmap(mm,newbrk,oldbrk-newbrk,uf ) ) gotoset_brk; gotoout; }/* checkagainstexistingmmapmappings.*/next=find _ VMA (mm,oldbrk ); if (nextnewbrkpage _ size VM _ start _ gap (next ) ) gotoout; /*Ok,looksgood-letitrip.*///对heap扩展是brk函数的中心,在其中创建vma,并使用instert全局链接列表中的if (do _ brk _ flags (old brk _ flags ) populate=newbrkoldbrk (mm-def _ flags VM _ locked )!=0; up_write(mm-mmap_SEM; userfaultfd_unmap_complete(mm,uf ); if(populate ) mm_populate(oldbrk,newbrk-oldbrk ); 返回brk; out:retval=mm-brk; //发射信号量up_write(mm-mmap_SEM ); 返回恢复; }大致流程整理如下。

map专用匿名映射:通常用于内存分配、堆和堆栈

共享匿名映射:通常用于在进程之间共享内存并在内存文件系统中创建/dev/zero设备

专用文件映射:通常用于加载动态库、代码段和数据段

共享文件映射:通常用于文件读写和进程之间的通信

如果想进一步说明,请参阅文章《告别“一页障目”》。

unsigned longdo _ mmap (结构文件*文件,unsignedlongaddr,unsignedlonglen,unsignedlongprot,unsignedlongflags,VM_ unsignedlong*populate,structlist_head*UF(…//未映射区域addr=get _ unmapped _ area (文件、addr、len、pgoff、pg addr=mmap_region(file,addr,len,vm_flags,pgoff,uf ); returnaddr; }整理流程如下。

5T技术资源大放送! 但包括C/C、Arm、Linux、Android、人工智能、单片机、草莓馅饼等。 在公众号内回复“peter”即可免费获得!

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/3358 www.Sina.com.Sina.com

malloc需要什么头文件,malloc底层原理 malloc_trim释放内存,malloc初始化