这是我参与「第五届青训营 」伴学笔记创作活动的第 19 天
内存池
一组资源的集合。程序在申请堆上的内存时,我们可以给它一大块内存(远超出程序要申请的大小,即内存池),并且自己管理。 频繁的new/delete用户态转内核态,效率低,还有内存碎片
静态链表(数组形式的链表),其他要申请资源的类重载new和delete
一块内存池不够再申请一块,将上一块最后一页内存指针指向新的一块内存池的第一个结点
基本的非连续分配方式
页大小一致,页内位移=物理块内位移,只需要页号和块号的转换,低位地址即块内位移直接照抄页内位移即可
段大小不一,所以段内位移和实际低位不相同地址,需要段起始地址+段内偏移才能计算出真正的物理地址
页:没有外部碎片,都可以调用,但是有内部碎片用不完,页表在内存中,是进程的一部分,由页表寄存器保存页表起始地址和长度。多级页表:页表套页表,但是访问内存次数多
段:方便编程、方便信息共享和保护,没有内部碎片,但是有外部碎片(过小调用不了)
段页式:每段内部再分页,管理起来和页一样,没有外部碎片,内部碎片比页多。
虚拟内存
会使程序自己认为自己拥有一块很大且连续的内存,弥补物理内存大小。用到的程序在物理内存,暂时用不到的通过映射先放到硬盘上
内存抖动(系统抖动) 内存中被换出的内存又被频繁换入,根本原因:分给进程物理内存不够大
虚拟内存大小:32位2^32=4G空间(寄存器每一位代表一个新地址),64位不会全用到