精华内容
下载资源
问答
  • 一篇很好的有关动态存储器(DRAM)的原理性文档,非常适合作为DRAM技术的入门文档。
  • 内部存储器——②动态存储器

    千次阅读 2020-03-20 16:16:08
    一、动态随机存储器DRAM 动态RAM:靠MOS电路中的栅极电容来记忆信息的。 (一).基本的DRAM组成 DRAM芯片即动态随机存取存储器,DRAM 只能将数据保持很短的时间,所以需要定时刷新。DRAM 分为很多种,常见的...

    一、动态随机存储器DRAM

    动态RAM:靠MOS电路中的栅极电容来记忆信息的。

    (一).基本的DRAM组成


     

            DRAM芯片即动态随机存取存储器,DRAM 只能将数据保持很短的时间,所以需要定时刷新。DRAM 分为很多种,常见的主要有FPRAM/FastPage、EDORAM、SDRAM、DDR RAM、RDRAM、SGRAM 以及 WRAM 等。

     

    FPRAM/FastPage:传统的DRAM是通过分页技术进行访问的。 在存取数据时,需要分别输入一个行地址和一个列地址,这会耗费时间。 快速页模式随机存储器(Fast Page Mode DRAM)是传统DRAM的改进型产品,通过保持行地址不变而改变列地址,可以对给定的行的所有数据进行更快的访问。FPM DRAM还支持突发模式访问。所谓如噶模式是指对一个给定的访问在建立行和列地址之后,可以访问后面3个相邻的地址,而不需要额外的延迟和等待状态。

     

    EDO DRAM:扩展数据输出(Extended Data Output DRAM, EDO DRAM)是在FPM DRAM基础上加以改进的存储器控制技术。 EDO 输出数据在整个CAS周期都是有效的,EDO不必等待当前的读写周期完成即可启动下一个读写周期 ,即可以在输出一个数据的过程中准备下一个数据的输出。 EDO DRAM采用一种特殊的主存读出控制逻辑, 在读写一个存储单元时, 同时启动下一个(连续)存储单元的读写周期,从而节省了重选地址的时间,提高了读写速度。

     

    SDRAM:同步动态随机存储器(Synchromous DRAM, SDRAM)是一种与主存运行同步的DRAM. SDRAM在同步脉冲的控制下工作,取消了主存等待时间,减少了数据传送的延迟时间,因而加快了系统速度。

     

    DDR SDRAM:双数据传输率同步动态随机存储器(Double Data Rate SDRAM, DDR SDRAM)也可以说是SDRAM的升级版本,不仅能再时钟脉冲上升沿读出数据而且还能在下降沿读出数据,不需要提高时钟频率就能加倍提高SDRAM的速度。

     

     

    1.动态存储元

                              单管DRAM的存储矩阵

     

    (1)单管动态存储元解读一

    读操作:

        行选择线为高电平,使存储电路中的T1管导通,于是,使连在每一列上的刷新放大器读取电容C上的电压值。刷新放大器的灵敏度很高,放大倍数很大,并且能将从电容上读得的电压值折合为逻辑“0”或者逻辑“1”。

     

         列地址(较高位地址)产生列选择信号,有了列选择信号,所选中行上的基本存储电路才受到驱动,从而可以输出信息。

     

         在读出过程中,选中行上的所有基本存储电路中的电容都受到打扰,因此为破坏性读出。为了在读出之后,仍能保存所容纳的信息,刷新放大器对这些电容上的电压值读取之后又立即进行重写。

     

     

    写操作:

       行选择线为“1”;T1管处于可导通的状态,如果列选择信号也为“1”则此基本存储电路被选中,于是由数据输入/输出线送来的信息通过刷新放大器和T1管送到电容C。 

    图5.2-9 单管DRAM记忆单元电路

     

    (2)单管动态存储元解读二

           它由一个管子T1和一个电容C构成,写入时,字选择线为“1”,T1管导通,定入信息由位线(数据线)存入电荷C上的电荷,通过T1输出到数据线上,通过读出放大器即可得到存储信息。

     

            当字线为高电平时,该电路被选中。

            写入时,若写入“1”,位线为高电平,对电容C充电;若写入“0”,位线为低电平,C上的电荷经位线泄放。

            读出时,若原存“1”,C上有电荷,经T1管在位线上产生读电流,完成读“1”操作。若原存“0”,C上无电荷,在位线上不产生读电流,完成读“0”操作。当读操作完毕,存储电容C上的电荷已被泄放完,故是破坏性读出,必须采取重写(再生)的措施。

    存储电容C的容量不可能做得很大,一般比位线上的寄生电容Cd 间分配,就会使读出信息减少,所以,用单管记忆单元组成的存储器中,读出放大器应有较高的灵敏度。因为信息是存储在一个很小电容C上,也只能保留几毫秒的时间,所以必须定时第进行刷新操作。

     

     

    图5.2-8 4管DRAM记忆单元电路

     

    (3)四管动态存储元

    在六管静态存储元电路中,信息暂存于T1,T2管的栅极,这是因为管子总是存在着一定的电容。负载管T3,T4是为了给这些存储电荷补充电荷用的。由于MOS的栅极电阻很高,故泄漏电流很小,在一定的时间内这些信息电荷可以维持住。为了减少管子以提高集成度,把负载管T3,T4去掉,这样变成了四管的动态存储电路。

     

     

    2.DRAM的刷新

        (1) DRAM的刷新

            不管是哪一种动态RAM,都是利用电容存储电荷的原理来保存信息的,由于电容会逐渐放电,所以,对动态RAM必须不断进行读出和再写入,以使泄放的电荷受到补充,也就是进行刷新。

     

            动态RAM的存储元件依靠电容上的电荷表示所存储的数据信息,而电容的绝缘电阻不可能无限大,因此漏电不可避免。每隔一定的时间就对存储体中全部的存储电进行充电,以补充所消失的电荷,维持原存信息不变,这个过程称为“刷新”。

     

            动态MOS存储器采用“读出”方式进行刷新, 先将原存信息读出,再由刷新放大器形成原信息并重新写入。

        (2) 刷新周期

            从上一次对整个存储器刷新结束到下一次对整个存储器全部刷新一遍为止,这一段时间间隔叫刷新周期。 一般为2ms, 4ms, 8ms。 

     

    刷新的时间间隔取决与存储电容上的电荷释放速度。应在规定的时间内对全部存储体刷新一遍。

     

           设电容为C,电压为u,电荷Q=Cu,则泄放电流为:

            如果取C=0.2pF, △u=1V,I=0.1nA,则: 泄放时间△t=2ms

     

        (3) 刷新方式

            常用的刷新方式有三种:           集中式、分散式、异步式。

     

    ①集中式刷新

          在整个刷新间隔内,前一段时间重复进行读/写周期或维持 周期,等到需要进行刷新操作时,便暂停读/写或维持周期,而逐行刷新整个存储器,它适用于高速存储器。集中式刷新适用于高速存储器。存在不能进行读写操作的死区时间。

    刷新时间=存储矩阵行数╳刷新周期

     

    刷新周期是刷新一行所需要的时间。由于刷新过程就是“假读”的过程,所以刷新周期等于存取周期。

     

    例如:对128x128矩阵存储器刷新。

    刷新时间相当于128个读周期:

            设刷新周期为2ms,读/写周期为0.5μs,则 刷新周期有4000个周期,其中

                3782个周期(1936 μs)用来读/写或维持信息;

                128个周期(64 μs)用来刷新操作;

                当3781个周期结束,便开始进行128个周期,64 μs的刷新操作。由于在这64us中不进行读写操作,故称其为死时间.

     

     

    ②分散式刷新

            把一个存储周期tc分为两半,周期前半段时间tm用来读/写操作或维持信息,周期后半段时间tr作为刷新操作时间。 这种刷新方式增加了系统的存取周期。

             这种刷新方式没有死区,明显的缺点:

                一是加长了系统的存取周期 ,降低了整机的速度;

                二是刷新过于频繁,尤其是在当存储容量比较小的情况下, 没有充分利用所允许的最大刷新间隔(2ms)

     

            这样,每经过128个系统周期时间,整个存储器便全部刷新一遍。分散式刷新系统速度降低,但不存在停止读写操作的死时间。

     

            例如:对32*32的存储器,假如存储器的读写周期为0.5us,那么刷新的时间也为0.5us,则整个存储系                统周期为1us.只需32us就能对全部的存储单元刷新一遍.

     

    ③异步式刷新

             这种刷新方式可以看成前两种方式的结合,它充分利用了最大刷新间隔时间,把刷新操作平均分配到整个最大刷新间隔时间内进行。

    相邻两行的刷新时间=最大刷新间隔时间÷行数

     

    例如:对2116来说,在2ms中内把128行刷新一遍。

                2000μs ÷128 ≈15.5 μs            即:每15.5 μs 刷新一行。           

     

        (4) 刷新操作种类

    1)只用RAS信号的刷新

     在这种刷新操作中,基本上只用RAS信号来控制刷新,CAS信号不动作。为了确保在一定范围内对所有行都刷新,使用一种外部计数器。

     2)CAS在RAS之前的刷新    

        这种方式是在RAS之前使CAS有效,启动内部刷新计数器,产生需要刷新的行地址,而忽略外部地址线上的信号。目前256K位以上的DRAM芯片通常都具有这种功能。

        

    例:  说明1M×1位DRAM芯片的刷新方法,刷新周期定为8ms。

    1M位的存储单元排列成  512x2048的矩阵; 

    如果选择一个行地址进行刷新, 刷新地址为A0~A8(2^9),因此这一行上的2048个存储元同时进行刷新;     

    在8ms内进行512个周期的刷新; 刷新方式可采用:在8ms中进行512次刷新操作的集中刷新方式;      

    按8ms÷512=15.5μs刷新一次的异步刷新方式。

     

     

     

    3.DRAM的电气特征:

    • 集成度高,功耗低具有易失性,必须刷新。

    • 破坏性读出,必须读后重写。 

    • 读后重写、刷新均经由刷新放大器进行。 

    • 刷新时只提供行地址,由各列所拥有的刷新放大器,对选中行全部存储细胞实施同时集体读后重写(再生)。

     

    4.DRAM与SRAM的不同:

    • 静态存储器SRAM(双极型、静态MOS型):依靠双稳态电路内部交叉反馈的机制存储信息。功耗较大,速度快,作Cache。

    • 动态存储器DRAM(动态MOS型):依靠电容存储电荷的原理存储信息。功耗较小,容量大,速度较快,作主存。

    • SRAM:利用双稳态触发器来保存信息,只要不断电,信息是不会丢失的,因为其不需要进行动态刷新,故称为“静态”存储器。

    • DRAM:利用MOS电容存储电荷来保存信息,使用时需要给电容充电才能使信息保持,即要定期刷新。

     

    (二)DRAM存储芯片实例

     

    内部结构——Intel2164(64K×1)

     

    Intel 2164(64K×1)引脚

     

    A0~A7:地址输入线

    RAS:行地址选通信号线,兼起片选信号作用(整个读写周期,RAS一直处于有效状态) 

    CAS:列地址选通信号线 

    WE:读写控制信号( 0-写 1-读) 

    Din:数据输入线 

    Dout:数据输出线

     

     

     

    二、DRAM的时序与控制

     

    1.读周期:行地址有效→行地址选通→列地址有效→列地址选通→数据输出→行选通、列选通及地址撤销

     

    2.写周期:行地址有效→行地址选通→列地址、数据有效→列地址选通→数据输入→行选通、列选通及地址撤销

     

     

     

    4.存储器控制电路

            DRAM存储器的刷新需要有硬件电路的支持,包括: 刷新计数器、 刷新/访存裁决、 刷新控制逻辑等。 这些控制线路形成DRAM控制器。     DRAM控制器是CPU和DRAM的接口电路,它将CPU的信号变换成适合DRAM芯片的信号。

    DRAM控制器

    (1)地址多路开关:读写操作时向DRAM芯片分时送出行地址和列地址;刷新时需要提供刷新地址。

    (2)刷新定时器: 定时电路用来提供刷新请求。

    (3)刷新地址计数器:只用RAS信号的刷新操作,需要提供刷新地址计数器。对于1M位的芯片,需512个地址,故刷新计数器9位。 

    (4)仲裁电路:对同时产生的来自CPU的访问存储器的请求和来自刷新定时器的刷新请求的优先权进行裁定。 

    (5)定时发生器:提供行地址选通信号RAS、列地址选通信号CAS和写信号WE.

     

     

     

    展开全文
  • DRAM动态存储器需要电源,并且需要定时刷新才能保存数据。 DRAM的存储元由MOS晶体管和电容组成。 SRAM的存储位元是双稳态触发器(锁存器)由六个MOS晶体管组成, DRAM是由单管或者三管的MOS晶体管组成,所以容量比...

    内存条属于DRAM存储器。
    在这里插入图片描述
    DRAM动态存储器需要电源,并且需要定时刷新才能保存数据。
    DRAM的存储元由MOS晶体管电容组成。
    在这里插入图片描述
    SRAM的存储位元是双稳态触发器(锁存器)由六个MOS晶体管组成,
    DRAM是由单管或者三管的MOS晶体管组成,所以容量比SDRAM大。

    • MOS晶体管
      在这里插入图片描述
      在这里插入图片描述
    展开全文
  • 摘自《深入理解计算机系统》程序使用动态存储器分配的最重要的原因是它们经常直到程序实际运行,才知道某些数据结构的大小。例:加入一个程序读取n个ASCII吗的整数的链表,每一行一个整数,从标准输入到一个C数组,...

    摘自《深入理解计算机系统》

    程序使用动态存储器分配的最重要的原因是它们经常直到程序实际运行,才知道某些数据结构的大小。

    例:

    加入一个程序读取n个ASCII吗的整数的链表,每一行一个整数,从标准输入到一个C数组,输入n个整数,存储n个整数,通常可以采用一种方法就是直接定义一个很大的静态数组。

    #include < stdio.h>

    #define N 1500

    int a[N];

    int main(){

    int i,m;

    scanf(“%d”,&m);

    if(m>N)

    printf(“读入数据大于最大数据!\n”);

    for(i=0;i < m; i++ )

    scanf("%d",&a[i]);

    return 0;

    }

    采用这种定义固定大小的数组,通常会导致一个异常,当待读入数据大于N时,那么就会发生读入文件失败,这种写法在实际项目会加大程序的维护复杂度。

    为了让程序自动适应存储分配的大小,此时我们需要采用动态分配存储空间的方式,动态改变数组大小,如下所示:

    #include < stdio.h>

    #include < stdlib.h>

    int main(){

    int *a,i,m;

    scanf(“%d”,&m);

    a=(int *)malloc(m*sizeof(int));

    for(i=0;i < m;i++ )

    scanf("%d",&a[i]);

    free(a);

    return 0;

    }

    通过以上的示例对比,我们可以发现动态存储分配,对c语言编程起着非常重要的作用,所以我们必须认真的掌握动态存储分配的技巧。

    相关阅读:

    malloc的使用方法及注意事项

    展开全文
  • 在学习malloc时,对于malloc对堆区空间的操作进行了一个深入探索,基于动态存储器分配做了下面的思维导图,如有错误或不足,欢迎指出

    malloc挖掘—动态存储器分配深入了解

    在学习malloc时,我对于malloc对堆区空间的操作进行了一个深入探索,基于动态存储器分配写了这篇博客,如有错误或不足,欢迎指出
    以下内容是从《深入理解计算机系统》一书总结而来

    我们一般说malloc是动态内存分配,实际上malloc就是动态分配器的一种,那么下面我们就以动态存储器为切入点进行探索:

    一、为什么要使用动态存储器分配?

    最主要的原因是经常直到程序实际运行时才知道某些数据结构的大小

    二、堆区

    1.我们都知道,malloc申请空间实在堆上,那么堆空间是怎样的呢?

    在C/C++内存中,堆区是紧接在bss区域(即数据段,存储未初始化的全局/静态变量)之后,向上(更高的地址)增长的,对于每一个进程,内核维护着一个指针变量brk(break)指向堆顶

    2.动态分配器是怎么处理堆区的呢?

    分配器将堆视为一组大小不同的块(block)的集合来维护,要么是已分配的,要么是空闲的

    三、动态分配器

    1.理解动态分配器

    前面已经说过动态分配器将堆视为一组大小不同的块(block)的集合来维护,要么是已分配的,要么是空闲的。需要了解:
    1.对于已经分配的,显示地保留给应用程序使用,空闲的则可以继续分配。
    2.一个已经分配的块保持已经分配的状态,直到被free掉,得以被堆重用。当已经分配的块一直没有被free,那么一直保持分配状态,这个就是内存泄漏了。

    2.分配器的要求和目标

    1).要求:

    处理任意请求序列 立即响应请求:分配器必须立即响应请求。因此,不允许分配器为了提高性能重行排列或者缓冲请求。
    只使用堆:为了使分配器可以拓展,分配器使用的任何非标量数据结构都要保存到堆里。
    对齐块:使得其可以保存任何类型的数据对象。
    不修改已经分配的块。

    2).目标—实现的问题(这些问题在后面动态分配器的策略会提到):

    空闲块组织:如何记录空闲块?
    放置: 如何选择一个合适的空闲块来放置一个新分配的块。
    分割:在将一个新分配的块放置到某个空闲快之后,如何处理这个空闲块中的剩余部分?
    合并:如何处理一个刚刚被释放的块?

    3.分配器分类

    1).显式分配器

    要求应用显示释放任何已经分配的块,C/C++采用此机制:C标准库中的malloc和free、C++中new和delete操作符(实际实现基于前者)

    2).隐式分配器

    分配器检测一个已分配的块何时不再被程序所使用时,自动free来释放,这就是垃圾收集,Lisp、ML、Java等语言采用此机制

    4.malloc和free

    1.malloc函数

    先祭出函数原型:void* malloc(size_t size);

    1).返回值:

    • 成功,返回一个指针void*(在使用时需要进行强转),指向大小至少为size字节的内存块,并对可能包含在这个块内的任何数据对象类型进行内存对齐
    • 如果出错(比如要申请的空间比虚拟内存空间还要大),就返回NULL(使用时要注意判空)

    2).具体实现
    使用brk和sbrk函数调用brk指针

    brk函数

    void* brk(const void* addr);
    // 将brk设置为参数addr所指定的位置。由于内存以页为单位进行分配,addr实际为下一个页的边界处。

    sbrk函数

    void* sbrk(intptr_t incr); // 将brk指针增加incr

    • // 成功,返回brk旧值,即新增大小的起始地址(可以想到,你可以调用sbrk(0)去跟踪一个堆的情况)
      // incr为0,返回brk的当前值
      // incr为负,返回值(brk的旧值)指向距新堆顶向上incr字节处
    • // 失败,返回-1,并将errno设置为ENOMEM

    注意:由于Linux是按页进行内存映射的,所以如果brk被设置为没有按页大小对齐,则系统实际上会在最后映射一个完整的页,从而实际已映射的内存空间比brk指向的地方要大一些。但是使用brk之后的地址是很危险的(尽管也许brk之后确实有一小块可用内存地址)。

    3).基于malloc功能扩展的函数:

    • 如果要初始化内存块,使用calloc初始化为0
    • 如果要改变已分配块的大小,使用realloc函数

    2.free函数

    还是先祭出函数原型:void free(void* ptr);
    // ptr必须指向一个从malloc/calloc/realloc获得的已分配块的起始地址,如果不是,free的行为就是未定义的,而且因为什么也不返回,就不会告诉用户是它出现了错误,所以就会产生一些令人迷惑的运行时错误

    3.malloc和free实现:
    以管理一个由16字(非常小)、双字(8字节)对齐的空闲块组成的堆为例:

    1.程序请求一个4字的块:从空闲块前面部分分配4字的块,返回指向这个块第一字的指针p1
    2.程序请求一个5字的块:从空闲块前面部分分配6字的块(填充一个额外字,保持内存对齐),返回指向这个块第一字(初始空闲块第5字)的指针p2
    3.程序请求一个6字的块:从空闲块前面部分分配6字的块,返回指向这个块第一字(初始空闲块第11字)的指针p3
    4.程序释放p2指向的6字节块:在调用free释放之后,p2仍然指向被释放的块,应用有责任在它被一个新的malloc调用重新初始化之前不再使用p2,或者在free之后将p2置空
    5.程序请求一个2字的块:malloc从上一步被释放的块前面部分分配2字的块,返回指向这个新块的第一字(初始空闲块第5字)的指针p4
    在这里插入图片描述
    图源:《深入理解计算机系统》

    四、碎片

    1.碎片是如何产生的?

    当虽然有未使用的内存块但不能用来满足分配请求时,就会发生碎片现象,导致堆利用率低

    1.碎片的分类:

    1).内部碎片

    • 在已分配块的大小比请求的大小大时就会产生内部碎片,比如分配器可能填充块大小以满足对齐条件
    • 内部碎片的量化就是已分配块大小与其有效载荷大小之差的和,在任意时刻,内部碎片的数量只取决于以前请求的方式和分配器的实现方式

    2).外部碎片

    • 当空闲块合计起来满足一个分配请求,但是没有一个单独的空闲块足够大可以来处理这个请求时就会产生外部碎片
    • 外部碎片的量化就困难得多了,因为它不仅取决于以前请求的方式和分配器的实现方式,还取决于将来的请求方式

    五、隐式空闲列表—实现记录空闲块问题

    1.引出:

    任何一个实际的分配器都需要一些数据结构用来区分块边界以及区别已分配块和空闲块,大多数分配器将这些信息嵌入在块本身。

    2.实现:

    1.将堆组织为一个连续的已分配块和空闲块的序列

    1).已分配块由这几部分组成:

    a.一个字大小的头部

    • 头部编码了这个块的大小(包含头部和所有填充),以及这个块是已分配的还是空闲的
    • 如果强加一个双字(8字节)对齐的约束条件,那么块大小就总是8的倍数,且表示块大小的最低3位总是0,因此只需要存储块大小的29个高位,释放剩余的3位来编码其他信息:用最低位作为已分配位来指明这个块是已分配的还是空闲的
    • 综上,头部标记为:大小(字节)/已分配位

    b.有效载荷

    调用malloc时请求的大小

    c.可能有的一些额外填充

    • 可能是分配器策略的一部分,用来对付外部碎片
    • 也可能用来满足对齐要求

    2).空闲块是通过头部中的大小字段隐含地连接着

    2.序列后需要加上某种特殊标记的结束块:比如一个设置了已分配位(最低位为1)而大小为0的终止头部:0/1

    六、分配器策略

    1.放置已分配的块

    当应用请求块时,分配器搜索空闲链表,查找一个足够大可以放置所请求块的内存块

    • 首次适配first fit:从头开始搜索空闲链表,选择第一个合适的空闲块
    • 下一次适配next fit:从上一次查询结束的地方开始搜索空闲链表,选择第一个合适的空闲块
    • 最佳适配best fit:检查每个空闲块,选择适合请求大小的最小空闲块
      优点:内存块利用率较高
      缺点:在隐式空闲链表中使用,要对堆进行彻底的搜索(分离式空闲链表则不需要)

    1.放置已分配的块

    当分配器找到合适的空闲块,就需要另一个策略决定分配这个空闲块中的多少空间

    • 整个空闲块:将整个空闲块用作已分配块,简单快捷,但会造成内部碎片(如果放置策略选择最佳适配还可以接受)
    • 如果匹配不太好,分配器通常选择分割成两部分:第一部分变成分配块,剩下的变成一个新的空闲块

    1.找不到合适的空闲块

    1.合并
    合并那些在内存块中物理上相邻的空闲块来创建一个更大的块

    1).引出:

    • 当分配器释放一个已分配块时,可能有其他空闲块与这个新释放的空闲块相邻,这些相邻的空闲块可能引起一种现象,叫做假碎片,就是有许多可用的空闲块被切割成小的、无法使用的空闲块
    • 为了解决假碎片问题,任何实际的分配器都必须合并相邻的空闲块

    2).两种合并策略

    • 立即合并:每次一个块被释放时,就合并所有的相邻块(可能产生一种形式的抖动,块会反复地合并,然后立即分割)
    • 推迟合并:等到某个稍晚的时候再合并空闲块,比如直到某个分配请求失败,再扫描整个堆,合并所有相邻空闲块(快速的分配器通常会选择某种形式的推迟合并)

    3).分配器如何实现合并?
    合并下一个空闲块:使当前块(当前想要释放的块)的头部指向下一个块的头部

    合并上一个空闲块:

    • 边界标记:在每个块的结尾处添加一个脚部(其实就是头部的一个副本),这样分配器就可以通过检查它的脚部,判断上一个块的起始位置和状态
    • 不同场景:
      1.上一个和下一个块都是已分配:仅仅将当前块从已分配变为空闲
      2.上一个块已分配,下一个块空闲的:用当前块和下一个块的大小之和更新当前块的头部和下一个块的脚部
      3.上一个块空闲的,下一个块已分配:用当前块和上一个块的大小之和更新上一个块的头部和当前块的脚部
      4.上一个和下一个块都是空闲的:用三个块的大小之和更新上一个块的头部和下一个块的脚部
    • 边界标记优化:如果把上一个块的已分配/空闲位存放在当前块中多出来的低位上,那么已分配的块就不需要脚部了,这样就可以将这个多出来的空间用作有效载荷了(注意,空闲块仍需要脚部)

    2.如果不够,分配器就会通过调用sbrk函数向内核请求额外的堆内存块,分配器将其转化为一个大的空闲块,将这个块插入空闲链表中,然后将请求的块放置在这个新的空闲块中

    七、扩展

    1.因为块分配与堆块的总数呈线性关系,所以对于通用的分配器,隐式空闲链表是不合适的。所以引出了显示空闲链表(将空闲块组织为某种形式的显式数据结构)

    2.为了减少分配时间,又引出了分离空闲链表(维护多个空闲链表)

    3.如需详细了解可以看《深入理解计算机系统》一书或参照下面的博客:
    https://blog.csdn.net/qq_35066345/article/details/78747410

    下面附上之前做的思维导图,内容基本相同,仅供参考
    在这里插入图片描述

    展开全文
  • 动态存储器分配器的概念讲在前面:这个和c语言中的malloc和free有关。主要是了解内存的动态分配方式。
  • 动态存储器分配器

    2011-06-19 12:27:00
    动态存储器分配器有两种:显式分配器。要求应用显式地释放任何已分配的块。例如,C标准库提供一种叫做malloc程序包的显式分配器。C程序通过调用malloc函数来分配一个块,并通过调用free函数来释放一个块。隐式分配器...
  • C/C++动态存储器分配

    2020-12-22 19:17:01
    1. mmap和munmap #include void *mmap(void *start,size_t length, int prot, int flags,int fd, off_t offset); int munmap(void *start,size_t length);  mmap将一个文件或者其它对象映射进内存。...
  • 例如,日历、短信息 (short message service,sms)和电话簿 (或通讯录) 可能会共享移动设备中的动态存储器。一般计算机系统使用的随机存取内存(ram)可分动态与静态随机存取内存(sram)两种,差异在于dram需要由...
  • 1、需要额外的虚拟存储器时,使用一种动态存储器分配器(dynamic memory allocator)。一个动态存储器分配器维护着一个进程的虚拟存储器区域,称为堆(heap)。在大多数的unix系统中,堆是一个请求二进制0的区域;...
  • 目前的存储器,速度快的成本高,依据存储器,我们设计了适于计算机的层次存储系统。讲了 DRAM 的电路与特点。
  • DRAM存储器的地址线可复用,10根当作20根用。
  • 1.信号电平:采用STTL-2电平,2.5V 标准: VIH(AC)=Vref+0.31 VIH(DC)=Vref+0.15 VIL(DC)=Vref-0.15 VIL(AC)=Vref-0.31 高于VIH(AC)为高,纹波只要不低于VIL(DC)就一直维持逻辑不变;低于VIL(AC)同理。...
  • 1.用户级存储器映射 之前我们介绍过关于程序加载的详细内容,我们知道在其加载执行之前要对程序进行存储器映射,Unix进程可以使用mmap函数来创建新的虚拟存储器区域,并将对象映射到这些区域。 mmap函数要求内核创建...
  • 本文主要解决在vxi总线模块上实现大容量动态存储器的技术难题,介绍了利用可编程逻辑器件实现数字信号处理器(dsp)与同步动态存储器(sdram)之间的数据读取逻辑的设计、编程思想,以及必要的硬件连接,编程方法等...
  • <p>I was searching for memory allocations of slices whether static at compile time or dynamic on fly. Since slices are pointers to the array in back and I have studied that for dynamic memory ...
  • 1和CL支持(仅X4/X8) 可编程CAS写入延迟(CWL)= 9, 10, 11, 12, 14, 16,18, 20 可编程爆裂长度4/8与双方轻咬 顺序交织模式 BL开关在飞 公称和动态上模终止(ODT) 频闪和掩膜信号 低功耗自动刷新 数据总线的数据总线...
  • CSI-S4:动态存储器分配-malloc与GC

    千次阅读 2014-04-14 13:43:34
    用户级存储器映射  之前我们介绍过关于程序加载的详细内容,我们知道在其加载执行之前要对程序进行存储器映射,Unix进程可以使用mmap函数来创建新的虚拟存储器区域,并将对象映射到这些区域。 Mmap函数要求内核...
  • 伙伴系统是分离适配器的一个特例,其中每个大小类都是2的幂。 1>假设一个堆的大小为2^m个字 2>我们为每个块的大小2^k维护一个分离空闲链表,其中0。 3>请求块的大小向上舍入到最接近的2 的幂,最开始时,只有一个...
  • DEVICE_WIDTH表示设备的带宽(单位bit),每个列(column)包含DEVICE_WIDTH 位(bit),每一行(row)包含NUM_COLS个column。   而每一个bank包含NUM_ROWS个行(row)。所以一个设备(device)的存储容量为PER_DEVICE_...
  • 存储器

    2020-03-13 17:24:54
    存储器 一、分类 按存储介质分:半导体存储器、磁表面存储器、磁心存储器、光盘存储器。...分为静态存储器(SRAM)和动态存储器(DRAM)。SRAM通常用作高速缓冲存储器,DRAM通常用于主存。 2)只读存储器(...
  • 存储器简介

    2020-03-13 16:18:58
    存储器简介 静态存储器(SRAM) 静态存储器不需要刷新,主要用于...动态存储器需要使用一个小容量的电容来保存信息,用电容中有无电荷来表示1和0。由于电容会漏电,所以DRAM需要定期刷新。 只读存储器(ROM) 与RAM不同...
  • 一般计算机系统所使用的随机存取内存主要包括动态与静态随机存取内存两种,差异在于DRAM需要由存储器控制电路按一定周期对存储器刷新,才能维系数据保存,SRAM的数据则不需要刷新过程,在上电期间数据不会丢失。...
  • 动态分区存储器管理 ◆模拟动态分区存储管理算法,实现用户区的分配与回收 ◆菜单包括 ➢初始化(设置内存大小、可用分区表、内存分配表) ➢分配(输入一个进程名和所需内存大小,按某种分配算法进行分配,输出分配...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,075
精华内容 1,230
关键字:

动态存储器