精华内容
下载资源
问答
  • Zigbee地址分配

    千次阅读 2013-08-12 19:36:33
    Zigbee有两种地址分配方式:分布式分配机制和随机分配机制。   1.随机分配机制 随机分配机制是指当NIB的nwkAddrAlloc值为0x02 时,地址随机选择。在这种情况下nwkMaxRouter就无意义了。随机地址分配应符合NIST...

    Zigbee有两种地址分配方式:分布式分配机制和随机分配机制。

     

    1.随机分配机制

    随机分配机制是指当NIB的nwkAddrAlloc值为0x02 时,地址随机选择。在这种情况下nwkMaxRouter就无意义了。随机地址分配应符合NIST测试中的描述 。当一个设备加入网络使用的是Mac地址,其父设备应选择一个尚未分配过的随机地址。一旦设备已分配一个地址,它没有理由放弃该地址,并应予以保留,除非它收到声明,其地址与另一个设备冲突。此外,设备可能自我指派随机地址,比如利用加入命令帧加入一个网络。

     

    2.分布式分配机制

    我们知道,每个zigbee设备应该拥有一个唯一的MAC地址。协调器(coordinator)在建立网络以后使用0x0000做为自己的短地址。在路由器(router)和终端(enddevice)加入网络以后,使用父设备给它分配的16位的短地址来通讯。那么这些短地址是如何分配的呢?

     

     

    16位的地址意味着可以分配给65536个节点之多,地址的分配取决于整个网络的架构,整个网络的架构由这3个值决定:

     

        1.网络的最大深度(Lm);

     

        2.每个父亲设备拥有的孩子数(Cm);

     

        3.第2条的孩子设备当中有几个是路由器(Rm)。

     

    有了这3个值就可以根据下面的公式来算出某父设备的路由器子设备之间的地址间隔Cskip(d):

     

    Cskip(d)计算公式

     

    上面这个公式是用来计算位于深度d的父亲设备的,它所分配的子路由器之间的短地址间隔。该父亲设备分配的第1个路由器地址=父亲设备地址+1,分配的第2个路由器地址=父亲设备地址+1+Cskip(d),第3个路由器地址=父亲设备地址+1+2×Cskip(d),依次类推。

     

    计算终端地址:

     

    enddevice短地址计算公式

     

    这个公式是来计算A parent这个父亲设备分配的第n个终端设备的地址A n。

     

     

    来举个简单的例子,假设有一个Zigbee网络,最大深度为3,每个父亲的最大孩子数是5,在孩子当中路由器数量是3,如图所示:

     

     

     

    Zigbee网络结构示意图

     

     

     

    由图可知,协调器的Cskip(d) = (1+5-3-5×3^(3-0-1))/(1-3) = 21,所以协调器的第一个路由器是1,第二个就是22,换算成十六进制就是0x0016。协调器的第1个终端地址 = 0x0000+21×3+1 = 64 = 0x0040、第2个就是0x0041。由此可见所有同一父亲的终端设备的短地址都是连续的。

     

    不难看出一旦Lm、Cm、Rm这3个值确定了,整个网络设备的地址也就确定下来。所以知道了某个设备的短地址就可以计算出它的设备类型和它的父设备地址。

     

     

     

     

     

    参考文献:《ZIGBEE SPECIFICATION》370页

    展开全文
  • RFC1918私有网络地址分配

    万次阅读 2018-06-24 11:44:23
    RFC 1918私有网络地址分配 (Address Allocation for Private Internets) RFC 1918介绍在本文档中,企业表示一个自治地操作一个使用TCP/IP协议网络的实体,特别地,该实体要决定该网络的寻址方案和地址分配。...

    RFC 1918私有网络地址分配 (Address Allocation for Private Internets)

     

    RFC 1918介绍


    在本文档中,企业表示一个自治地操作一个使用TCP/IP协议网络的实体,特别地,该实体要决定该网络的寻址方案和地址分配。

    该文档描述了私有网络的地址分配。该分配允许一个企业内的所有主机之间以及不同企业内的所有公开主机之间在网络所有层次上的连接。

     

    RFC 1918动力,目的


    随着TCP/IP技术在包括Internet网本身以外的世界范围内的扩散,越来越多没有连接到Internet网络上的企业使用该技术。这些企业只是使用该技术的寻址能力用于企业内部通信,而没有打算与其他企业或是Internet网络直接相连

    Internet网络的发展出乎任何人的预料。持续的指数级增长不断引起新的挑战。其中一个挑战是来自Internet社区内部的关注:全球唯一的地址空间将被耗尽。一个与此不同,且更为迫切的关注是: 路由负荷的数量将超过ISP(Internet Service Provider)的能力。社区内正在努力试图找到一个关于这些问题的长期解决方案。同时,有必要再次探讨地址分配过程及其对Internet路由系统造成的影响。

    为容纳路由负荷的增长,一个Internet服务提供商从地址注册组织获得一个地址块,然后根据每个客户的要求将块内的地址分配给客户。这个过程造成的结果是:到许多客户的路由将会被聚合起来,对其他服务提供商呈现为一个单一的路由。为了让路由聚合有效,Internet服务提供商鼓励加入其网络的客户使用提供商的地址块,然后重新为其计算机设定地址。这样的鼓励也许在将来会成为一种要求。

    考虑当前Internet的大小以及它的增长速度,通过从地址注册组织获得全球唯一的IP地址,某个组织一旦连接到Internet网络上,该组织就具有Internet 范围内的 IP 连接,这样的假设不再现实。相反,很可能是这样:当一个组织想要连接到Internet上以获得Internet范围内的IP连接,该组织需要对它所有的公开主机(需要Internet范围IP连接的主机)进行地址转换(renumber),而不管该组织原先使用的地址是否是全局唯一的。

    典型地,一般所有使用TCP/IP协议的所有主机都被分配一个全局唯一地址。为了延长IPv4地址空间的生命周期,地址注册请求审查将比任何以往时候都更为严格,使得申请更多地址空间难度增大。

    在企业内部使用IP的主机可以分为三类:

    第一类:企业内的主机不需要访问其他企业内的主机或Internet;这类主机可以使用企业内没有多义的但在企业之间可能会有多义的IP地址。

    第二类:主机需要访问外部有限的服务(例如 E-mail, FTP,网络新闻,远程登陆等),这些服务可由中介网关来处理(例如应用层网关)。对于这类中的许多主机而言,不受限制的外部访问(通过IP连接)也许是不必要的,从安全角度考虑,也是不合适的。正如第一类主机那样,该类主机可使用在企业内部无多义而在企业之间可能有多义的IP地址。

    第三类: 主机需要企业外部网络层的访问(假设在通过IP连接的方式下);这最后一类主机需要全局无多义的IP地址。

    我们将第一、第二类中的主机称作“私有的”,将第三类主机称作“公开的”。

    对于大多数内部主机,许多应用只要求企业内部的连接,而不需要与企业外的连接。在比较大的企业,很容易识别出一大堆使用TCP/IP协议但是不需要与外部企业建立网络层连接的主机。

    下面是一些例子,这些例子中外部连接可能不需要。

    ------一个大型机场,通过TCP/IP网络来显示不同航班的到达和离开。很显然,这些显示不必被其他网络直接访问到。

    ------大型机构,如银行,连锁店正转向使用TCP/IP 来构建其内部通信。大量的本地工作站,如 收银机, 取钱机和在办公室的设备很少需要与外部的连接。

    ------处于安全考虑,许多企业使用应用层网关来将内部网络与外部网络连通。内部网络通常不能直接访问Internet,这样仅有一个或更多个网关在Internet上是可见的。在这种情况下,内部网络可以使用非唯一的IP地址。

    ------内部网络的路由器接口通常不必被外部企业直接访问。

     

    RFC 1918私有地址空间


    因特网域名分配组织IANA组织(Internet Assigned Numbers Authority)保留了以下三个IP地址块用于私有网络。

    10.0.0.0 - 10.255.255.255 (10/8比特前缀)

    172.16.0.0 - 172.31.255.255 (172.16/12比特前缀)

    192.168.0.0 - 192.168.255.255 (192.168/16比特前缀)

    我们把第一块称为“24-比特块”,第二块称为“20-比特块”,第三块称为“16-比特块”注意(在前面的CIDR 记号中),第一块地址就是一个A类网络号,第二块地址是16个连续的B类网络号集合,第三块地址是256个连续的C类网络号集合。

    一个决定使用该文档中定义的IP地址空间的企业不需要与IANA组织或Internet 地址注册组织进行协商。这样,该地址空间可以被许多企业使用。私有地址空间中的地址仅在一个企业内部或在一组选择在该空间协同通信的企业内部保证唯一,这样他们可以在自己拥有的私有网络内部实现通信。

    以前,任意一个需要使用全局唯一地址的企业必须向Internet注册机构提出申请。上述定义的私有地址空间中的地址块将不会被Internet注册机构分配给一个申请用于外部连接的IP地址的企业。

    要使用私有地址,企业要决定在可预见的时期内哪些主机不需要与外部建立网络层连接,从而将这些主机归类为“私有的”。这类主机将使用上述定义的私有地址。私有主机能与企业内的所有其他主机通信,包括“公开的”和“私有的”的主机。但它们和企业外部的任何主机都没有IP 连接。尽管如此,它们仍然能通过中介网关(如应用层网关)访问外部服务。

    其他的主机将被归类为“公开的”,这些公开主机必须使用由Internet注册机构分配的全局唯一的地址空间。公开主机可以与企业内部的其他公开主机和私有主机通信,它们可以具有与企业外部公开主机之间的IP连接。公开主机与其他企业内部的私有主机之间没有连接。

    将私有主机转为公开主机或是相反的操作涉及到IP地址的转换,DNS中相关记录的改变和在其他主机上用IP地址来标志该主机的配置文件的改变。

    因为私有地址没有全局意义,因此在企业之间的链路上没有必要传播私有网络的路由信息。源或目的地址为私有地址的包也不应该在这样的链路上被转发。网络中不使用私有地址的路由器,尤其是那些属于ISP的路由器,期望被设置为拒绝(过滤)关于私有地址的路由信息。如果一个路由器接收到这样的信息,拒绝操作不应该被视为路由协议错误。

    对于这样的地址的非直接参考应该被包含在企业内部。关于这样的参考,一个突出的例子是DNS中的 Resource 记录(Resource records) 和其他有关内部私有地址的信息。特别的(In particular),ISP应该采取措施防止这样的泄露。

     

    RFC 1918使用私有地址空间的利弊


    普遍地,对于Internet来说,使用私有地址空间一个明显的好处就是在不必要使用全局地址的地方使用私有地址,从而保存了全局唯一地址空间。

    企业同样从使用私有地址空间中获益不菲: 具有比使用全局唯一地址池时有更多的地址空间支配权使得他们在进行网络设计时有很大的灵活性。这使得操作和管理地址分配方案及扩展路径更为容易和便利。

    由于各方面的原因,Internet上已经遇到这样的情形:没有连接到Internet上的某个企业使用了不是IANA分配的地址空间。在某些情况下,这个地址空间已经被分配给了其他企业。如果这样一个企业以后要连接到Inernet上,这将产生很多严重的问题,因为IP路由在地址具有多义性的时候不能进行正常的操作。尽管在理论上,ISP应该通过路由过滤防备此类错误,但实际上往往不会这样做。使用私有地址空间为这样的企业提供了一种安全的选择,能够在企业需要连接到Internet的时候避免产生冲突。

    使用私有地址空间的一个主要缺陷是,它也许实际上减少了企业访问Internet的灵活性。一旦一个企业决定使用私有地址,为了能让部分主机具有与Internet之间IP连接的能力,他也要承担部分主机地址转换的任务。通常地址转换的代价可以用需要从私有地址转换为公开地址的主机数目来衡量。正如我们上面讨论的那样,即使一个网络使用的是全局唯一地址,为了获得Internet范围的IP地址的连接能力,它也可能仍然需要进行地址转换。

    使用私有地址空间的另一个缺陷是:将几个私有网络合并成一个私有网络时,它也可能需要进行地址转换。回顾第二部分列出的例子,我们注意到公司有合并的趋势。如果这些企业在合并前各自使用私有地址构造自己的私有网络,当这些私有网络合并成一个私有网络时,合并后的私有网络地址不一定唯一。结果是,具有不唯一地址的主机需要重新分配地址。

    地址转换的代价可以通过开发和便于转换的开发工具来减轻(例如 DHCP).当决定是否要采用私有地址时,我们建议咨询计算机和软件厂商是否能获得这类相应的工具。 一个单独的IETF 组织正在致力于完成描述地址转换过程和要求的所有文档。

     

    RFC 1918操作考虑

    一种可能的策略是先设计网络中的私有部分,给所有内部链接分配私有地址空间。然后在需要的位置安排公开子网,设计外部连接。

    这种设计不必是永久固定的。如果以后一组主机(一台或多台)要求改变它们的地位(从私有到公开,或是相反),通过转换涉及到的主机的地址,在必要的时候改变其物理连接即可完成。如果需要,在某些事先可以预见的位置,建议为公开子网和私有子网配置不同的物理介质,从而方便这样的改变。为了避免主要的网络破坏,建议将主机按照相似的物理连接要求分组,放置在不同的子网内。

    如果能设计一个合适的子网方案,并且该方案能够得到相关设备的支持,建议使用24-比特块私有地址空间(A类网络),采用便于扩展的制作寻址方案。如果使用子网是个问题,那么可以采用16-比特(C类网络)或20-比特(B类网络)地址块。

    有人可能被怂恿为同一物理介质同时分配公开的和私有的地址。如果这是可能的话,这种设计存在着不可知的危险。(注意,这种危险和使用私有地址空间无关,而是由于在一个普通数字链路子网上多个IP子网的存在引起的)。我们建议在处理该领域时要特别注意。

    强烈建议连接企业到外部网络的路由器在链路的两端安装合适的包和路由过滤,以便防止包和路由信息的泄露。一个企业应该从入站的路由信息中过滤掉任何私有网络,从而保护它自己不陷入路由歧义的境遇,这种境遇在如果到私有网络地址空间的路由指向了企业外部时会发生。

    有这样的可能,两个站点,协作使用私有地址空间,通过一个公开网络彼此通信。为了这样做,他们必须使用一些方法,在公开网络边界上进行封装,从而保持他们的私有地址的私有性。

    如果两个(或更多个)组织遵循本文规定的地址分配方案,以后希望建立彼此之间的IP连接时,这时就会有地址唯一性被打破的危险。为减小这样的冒险,强烈建议使用私有IP地址的组织在为其内部分配子块时,随机地从保留的私有地址池中选取IP地址。

    如果一个企业使用私有地址空间,或混合使用私有地址和公开地址空间,企业外部的DNS客户端不应该看到企业使用的私有地址,因为这些地址将会是多义的。一个确保此实现的方法是为每个既包含使用公开地址的主机,又包含使用私有地址的主机的DNS域运行两个权威服务器。一个服务器对公开地址空间可见,它仅包含企业地址中公开地址能访问到的子网。另一个服务器仅能被私有网络访问,它包含所有的数据集合,包括私有地址和能访问私有网络的公开地址。为了保证一致性,每个服务器应该用相同的数据来配置,配置中,公开可见域仅包含一个过滤后的版本。提供这些功能在一定程度上有附加的复杂性

     

    RFC 1918安全考虑

    安全主题在本备忘录中不讨论。

     

    RFC 1918总结

    使用上述方案,许多大型企业只需要全局IP地址空间中相对较少的地址块。Internet从保存全局唯一地址空间获得好处,这将有效地延长IP地址空间的生命周期。通过提供一个相对较大的私有地址空间,企业从增加的灵活性中得到好处。但是,企业网络连接性随时间发生变化时,使用私有地址要求一个组织为企业网络中的部分或所有主机转换地址。

    展开全文
  • 闲谈IPv6-说说IPv6地址分配和BGP

    千次阅读 2019-03-16 08:01:40
    曾经IANA总管全球的IPv4地址分配,但后来的事实表明,它做的并不是很好。互联网这么开放的组织,统一的规则存在是合理的,但大一统的机构监管,确实别扭。 后来地址分配和管理这件事就逐渐被一些非营利性公司或者...

    曾经IANA总管全球的IPv4地址分配策略,但后来的事实表明,按照最初的IPv4分配策略,它做的并不是很好。互联网这么开放的组织,统一的规则存在是合理的,但大一统的机构监管,确实别扭。

    后来地址分配和管理这件事就逐渐被一些非营利性公司或者组织接管,比如最大的ICANN,开始行使IANA的职能。

    不仅仅是为了防止IPv6地址的浪费,更多的是为了提供聚合性以减轻路由器的负担。目前IPv6的地址空间的管理是严格按规定的层次结构在全局全球范围内分配的。

    下面以IANA保留地址段为例,看它如何按照层级分配,它可以在这段地址行使它的分配管理权限,这段地址为:
    2001::/16
    IANA不能再像最初管理IPv4地址时那样管理这段IPv6地址了,它必须同样遵守规则,按照层次聚合分配地址,层次如下:

    • IANA(固定的0x2001开头)
    • 区域注册机构RIR
    • 国家注册机构NIR-ISP/本地注册机构LIR
    • 最终用户或ISP的层次结构

    这非常类似我们的身份证,也比较类似我们的银行卡。

    在这种分配策略下,当有下层机构需要IPv6地址块时,上层注册机构将地址按块状划分给下层注册机构进行分配与管理,就像一个卖切糕的组织一样。同级别注册机构不能随意交换和分配地址,如果注册机构A希望获取一段新的地址空间,它不能从同级别的B获取,它必须把需求告诉它的上级注册机构,由上级机构统一统筹分配。

    更重要的是,一个注册机构不能指定需要哪段地址空间,它只能提出它需要多少地址,不然,这不就又落回了IPv4那种在地址空间随意挖洞的局面了吗。


    进入IPv6时代,事情变得更加简单而不是更加复杂了。

    使用IPv6,我甚至感觉IBGP不再需要了。要理解这个,我们先看看为什么需要IBGP。

    我理解的BGP是 路由的路由 , 更严格的说是 路由集合的路由 。这没有任何问题,在BGP看来,nn条路由其实就是一跳可达,它实际上实在说 到达网段1,网段2,网段3,…网段n全部可以交给EBGP对端路由器R1 ,在BGP眼里,nn个网段其实就是 一条路由!

    但是,如果把这nn条路由注入到IGP,比如被OSPF学到会怎样?

    完蛋,这一下子OSPF就要学习nn条路由项啊!nn越大,OSPF路由器的学习成本越高,随着nn的增加,直到路由器死机!死机的原因是,运行OSPF协议需要大量的收发控制报文,全网洪泛报文,以及需要大量的CPU资源处理这些报文。

    那么怎么办?

    IBGP来解决!

    IBGP实际上是将BGP路由进行了预处理,只在同一个AS内运行BGP协议的路由器之间相互交换路由信息,然后算出最优路径后,以 默认路由 或者 汇聚路由 的形式注入IGP。我们知道,宇宙中最猛的汇聚路由就是默认路由了!它只有一条!这将大大减轻AS内路由器控制平面的压力,减少路由抖动,收敛更快,数据平面更加稳定。

    所以一般的运营商AS不接受前缀长度大于19的路由通告,对于我国的特殊国情,这个数字目前上升到了24!毕竟嘛,地址空间挖洞越厉害,这个数字就越大,如果可以随意分配独立的IP地址,那么这个数字就是32,这意味着理论上一台路由器上将会有43亿条的路由表项…

    没错,就是43亿条!

    经过测试的权威表明,目前的路由器处理50万条路由就开始吃力…路由查找算法将会消耗大量的CPU,产生大量的延迟!最终的效果就是,网速 慢,慢,慢!

    这一切,都是地址空间挖洞造成的!但是我国国情嘛,网速慢一点没有关系,大家习惯了的。


    IPv4地址我没有亲测过,我也不知道,但是手机号码我是测试过的。我想运营商在管理IPv4地址时和管理手机号码时是一个套路吧。

    我的手机号码133168XXXXX,这是我在深圳注册登记的,以往如果你打我的手机或者我打你的手机,显示的我的电话号码都是广东深圳的号码,后来我搬到了杭州,为了减少麻烦,我不准备换手机号码,我想大不了就是每个月多交一笔钱呗,像什么漫游费啥的。然而运营商可以提供 异地迁移服务 ,现在,你再打我电话或是接我的电话,显示的我的号码所在地就是浙江杭州了。是不是有点意思呢。


    IPv6严格按照层次化分配地址,如果AS和地址注册机构是对应的,这就意味着最终每一个AS理论上只需要通告一条路由即可,它可以毫无压力地注入到IGP!IBGP还需要吗?

    路由器表项更少,查找路由的时间更短,造成的延迟更低,所以说,IPv6减少了延迟,它虽然无法提高光速,但是它可以减少处理。


    浙江温州皮鞋湿,下雨进水不会胖。

    展开全文
  • C++内存地址分配和内存区划分简介

    千次阅读 2018-02-07 11:58:49
    C++内存地址分配和内存区划分简介 原文地址:http://blog.csdn.net/liuhuiyi/article/details/7530137 内存类型简介 内核:在一些系统中,当系统调用发生时,操作系统或者操作系统内核会编程应用程序内存的一...

    C++内存地址分配和内存区划分简介

    原文地址:http://blog.csdn.net/liuhuiyi/article/details/7530137

    内存类型简介

    这里写图片描述
    内核:在一些系统中,当系统调用发生时,操作系统或者操作系统内核会编程应用程序内存的一部分。
    栈:栈中包含活动记录,其中包含当前活动函数调用的返回地址和局部变量等信息。
    共享库:为了动态链接共享库文件而创建的一个内存片段
    堆内存:被用作堆内存来使用和分配的一块内存空间。如果运行时需要一些可变大小的小内存块,那么这些内存就是从这个区域中分配的
    未初始化的数据: 没有初始化的全局变量被放在固定地址中。通常,这段区域都会被初始化为0。
    初始化的数据: 任何被赋予了初始值的数据都被组织在内存中的一段连续的区域内,因此他们就能够与程序页一同被有效地载入
    程序页:构成应用程序的机器代码指令就是程序页。当有硬件支持时,程序页通常是只读的,这样就可以防止程序意外的重写其自身指令区域。
    第0页:通常,一个以地址0为开始的内存片段会被保留下来被设置为不可读区域,他可以用来捕捉一种常见的错误,这种错误就是使用一个NULL指针访问数据。

    第一部分 C++内存地址分配简介

    1 内存地址是从高地址到低地址进行分配的:

    int i=1;  
    int j=1;  
    cout<<&i<<endl<<&j<<endl;   //输出:0012FF60(高地址处) 0012FF54(低地址处)  

    2 函数参数列表的存放方式是,先对最右边的形参分配地址,后对最左边的形参分配地址。

    3 Little-endian模式的CPU对操作数的存放方式是从低字节到高字节的

    0x1234的存放方式入下:

    0X4000 0x34

    0X4001 0x12

    4 Big-endian模式的CPU对操作数的存放方式是从高字节到低字节的

    0x1234的存放方式入下:

    0x4000 0x12

    0x4001 0x34

    (关于这两种模式的更多解释:https://www.cnblogs.com/passingcloudss/archive/2011/05/03/2035273.html

    5 联合体union的存放顺序是所有成员都从低地址开始存放。

    6 一个变量的地址是由它所占内存空间中的最低位地址表示的。

    0X4000 0x34

    0X4001 0x12

    0x1234 的地址位0x4000

    7 堆栈的分配方式是从高内存地址向低内存地址分配的。

    int ivar=0;

    int iarray[2]={11, 22};

    注意iarray[2]越界使用,比如对其赋值

    iarray[2]=0;

    那么则同时对ivar赋值为0,可能产生死循环,因为它们的地址相同,即&ivar等于&iarray[2]。

    第二部分 C/C++内存区划分

    一 在C中分为这几个存储区
    1.栈 由编译器自动分配释放;
    2.堆 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收;
    3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束释放;
    4.另外还有一个专门放常量的地方。 程序结束释放。

    在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的”adgfdf”这样的字符串存放在常量区。比如:

    int  a = 0; //全局初始化区  
    char *p1; //全局未初始化区  
    void main()  
    {       
    int b;                   //栈       
    char s[] = "abc"; //栈       
    char *p2;         //栈       
    char *p3 = "123456";       //123456{post.content}在常量区,p3在栈上       
    static int c = 0;          //全局(静态)初始化区       
    p1 = (char *)malloc(10);   //分配得来得10字节的区域在堆区       
    p2 = (char *)malloc(20);   //分配得来得20字节的区域在堆区       
    strcpy(p1, "123456");      
    //123456{post.content}放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块  
    }  

    二.在C++中,内存分成5个区

    他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区
    1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
    2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
    3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
    4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
    5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)。
    在bbs上,堆与栈的区分问题,似乎是一个永恒的话题。   
    首先,我们举一个例子:

    void f() 
    {
        int* p=new int[5];
    } 

    这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?它分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。

    在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下:

    00401028 push 14h 
    0040102A call operator new (00401060) 
    0040102F add esp,4 
    00401032 mov dword ptr [ebp-8],eax `这里写代码片`
    00401035 mov eax,dword ptr [ebp-8] 
    00401038 mov dword ptr [ebp-4],eax 

      这里,我们为了简单并没有释放内存,那么该怎么去释放呢?是delete p么?错了,应该是delete []p,这是为了告诉编译器:我删除的是一个数组,VC6就会根据相应的Cookie信息去进行释放内存的工作。

      好了,我们回到我们的主题:堆和栈究竟有什么区别?

      主要的区别由以下几点:

      1、管理方式不同;

      2、空间大小不同;

      3、能否产生碎片不同;

      4、生长方向不同;

      5、分配方式不同;

      6、分配效率不同;

      管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。

      空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:

      打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。

      注意:Reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。

      碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在它弹出之前,在它上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。

      生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。

      分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进行释放,不需要我们手工实现。

      分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高(我的注释:关于EBP寄存器请参考另一篇文章)。

        堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法
        (具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间
        (可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,
        然后进行返回。显然,堆的效率比栈要低得多。
    

      从这里我们可以看到,堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。

      虽然栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。

      无论是堆还是栈,都要防止越界现象的发生(除非你是故意使其越界),因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生意想不到的结果,就算是在你的程序运行过程中,没有发生上面的问题,你还是要小心,说不定什么时候就崩掉,那时候debug可是相当困难的:)

    展开全文
  • DHCP静态地址分配和ARP绑定的理解

    千次阅读 2016-05-27 23:38:47
    DHCP静态地址分配 某IP地址只能被指定的设备(mac地址)使用 设A是一个IP地址,a是一台设备。使用DHCP静态地址分配将A分配给a。 那么IP地址A只能被设备a使用,但是a也可以使用其他IP地址。 如果设备a使用了其他IP...
  • C++ 给指定地址分配内存并赋值

    千次阅读 2019-06-11 09:47:30
    最近涉及到一个问题,已知PVOID指针指向的地址,目的是对这个地址分配内存并赋值,涉及到指针的分配内存和指针移动的操作,具体代码如下: #include <iostream> #include <new> #include <Windows....
  • zigbee协议解析:地址分配机制

    千次阅读 2013-08-07 09:00:59
    zigbee协议解析:地址分配机制 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: zigbee协议版本:2007 说明: 在zigbee网络中,每个父节点都有一片地址可以用来分配. 不同深度...
  • 最近在看书的时候发现程序内存栈是从高地址往低地址分配内存的,而其它的内存地址是从低到高分配内存。 首先,因为栈设计为后进先出的特性(栈需要存储函数中的局部变量和参数,函数又是最后调用的最先销毁,...
  • 虚拟机两台PC实现DHCP地址分配

    千次阅读 2019-02-08 11:28:06
    虚拟机两台PC实现DHCP地址分配 首先在虚拟机里面准备两台PC,一台Windows server 2008 R2(或者其它)作为服务端,一台Windows 7(或者其它)作为客户端 将两台PC的网络适配器都设置为仅主机模式,并且让两台PC都...
  • IP地址分配原理

    千次阅读 2018-09-16 20:43:55
    IP地址就是给英特网上的每个主机(路由器)的每个接口分配一个在全世界范围内是唯一的32位的标识符,每8位用等效十进制表示。其组成第一个字段是网络号,第二个字段是主机号。一个主机号在前面的网络号所指明的网络...
  • IPv6单播地址分配指南

    千次阅读 2013-09-17 14:07:50
    IPv6单播地址分配指南             http://www.media.edu.cn 中国教育网络 作者:陈茂科   地址规划是任何IP通信基础设置的基本方面。由于新的地址体系结构和新...
  • 计算机网络IP地址分配

    千次阅读 2018-09-10 00:13:22
    一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。 利用子网掩码可将大的网络分成几个小的网络。 IPv4地址分为A,B,C,D,E类:(根据子网掩码的网段可以判断 缺省掩码的个数...
  • Zigbee地址分配(二)

    千次阅读 2013-04-18 21:41:24
    ZigBee2006和 ZigBee 2007使用分布式寻址方案来分配网络地址。这个方案保证在整个网络中所有分配的地址是...不需要整个网络范围内通讯的地址分配,这有助于网络的可测量性。 假设父设备可拥有的最大子设备数为Cm,其拥
  • 计算机组成原理——主存中存储单元地址分配理解

    千次阅读 多人点赞 2020-03-11 17:33:47
    主存中存储单元地址分配深度理解例子一例子二总结 题记:复杂的问题事实上都很简单 例子一 假设说我们有一个16KB的存储器,那么他按字节、字、双字编址的寻址范围究竟是多少呢? 我们可以这么来理解。 存储器的...
  • 汇川PLC AM600系统变量内存及变量寄存器地址分配
  • ZYNQ地址分配问题

    千次阅读 2018-05-25 00:06:00
    首先给出一篇很好的文章:Zynq构建SoC系统深度学习笔记-05-PL读写DDR3http://www.eefocus.com/antaur/blog/17-08/423773_0818c.html这个博主的...一、SoC地址空间分配(查看UG585)在UG585的第4章第1节给出了ZYNQ的地...
  • 字扩展芯片的地址分配 字扩展的连接方式: ① 将所有芯片的地址线、数据线、读/写控制线并联。 ② 由片选信号区分被选芯片。各芯片的片选信号分别接到存储器高位地址译码器的输出端的相应位上。 用16K×8位的芯片...
  • the Difference Between Stateful ...关键字:IPv6 IPv4 IP DHCP DHCPv6 autoconf IPv6地址 自动分配 自动配置 有状态 无状态 stateful stateless Well, instead of me just jumping right into explaining the differ
  • DHCP地址分配方式及工作原理

    千次阅读 2010-11-09 13:16:00
    DHCP地址分配方式及工作原理地址分配方式Manual Allocation  网络管理员为某些少数特定的Host绑定固定IP地址,且地址不会过期 Automatic Allocation  自动分配,其情形是:一旦 DHCP 客户端第一次成功的从 DHCP...
  • 内存地址分配规则

    千次阅读 2014-05-13 09:56:20
    1 内存地址是从高地址到低地址进行分配的: -------------------------------------------------------------------------------- int i=1; int j=1; cout ------------------------------------------...
  • 运营商网络IP地址分配原则

    千次阅读 2019-09-25 15:52:26
    相关文章:你的宽带被运营商偷偷分配了内网IP怎么办?! 不过也可能有人不知道自己到底是不是被分配到了内网IP,我还给大家准备了一个查询 方法: 1、进入IP138网站查询你的IP地址(进入后自动检测,无需操作)...
  • I/O端口地址分配

    万次阅读 2012-03-09 15:21:12
    (转)http://hi.baidu.com/i_coolboy/blog/item/98e9f190cdad8b80a877a4c1.html I/O端口地址分配表 2010年08月17日 星期二 16:25 端口地址范围 分配说明 0x000-0x01f 8237
  • 关于Ip地址分配规则(IPV4)

    千次阅读 2011-03-06 16:38:47
    关于Ip地址分配规则(IPV4) 目前广泛使用的IPV4中,IP地址分配和使用的规则,介绍的文章很多,但于细处有些出入,现查询一些资料后整理如下。 1 IP地址的种类    32比特的IP地址划分为两个部分:一...
  • FANUC机器人的IO地址分配详解

    千次阅读 2020-09-11 09:01:57
    FANUC机器人的I/O分配 FANUC机器人的IO分为通用型IO(即用户可以自由定义功能而使用)和专用型IO(功能或用途已经确定)。通用型IO包括:DI/DO、GI/GO、AI/AO;专用型IO分为UI/UO、SI/SO、RI/RO。 本次主要和大家...
  • ZigBee使用分布式寻址方案来分配网络地址。这个方案保证在整个网络中...不需要整个网络范围内通讯的地址分配,这有助于网络的可测量性。  在每个路由加入网络之前,寻址方案需要知道和配置一些参数。这些参数是MA
  • 1、地址分配(27根线如何寻找1G空间) S3C2440集成了丰富了外设控制器(LCD控制器、USB Device控制器、USB Host控制器、NAND FLASH控制器、I2C控制器、SPI控制器等)。要控制这些外设就要设置相应控制器的寄存器以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,068,137
精华内容 427,254
关键字:

地址分配