内存(RAM)结构[物理级] malloc()实际分配给用户的内存
来源:互联网 发布:excel多个矩阵相乘 编辑:程序博客网 时间:2024/05/29 14:50
大多数为刷牙时的猜测,若有读者请慎之。
猜的目的:搞清存储器在不同位数系统中的结构;malloc()函数返回给用户的实际内存块。
1 半导体存储体在以字节为存储单元的系统中的结构
半导体存储体由存储单元构成,存储单元由存储元件构成。此处略存储器内的其它电路模块。
(1) 存储元件
存储器用于寄存“0”和“1”代码的电路称为存储器的基本单元电路(存储元件)。分SRAM和DRAM基本单元电路。如单管MOS DRAM基本单元电路:
Figure1. 单管MOS DRAM基本单元电路
字线上的高电平使T导通(MOSFET元件),若C有电荷,经T管在数据线上产生电流,可视为读出“1”。若C上无电荷,则数据线上无电流,可视为读出“0”。
(2) 存储单元
存储元件的“0”、“1”状态能表示的对象有限。多个存储元件的“0”、“1”状态组成序列(串)就能够表示某对象或集合(如7个存储元件的状态就能够表示所有的ASCII)。或许是比较符合实际需求的原因,8个存储元件被视为存储器的最小存储单元,所有的其它的存储单位(如int类型)都由存储单元(即字节)组成(其实在多个字节中的各字节不在同一块内存中)。
Figure2. (字节)存储单元结构
(3) 以字节为单位的存储器芯片
[线选法]
Figure 3中省略译码器、驱动器、读\写及控制等具体的电路。Figure3中所示Lxr-xxxxxx信号存储芯片大小为28 bytes即256字节。每个存储单元地址被选中时,这个存储单元就和数据线(D0 – D7)进行数据交互。如译码器输入端输入(00000000)2时,第0行存储单元被选中,第一行即和数据线交互数据。
(4) 多字节存储器芯片(位扩展)
以16位(2字节)为例(但一般的计算机的存储单元都是8位)。每一个地址都能对应16位数据。不过一般是将位数更小的来构成8位宽度的存储器。像这样构成16位的存储器后,就没法访问一个字节。
(5) 内存单元为8位的16位系统
CPU 16位的数据总线需要接两块以字节为单位的存储器,这样才有可能实现一次访问到16位数据或8位数据。
现用两块27 * 8位存储器和具16位数据总线的CPU相连,让CPU既能一次访问8位,也能一次访问16位。
如图Figure 6,A0为0且B=0时存储器1被选中,此存储器的地址全是偶数,且标识一个字节。B = 1且A0 = 1时存储器2被选中,此存储器的地址全是奇数,且标识一个字节。当A = 0且 B = 1时,两个存储器都被选中,此时用偶数地址标识存储器上的两个字节即16位。
根据Figure 7讨论内存对齐。由于内存对齐,每个变量存储的起始地址都有讲究。若有一个变量占用4个字节,那么此变量就被分配到地址为4的整数倍的某个地址上,且再连续占4个字节。若有一个变量占用1个字节,那么这个变量随便保存到哪里都可以。
2 malloc()分配的内存块结构
(1) malloc()分配的内存块的长度
malloc(size)函数所分配内存的长度为Header部分长度的整数倍(请求的长度(字节为单位)将被舍入,以保证它是头部大小的整数倍,即实际分配的内存大于等于size字节)。
(2) 给用户的内存空间
malloc()函数返回给用户的空间是Header后面的内存空间,见Figure8。
(3) Header结构
[1] Header有一个指向空闲块链表中下一块的指针ptr变量。还有一个包含本块内存大小的size变量。
[2]为确保malloc()函数返回的存储空间满足将要保存对象的内存对齐要求,就在Header中保存一个最受限制(占内存最大)的类型的变量。如:Header为8个字节,则Header定被保存在自己的内存边界上先满足内存对齐的要求,再加上用户空间是Header的整数倍,从而使不管保存什么样的类型的变量都能达到内存对齐的目的。Header的结构可以描述如下:
typedef double Align //假设double为占内存最大的类型
union header {
struct {
union header *ptr;
unsigned size;
}s;
Align x;
}
x和s占相同的一块存储空间。x仅用于强制每个头部在最坏的情况下都满足内存对齐要求。在用户空间为Header大小整数倍的情况下,使用户空间也满足内存对齐(就算存储x类型变量都可以满足内存对齐要求)。(4) malloc()实际分配给用户的内存
Header的ptr和size帮助内存的分配和释放。x确保用户空间所要保存的对象满足内存对齐。
由于于x的存在,在32位系统中(Figure 7中的存储器结构(忽略虚拟内存层)),当调用malloc(size)分配内存时,Header会占用sizeof(Header)字节,且起始地址为sizeof(Header)的整数倍。分配给用户的内存空间取决于(float)size / sizeof(Header) = r .k的值。
- 若k = 0,则返回给用户的内存大小为size 字节;
- 若k 不等于0,则返回给用户内存大小为(r+ 1) * sizeof(Header)字节。
[2014.11.7 -- 22:28]
R《TCPL》、《CC》 Note Over.
- 内存(RAM)结构[物理级] malloc()实际分配给用户的内存
- 关于malloc实际分配内存的探讨
- malloc()分配的堆内存为什么比实际的大
- C中 malloc()分配堆内存实际的大小
- C中 malloc()分配堆内存实际的大小
- 物理内存的分配
- C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存
- 关于malloc内存分配及查询实际内存方法
- new 和malloc 给变量分配内存的区别
- 数据结构 学习笔记之:关于顺序栈中给结构体类型指针分配内存时,使用malloc和不使用malloc的疑惑之解惑!
- malloc free内存分配
- malloc内存分配机制
- malloc内存分配
- malloc内存分配
- c malloc分配内存
- malloc内存分配详解
- c malloc分配内存
- malloc内存分配原理
- 成员模板
- 机器学习之旅---SVM分类器
- P值之死
- 在Java中使用weka:创建一个ARFF文件
- 非常好的理解遗传算法的例子
- 内存(RAM)结构[物理级] malloc()实际分配给用户的内存
- 无所事事,浑浑噩噩,整个项目来玩玩(序)
- strstr函数的用法
- 2014-11-6Android学习------Android 仿真翻页效果实现--------贝塞尔曲线(二)
- JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
- 自定义ViewGroup
- WM_CTLCOLOR消息的用法
- 机构关注的数据治理问题
- Android L Settings 简要分析