精华内容
下载资源
问答
  • 我们一个最简单的问题开篇,为什么内存地址0x0001和内存地址0x0002之间差的是一个byte,而不是一个bit? 我想你对内存存储的计算已经熟练于心,a变量占用内存多少字节,b变量占用内存多少字节。但是你有没有深入...

    我觉得在冯诺依曼体系结构里,CPU和内存是最重要的设备。如果没有CPU和内存,服务器将完全无法运行。 所以继第一阶段分享完了CPU篇之后,今天就开始内存篇。我们以一个最简单的问题开篇,为什么内存地址0x0001和内存地址0x0002之间差的是一个byte,而不是一个bit?

    我想你对内存存储的计算已经熟练于心,a变量占用内存多少字节,b变量占用内存多少字节。但是你有没有深入思考过,为什么我们用的存储单位都是字节,而不是比特?可能你会说因为ASCII码的基本编码单位就是字节呀,你还有可能举出很多个原因来说明内存应该以字节进行计算的原因。但那为啥网络带宽都是以bit,而不也用byte来计算的呢?

    我们平时好像太过于习以为常,而没有去深想过具体的原因。我今天呢,是想从一个特定的角度去看待这个问题,那就是从内存的硬件物理结构。我们来了解一下内存的物理构造,一般内存的外形图片如图1:

    为什么内存为什么是以字节为单位的?

                                       图1 内存外形

    如图1所示,一个内存是由若干个黑色的内存颗粒构成的。每一个内存颗粒叫做一个chip,所有的数据都是存在这些chip里的。上面这个内存条有8个chip(正反面各四个)。chip内部构造如图2:

    为什么内存为什么是以字节为单位的?

                                         图2 chip内部结构

    每一个chip内部,又是由8个bank组成的。在每个bank内部,就是电容的行列二维矩阵结构了,如图3。

    为什么内存为什么是以字节为单位的?

                                       图3 bank内部构造

    这个矩阵由多个方块状的元素构成,这个方块元素是内存管理的最小单位。要注意的是每一个元素有8个小电容,存储8个bit,也就是一个字节。换句话说,因为在内存物理结构中最小管理单位是元素,一个元素就是8bit。所以操作系统在管理它的时候,自然最小单位也就是字节了

     

    欢迎关注个人公众号“开发内功修炼”,打通理论与实践的任督二脉!

    展开全文
  • 内存单位

    千次阅读 2016-04-12 11:29:25
    我认为是比特b(bit),因为字节是由位组成的,计算机是由电路组成的,而电路值认识高低电平,也就是所谓的1和0,然后我们规定表示一个信息的最小单位为字节,一个字节由8个位组成,那么为什么要8个位组成呢,...

    首先,计算机的最小单位是什么呢?

    有人认为是字节B(Byte),我认为是比特b(bit),因为字节是由位组成的,计算机是由电路组成的,而电路值认识高低电平,也就是所谓的1和0,然后我们规定表示一个信息的最小单位为字节,一个字节由8个位组成,那么为什么要8个位组成呢,我个人认为是因为如果由一个位组成就没必要在命令一个字节名词了,同时一个位表示的信息量太少了,8位就可以表示2的8次方的不同意思了,所以8个位表示一个 字节,理所当然啦~~(个人理解)

    1.KB  和Kb有什么区别呢?  

    很明显了,K(kilo-binary)表示二进制千(2^10 = 1024),B表示字节,b表示比特位,所以1KB = 8*2^10 = 8*1024 Kb,     1Kb = 1024/8 (KB) = 128B

    2. MB和Mb的区别

    1兆字节:MB = 2^10 KB (千字节)= 2^10 * 2^10 B (字节) = 2^10 * 2^10 *8 b(位) = 1024 * 1024 * 8 bit;

    1兆比特位:Mb = 2^10 Kb (千比特位)= 2^10 * 2^10 b(位) = 1024 * 1024 bit;

    1Mb =   1024 * 1024 bit = 1024 * 1024 / 8 (字节B)  = 1024 * 1024 / 8/1024 (千字节KB)  = 128 KB

    3.宽带换算

    所以我们所谓的100Mb宽带换算为我们常用的网速KB为:100Mb = 100 * 1024 (Kb) = 100 * 1024 * 1024 (b) = 100 * 1024 * 1024  / 8 (B)  =  100 * 1024 * 1024 /8/1024 (KB) = 

    12800KB = 12800 / 1024 (MB) = 12.5 MB

    4.硬盘存储大小换算

    其次,对于我们的软盘或者硬盘存储设备,我们可以发现他们标的存储大小比实际我们使用的大小要小,这是因为厂商一致都认为为了方便人去计算,都以1000来计算内存大小,而不是安装二进制位的2^10来计算的;

    所以  厂商生产的  1T硬盘  =  1000 GB  = 1000 * 1000 MB = 1000 * 1000 * 1000 KB  = 1000 * 1000 * 1000 * 1000 B

    换算成标准  1000 * 1000 * 1000 * 1000 B = 1000 * 1000 * 1000 * 1000 / 1024 KB 

       =  1000 * 1000 * 1000 * 1000 / 1024/1024 MB

       =  1000 * 1000 * 1000 * 1000 / 1024/1024、1024 GB = 931.322GB  = 0.909TB

    16GB = 16 * 1000 MB = 16 * 1000 * 1000 KB = 16 * 1000 * 1000 * 1000 B

    换算成标准 16 * 1000 * 1000 * 1000 B = 16 * 1000 * 1000 * 1000 / 1024 KB

          = 16 * 1000 * 1000 * 1000 / 1024 / 1024 MB

          = 16 * 1000 * 1000 * 1000 / 1024 / 1024 / 1024 = 14.9 GB


    展开全文
  • 应用程序内存组成

    千次阅读 2010-07-15 15:08:00
    Win32应用程序内存组成

    对于 Windows 32 来说,系统会给每个进程 4GB 的地址空间,低端 2GB $00000000-$7FFFFFFF )给用户支配;高端 2GB $80000000-$FFFFFFFF )留给系统使用,这个 4G 的地址空间叫“虚拟地址表”,虚拟地址表不是真实的内存。

    这个“虚拟地址表”上有 4GB 的空间,每个程序都有这样的一个表,但他们并不会冲突,这样就阻断了一个进程对另一个进程的访问,系统在需要的时候会把他们映射成具体的真实内存地址。

    可以使用 GlobalMemoryStatus 来获取内存信息,获取后的信息放在 TMemoryStatus 结构体中。


     

    在用户的 2GB 地址空间中,低端的 0-$FFFF 是用于空指针分配,高端的 $7FFF0000-$7FFFFFFF 用于进程的临界区,这两个地址都是禁止访问的。 进程真正的私有空间地址是: $10000-$FFEFFFF 。我们可以通过 GetSystemInfo 函数得到证实,函数返回 TSystemInfo 结构,结构中的 lpMinimumApplicationAddress lpMaximumApplicationAddress 分别标识程序可以访问的最低与最高地址,通过 GetSystemInfo 还能得到一个内存相关的重要参数:页大小( PageSize ),通常大小是 4K ,我们需要知道的是,用 VirtualAlloc 函数分配的内存就是 PageSize 4K )为最小单位,假如我们用 VirtualAlloc 给一个整数分配内存,就会浪费 4092 个字节。

     

     

     

    展开全文
  • 那么编译器为什么要进行内存对齐呢?程序1中结构体按常理来理解sizeof(st1)和sizeof(st2)结果都应该是7,4(int) + 2(short) + 1(char) = 7 。经过内存对齐后,结构体的空间反而增大了。 在解释内存对齐的作用前,...

    原文: http://blog.csdn.net/liupeng900605/article/details/7530010


    首先由一个程序引入话题:

     1 //环境:vc6 + windows sp2
     2 //程序1
     3 #include <iostream>
     4 
     5 using namespace std;
     6 
     7 struct st1 
     8 {
     9     char a ;
    10     int  b ;
    11     short c ;
    12 };
    13 
    14 struct st2
    15 {
    16     short c ;
    17     char  a ;
    18     int   b ;
    19 };
    20 
    21 int main()
    22 {
    23     cout<<"sizeof(st1) is "<<sizeof(st1)<<endl;
    24     cout<<"sizeof(st2) is "<<sizeof(st2)<<endl;
    25     return 0 ;
    26 }
    27 

    程序的输出结果为:

     sizeof(st1) is 12

            sizeof(st2) is 8

     

    问题出来了,这两个一样的结构体,为什么sizeof的时候大小不一样呢?

    本文的主要目的就是解释明白这一问题。

     

    内存对齐,正是因为内存对齐的影响,导致结果不同。

    对于大多数的程序员来说,内存对齐基本上是透明的,这是编译器该干的活,编译器为程序中的每个数据单元安排在合适的位置上,从而导致了相同的变量,不同声明顺序的结构体大小的不同。

     那么编译器为什么要进行内存对齐呢?程序1中结构体按常理来理解sizeof(st1)和sizeof(st2)结果都应该是7,4(int) + 2(short) + 1(char) = 7 。经过内存对齐后,结构体的空间反而增大了。

    在解释内存对齐的作用前,先来看下内存对齐的规则

    <!--[if !supportLists]-->1、  <!--[endif]-->数据成员各自对齐:对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数。

    <!--[if !supportLists]-->2、  <!--[endif]-->结构(或联合)本身也要进行对齐:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

    #pragma pack(n) 表示设置为n字节对齐。 VC6默认8字节对齐


    以程序1为例解释对齐的规则 :

    St1 :char占一个字节,起始偏移为0 ,int 占4个字节,min(#pragma pack()指定的数,这个数据成员的自身长度) = 4(VC6默认8字节对齐),所以int按4字节对齐,起始偏移必须为4的倍数,所以起始偏移为4,在char后编译器会添加3个字节的额外字节,不存放任意数据。short占2个字节,按2字节对齐,起始偏移为8,正好是2的倍数,无须添加额外字节。到此规则1的数据成员对齐结束,此时的内存状态为:

    oxxx|oooo|oo

    0123 4567 89 (地址)

    (x表示额外添加的字节)

    共占10个字节。还要继续进行结构本身的对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行,st1结构中最大数据成员长度为int,占4字节,而默认的#pragma pack 指定的值为8,所以结果本身按照4字节对齐,结构总大小必须为4的倍数,需添加2个额外字节使结构的总大小为12 。此时的内存状态为:

    oxxx|oooo|ooxx

    0123 4567 89ab  (地址)

    到此内存对齐结束。St1占用了12个字节而非7个字节。

     St2 的对齐方法和st1相同,读者可自己完成。

     

    内存对齐的主要作用是:

    <!--[if !supportLists]-->1、  <!--[endif]-->平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

    <!--[if !supportLists]-->2、  <!--[endif]-->性能原因:经过内存对齐后,CPU的内存访问速度大大提升。具体原因稍后解释。

     图一:


    这是普通程序员心目中的内存印象,由一个个的字节组成,而CPU并不是这么看待的。

     图二:


    CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块进行读取的。块大小成为memory access granularity(粒度)本人把它翻译为“内存读取粒度” 。【原文::memory access granularity,computer's processor  accesses memory in two-, four-, eight- 16- or even 32-byte chunks,不同CPU 粒度可能不一样

     

    假设CPU要读取一个int型4字节大小的数据到寄存器中,分两种情况讨论:

    <!--[if !supportLists]-->1、<!--[endif]-->数据从0字节开始

    <!--[if !supportLists]-->2、<!--[endif]-->数据从1字节开始

     

    再次假设内存读取粒度为4。

     图三:

    当该数据是从0字节开始时,很CPU只需读取内存一次即可把这4字节的数据完全读取到寄存器中。

     当该数据是从1字节开始时,问题变的有些复杂,此时该int型数据不是位于内存读取边界上,这就是一类内存未对齐的数据。

     

    图四:

     

    此时CPU先访问一次内存,读取0—3字节的数据进寄存器,并再次读取4—5字节的数据进寄存器,接着把0字节和6,7,8字节的数据剔除,最后合并1,2,3,4字节的数据进寄存器。对一个内存未对齐的数据进行了这么多额外的操作,大大降低了CPU性能。

     这还属于乐观情况了,上文提到内存对齐的作用之一为平台的移植原因,因为以上操作只有有部分CPU肯干,其他一部分CPU遇到未对齐边界就直接罢工了。


       原文地址:http://www.cppblog.com/snailcong/archive/2009/03/16/76705.html


    补充:

    什么是对齐,以及为什么要对齐:

     现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。 对齐的实现 通常,我们写程序的时候,不需要考虑对齐问题。编译器会替我们选择时候目标平台的对齐策略。当然,我们也可以通知给编译器传递预编译指令而改变对指定数据的对齐方法。 但是,正因为我们一般不需要关心这个问题,所以因为编辑器对数据存放做了对齐,而我们不了解的话,常常会对一些问题感到迷惑。最常见的就是struct数据结构的sizeof结果,出乎意料。为此,我们需要对对齐算法所了解。

      作用:指定结构体、联合以及类成员的packing alignment;   语法:#pragma pack( [show] | [push | pop] [, identifier], n )  说明:1,pack提供数据声明级别的控制,对定义不起作用;2,调用pack时不指定参数,n将被设成默认值;3,一旦改变数据类型的alignment,直接效果就是占用memory的减少,但是performance会下降;  语法具体分析:1,show:可选参数;显示当前packing aligment的字节数,以warning message的形式被显示;2,push:可选参数;将当前指定的packing alignment数值进行压栈操作,这里的栈是the internal compiler stack,同时设置当前的packing alignment为n;如果n没有指定,则将当前的packing alignment数值压栈;3,pop:可选参数;从internal compiler stack中删除最顶端的record;如果没有指定n,则当前栈顶record即为新的packing alignment数值;如果指定了n,则n将成为新的packing aligment数值;如果指定了identifier,则internal compiler stack中的record都将被pop直到identifier被找到,然后pop出identitier,同时设置packing alignment数值为当前栈顶的record;如果指定的identifier并不存在于internal compiler stack,则pop操作被忽略;4,identifier:可选参数;当同push一起使用时,赋予当前被压入栈中的record一个名称;当同pop一起使用时,从internal compiler stack中pop出所有的record直到identifier被pop出,如果identifier没有被找到,则忽略pop操作;5,n:可选参数;指定packing的数值,以字节为单位;缺省数值是8,合法的数值分别是1、2、4、8、16
    展开全文
  • 什么内存BANK

    千次阅读 2016-03-18 10:29:09
    关于内存Bank的探讨 目前很多人对内存Bank(电脑系统与内存之间数据总线的基本工作单位)都有一种误解,认为单面内存就是单Bank,双面内存就是双Bank的。其实这种观念是不对的,内存的Bank(指物理Bank)数和内存颗粒的...
  • JVM内存组成&调优参数详解

    千次阅读 2017-01-07 20:07:35
    内存大小=堆内存区 + 持久代(永久代、方法区)区大小+程序计数器+Java虚拟机栈+本地方法栈; 名词解释: 1、堆内存区:Java程序在运行时创建的所有类实例或数组都放在同一个堆中。而一个Java虚拟实例...
  • 数据存储是“字节”(Byte)为单位,数据传输是大多是“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写b)组成一个字节(Byte,简写B),是最小一级的信息单位...
  • 为什么设置-Xmx4g但是java进程内存占用达到8g?

    千次阅读 热门讨论 2021-01-28 16:05:06
    不知道大家在开发过程中有没有遇到过类似的问题,明明通过JVM参数-Xmx4g设置了最大堆内存大小4g,但是程序运行一段时间后发现占用的内存明显超过了8g,却并没有出现内存溢出等问题,那是什么东西占用了额外的内存...
  • 为什么32位机器最大只能用到4GB内存

    千次阅读 2016-09-04 15:53:38
    在此之前先来了解一些计算机存储单位之间的关系以及计算机系统...字节 byte:8个二进制位一个字节(B),即1B = 8bit,最常用的单位。 计算机存储单位一般用B,KB,MB,GB,TB,PB,EB,ZB,YB,BB来表示,它们之间...
  • 详解为什么32位系统只能用4G内存

    千次阅读 多人点赞 2017-12-22 17:26:14
     Bit计算机是计算机最小的存储单位, 大家都知道计算机实质上都是用二进制数0或者1来存储数据的, 所以Bit实际上可以看成存放1个二进制数字的1个位置.  也就是说bit只有2种值, 0 或者 1, 所以1个bit能存放1个布尔...
  • 真香!Linux 原来是这么管理内存

    千次阅读 多人点赞 2020-07-28 13:49:48
    Linux 内存管理模型非常直接明了,因为 Linux 的这种机制使其具有可移植性并且能够在内存管理单元相差不大的机器下实现 Linux,下面我们就来认识一下 Linux 内存管理是如何实现的。 基本概念 每个 Linux 进程都会有...
  • 内存条的BANK数是指什么

    千次阅读 2009-04-06 19:04:00
    内存芯片的逻辑BANK 在芯片的内部,内存的数据是位(bit)为单位写入一张大的矩阵中,每个单元我们称为CELL,只要指定一个行(Row),再指定一个列(Column),就可以准确地定位到某个CELL,这就是内存芯片寻址的...
  • 为什么32位计算机只能够使用4G内存

    千次阅读 2019-07-29 11:51:34
    在此之前先来了解一些计算机存储单位之间的关系以及计算机系统结构和PC硬件方面的一些知识。 一、计算机存储单位之间的关系 ...字节 byte:8个二进制位一个字节(B),即1B = 8bit,最常用的单位。 计算机存储...
  • 电脑内存条C14和C16的区别是什么

    万次阅读 2019-09-12 09:47:59
    也就是响应时间不同,单位为时钟周期。 2、性能不同 其他条件相同的情况下,数字越小性能越好。 3、价格不同 其他条件相同的情况下,数字越小价格越高。 4、颗粒不同 内存中使用的颗粒不同,数字越小颗粒越好...
  • 深入理解Java虚拟机-Java内存区域与内存溢出异常

    万次阅读 多人点赞 2020-01-03 21:42:24
    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来。 文章目录概述运行时数据区域程序计数器(线程私有)Java虚拟机栈(线程私有)局部变量表操作数栈动态链接...
  • 凡是对电脑有所了解的朋友都知道内存这玩意,可是,可能有不少朋友对内存的认识仅仅局限在SDRAM和DDR SDRAM这两种类型,...以下就让我们看看内存到底有些什么种类吧! 一、RAM(Random Access Memory,随机存取存
  • JVM运行时内存结构

    千次阅读 2019-02-26 08:20:52
    内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配; 方法区存储类信息、常量、静态变量等数据,...
  • 什么内存?有何作用?(1)存储单元(2)几个常用数量单位&内存地址2.进程运行的基本原理(1)指令的工作原理---操作码+若干参数(可能包含地址参数)(2)逻辑地址(相对地址)vs物理地址(绝对地址)(3)从...
  • 关于内存地址和内存空间的理解

    千次阅读 2019-08-28 09:39:47
    都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢? 首先,必须要知道内存地址只是一个编号,代表一个内存空间。那么这个空间是多大呢?原来在计算机中存储器的容量是字节...
  • 详解C语言内存对齐

    千次阅读 多人点赞 2017-11-01 21:22:16
    在C语言里有一个机制是内存对齐,当然不止C语言,包括其他的编程语言都会有内存对齐机制,否则编译出来的软件无法正常运行,至于为什么呢?众所周知,在内存中,所有的数据都是按字节为最小单位存储的,存储单位称为...
  • 日期 内核版本 架构 作者 GitHub CSDN 2016-08-31 ... Linux内存管理 1 前景回顾前面我们讲到服务器体系(SMP, NUMA, MPP)与共享存储器架构(UMA和NUMA)1.1 UMA和NUMA两种模型共享存储型多处理机有两种模型
  • Linux是如何避免内存碎片的

    万次阅读 2018-03-23 19:37:01
    Linux是如何避免内存碎片的? 在网上看到这个面试题,参考答案是这样的: 伙伴算法,用于管理物理内存,避免内存碎片; 高速缓存Slab层用于管理内核分配内存,避免碎片。 故继而去深入了解了一波,做了一个...
  • Linux内存描述之概述--Linux内存管理(一)

    万次阅读 多人点赞 2016-08-31 13:29:34
    日期 内核版本 架构 作者 GitHub CSDN 2016-08-31 Linux-4.7 X86 & arm ... 链接 内存管理(一)内存模型之Node Linux 内存管理 重要结构体 Bootmem机制 Linux-2.6.32 NUMA架构之内存和调度
  • 带宽的单位为什么是Hz而不是bps?

    千次阅读 2017-12-15 21:23:00
    大家都知道,各类复杂的电子电路无一例外都存在电感、电容或相当功能的储能元件,即使没有采用现成的电感线圈或电容,导线自身就是一个电感,而导线与导线之间、导线与地之间便可以组成电容——这就是通常所说的杂散...
  • UGA由哪几部分组成?   由上述图片可知, 一个会话里如果处理的是SQL语句,那么在shared pool中就有该SQL语句对应的Shared Areas,该Shared Areas的类型Shared SQL Areas,在该会话对应的进程对应的uga中,就...
  • 日期 内核版本 架构 ...在内核初始化完成之后, 内存管理的责任就由伙伴系统来承担. 伙伴系统基于一种相对简单然而令人吃惊的强大算法.Linux内核使用二进制伙伴算法来管理和分配物理内存页面, 该算
  • 内存篇:JVM内存结构

    万次阅读 2019-11-01 19:50:24
    Java8相对之前的版本,JVM结构发生...下面,Java8例,对JVM结构做一番总结。 JVM内存结构1 JVM结构详解1.1 堆(Heap)1.2 方法区(Method Area)1.3 程序计数器(Program Counter Register)1.4 虚拟机栈(JVM ...
  • DRAM内存原理(一)内存基础

    万次阅读 2014-12-08 08:38:49
    DRAM 即动态内存,其基本单位是由一个晶体管和一个电容器组成。请看下图:  图只是DRAM一个基本单位的结构示意图:电容器的状态决定了这个DRAM单位的逻辑状态是1还是0,但是电容的被利用的这个特性也是它的...
  • 进程概述和内存分配

    千次阅读 2016-05-16 11:15:50
    进程概述和内存分配 本文是作者阅读TLPI(The Linux Programer Interface的总结),为了突出重点,避免一刀砍,我不会过多的去介绍基本的概念和用法,...进程一个进程的内存布局是什么样的?每个进程所所分配的内存由很多

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 187,678
精华内容 75,071
关键字:

内存是以什么为单位组成的