内存算法
‘壹’ 请把内存GB与MB,KB等有关的,之间的换算
MB、KB之类的是电脑的容量单位
常用的单位换算如下:
1024KB=1MB
1024MB=1GB
1024GB=1TB
更详细的你可以在网络上搜索,不过一般用不上
内存的概念
英文名称:Memory
拼音:nèi cún
【内存简介】
在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存)。
内存是电脑中的主要部件,它是相对于外存而言的。我们平常使用的程序,如Windows98系统、打字软件、游戏软件等,一般都是安装在硬盘等外存上的,但仅此是不能使用其功能的,必须把它们调入内存中运行,才能真正使用其功能,我们平时输入一段文字,或玩一个游戏,其实都是在内存中进行的。通常我们把要永久保存的、大量的数据存储在外存上,而把一些临时的或少量的数据和程序放在内存上。
【内存概述】
内存就是存储程序以及数据的地方,比如当我们在使用WPS处理文稿时,当你在键盘上敲入字符时,它就被存入内存中,当你选择存盘时,内存中的数据才会被存入硬(磁)盘。在进一步理解它之前,还应认识一下它的物理概念。
内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)。只不过因为RAM是其中最重要的存储器。S (SYSNECRONOUS)DRAM 同步动态随机存取存储器:SDRAM为168脚,这是目前PENTIUM及以上机型使用的内存。SDRAM将CPU与RAM通过一个相同的时钟锁在一起,使CPU和RAM能够共享一个时钟周期,以相同的速度同步工作,每一个时钟脉冲的上升沿便开始传递数据,速度比EDO内存提高50%。DDR (DOUBLE DATA RAGE)RAM :SDRAM的更新换代产品,他允许在时钟脉冲的上升沿和下降沿传输数据,这样不需要提高时钟的频率就能加倍提高SDRAM的速度。
●只读存储器(ROM)
ROM表示只读存储器(Read Only Memory),在制造ROM的时候,信息(数据或程序)就被存入并永久保存。这些信息只能读出,一般不能写入,即使机器掉电,这些数据也不会丢失。 ROM一般用于存放计算机的基本程序和数据,如BIOS ROM。其物理外形一般是双列直插式(DIP)的集成块。
●随机存储器(RAM)
随机存储器(Random Access Memory)表示既可以从中读取数据,也可以写入数据。当机器电源关闭时,存于其中的数据就会丢失。我们通常购买或升级的内存条就是用作电脑的内存,内存条(SIMM)就是将RAM集成块集中在一起的一小块电路板,它插在计算机中的内存插槽上,以减少RAM集成块占用的空间。目前市场上常见的内存条有 128M/条、256M/条、512M/条等。
●高速缓冲存储器(Cache)
Cache也是我们经常遇到的概念,它位于CPU与内存之间,是一个读写速度比内存更快的存储器。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中。当CPU再次需要这些数据时,CPU就从高速缓冲存储器读取数据,而不是访问较慢的内存,当然,如需要的数据在Cache中没有, CPU会再去读取内存中的数据。
●物理存储器和地址空间
物理存储器和存储地址空间是两个不同的概念。但是由于这两者有十分密切的关系,而且两者都用B、KB、MB、GB来度量其容量大小,因此容易产生认识上的混淆。初学者弄清这两个不同的概念,有助于进一步认识内存储器和用好内存储器。
物理存储器是指实际存在的具体存储器芯片。如主板上装插的内存条和装载有系统的BIOS的ROM芯片,显示卡上的显示RAM芯片和装载显示BIOS的ROM芯片,以及各种适配卡上的RAM芯片和ROM芯片都是物理存储器。
存储地址空间是指对存储器编码(编码地址)的范围。所谓编码就是对每一个物理存储单元(一个字节)分配一个号码,通常叫作“编址”。分配一个号码给一个存储单元的目的是为了便于找到它,完成数据的读写,这就是所谓的“寻址”(所以,有人也把地址空间称为寻址空间)。
地址空间的大小和物理存储器的大小并不一定相等。举个例子来说明这个问题:某层楼共有17个房间,其编号为801~817。这17个房间是物理的,而其地址空间采用了三位编码,其范围是800~899共100个地址,可见地址空间是大于实际房间数量的。
对于386以上档次的微机,其地址总线为32位,因此地址空间可达232即4GB。但实际上我们所配置的物理存储器通常只有1MB、2MB、4MB、8MB、16MB、32MB等,远小于地址空间所允许的范围。
好了,现在可以解释为什么会产生诸如:常规内存、保留内存、上位内存、高端内存、扩充内存和扩展内存等不同内存类型。
【内存概念】
各种内存概念
这里需要明确的是,我们讨论的不同内存的概念是建立在寻址空间上的。
IBM推出的第一台PC机采用的CPU是8088芯片,它只有20根地址线,也就是说,它的地址空间是1MB。
PC机的设计师将1MB中的低端640KB用作RAM,供DOS及应用程序使用,高端的384KB则保留给ROM、视频适配卡等系统使用。从此,这个界限便被确定了下来并且沿用至今。低端的640KB就被称为常规内存即PC机的基本RAM区。保留内存中的低128KB是显示缓冲区,高64KB是系统 BIOS(基本输入/输出系统)空间,其余192KB空间留用。从对应的物理存储器来看,基本内存区只使用了512KB芯片,占用0000至80000这 512KB地址。显示内存区虽有128KB空间,但对单色显示器(MDA卡)只需4KB就足够了,因此只安装4KB的物理存储器芯片,占用了B0000至 B10000这4KB的空间,如果使用彩色显示器(CGA卡)需要安装16KB的物理存储器,占用B8000至BC000这16KB的空间,可见实际使用的地址范围都小于允许使用的地址空间。
在当时(1980年末至1981年初)这么“大”容量的内存对PC机使用者来说似乎已经足够了,但是随着程序的不断增大,图象和声音的不断丰富,以及能访问更大内存空间的新型CPU相继出现,最初的PC机和MS-DOS设计的局限性变得越来越明显。
●1.什么是扩充内存?
到1984年,即286被普遍接受不久,人们越来越认识到640KB的限制已成为大型程序的障碍,这时,Intel和Lotus,这两家硬、软件的杰出代表,联手制定了一个由硬件和软件相结合的方案,此方法使所有PC机存取640KB以上RAM成为可能。而Microsoft刚推出Windows不久,对内存空间的要求也很高,因此它也及时加入了该行列。
在1985年初,Lotus、Intel和Microsoft三家共同定义了LIM-EMS,即扩充内存规范,通常称EMS为扩充内存。当时,EMS需要一个安装在I/O槽口的内存扩充卡和一个称为EMS的扩充内存管理程序方可使用。但是I/O插槽的地址线只有24位(ISA总线),这对于386以上档次的32位机是不能适应的。所以,现在已很少使用内存扩充卡。现在微机中的扩充内存通常是用软件如DOS中的EMM386把扩展内存模拟或扩充内存来使用。所以,扩充内存和扩展内存的区别并不在于其物理存储器的位置,而在于使用什么方法来读写它。下面将作进一步介绍。
前面已经说过扩充存储器也可以由扩展存储器模拟转换而成。EMS的原理和XMS不同,它采用了页帧方式。页帧是在1MB空间中指定一块64KB空间(通常在保留内存区内,但其物理存储器来自扩展存储器),分为4页,每页16KB。EMS存储器也按16KB分页,每次可交换4页内容,以此方式可访问全部 EMS存储器。符合EMS的驱动程序很多,常用的有EMM386.EXE、QEMM、TurboEMS、386MAX等。DOS和Windows中都提供了EMM386.EXE。
●2.什么是扩展内存?
我们知道,286有24位地址线,它可寻址16MB的地址空间,而386有32位地址线,它可寻址高达4GB的地址空间,为了区别起见,我们把1MB以上的地址空间称为扩展内存XMS(eXtend memory)。
在386以上档次的微机中,有两种存储器工作方式,一种称为实地址方式或实方式,另一种称为保护方式。在实方式下,物理地址仍使用20位,所以最大寻址空间为1MB,以便与8086兼容。保护方式采用32位物理地址,寻址范围可达4GB。DOS系统在实方式下工作,它管理的内存空间仍为1MB,因此它不能直接使用扩展存储器。为此,Lotus、Intel、AST及Microsoft公司建立了MS-DOS下扩展内存的使用标准,即扩展内存规范XMS。我们常在Config.sys文件中看到的Himem.sys就是管理扩展内存的驱动程序。
扩展内存管理规范的出现迟于扩充内存管理规范。
●3.什么是高端内存区?
在实方式下,内存单元的地址可记为:
段地址:段内偏移
通常用十六进制写为XXXX:XXXX。实际的物理地址由段地址左移4位再和段内偏移相加而成。若地址各位均为1时,即为FFFF:FFFF。其实际物理地址为:FFF0+FFFF=10FFEF,约为1088KB(少16字节),这已超过1MB范围进入扩展内存了。这个进入扩展内存的区域约为64KB,是1MB以上空间的第一个64KB。我们把它称为高端内存区HMA(High Memory Area)。HMA的物理存储器是由扩展存储器取得的。因此要使用HMA,必须要有物理的扩展存储器存在。此外HMA的建立和使用还需要XMS驱动程序 HIMEM.SYS的支持,因此只有装入了HIMEM.SYS之后才能使用HMA。
●4.什么是上位内存?
为了解释上位内存的概念,我们还得回过头看看保留内存区。保留内存区是指640KB~1024KB(共384KB)区域。这部分区域在PC诞生之初就明确是保留给系统使用的,用户程序无法插足。但这部分空间并没有充分使用,因此大家都想对剩余的部分打主意,分一块地址空间(注意:是地址空间,而不是物理存储器)来使用。于是就得到了又一块内存区域UMB。
UMB(Upper Memory Blocks)称为上位内存或上位内存块。它是由挤占保留内存中剩余未用的空间而产生的,它的物理存储器仍然取自物理的扩展存储器,它的管理驱动程序是EMS驱动程序。
●5.什么是SHADOW(影子)内存?
对于细心的读者,可能还会发现一个问题:即是对于装有1MB或1MB以上物理存储器的机器,其640KB~1024KB这部分物理存储器如何使用的问题。由于这部分地址空间已分配为系统使用,所以不能再重复使用。为了利用这部分物理存储器,在某些386系统中,提供了一个重定位功能,即把这部分物理存储器的地址重定位为1024KB~1408KB。这样,这部分物理存储器就变成了扩展存储器,当然可以使用了。但这种重定位功能在当今高档机器中不再使用,而把这部分物理存储器保留作为Shadow存储器。Shadow存储器可以占据的地址空间与对应的ROM是相同的。Shadow由RAM组成,其速度大大高于ROM。当把ROM中的内容(各种BIOS程序)装入相同地址的Shadow RAM中,就可以从RAM中访问BIOS,而不必再访问ROM。这样将大大提高系统性能。因此在设置CMOS参数时,应将相应的Shadow区设为允许使用(Enabled)。
●6、什么是奇/偶校验?
奇/偶校验(ECC)是数据传送时采用的一种校正数据错误的一种方式,分为奇校验和偶校验两种。
如果是采用奇校验,在传送每一个字节的时候另外附加一位作为校验位,当实际数据中“1”的个数为偶数的时候,这个校验位就是“1”,否则这个校验位就是 “0”,这样就可以保证传送数据满足奇校验的要求。在接收方收到数据时,将按照奇校验的要求检测数据中“1”的个数,如果是奇数,表示传送正确,否则表示传送错误。
同理偶校验的过程和奇校验的过程一样,只是检测数据中“1”的个数为偶数。
总结
经过上面分析,内存储器的划分可归纳如下:
●基本内存 占据0~640KB地址空间。
●保留内存 占据640KB~1024KB地址空间。分配给显示缓冲存储器、各适配卡上的ROM和系统ROM BIOS,剩余空间可作上位内存UMB。UMB的物理存储器取自物理扩展存储器。此范围的物理RAM可作为Shadow RAM使用。
●上位内存(UMB) 利用保留内存中未分配使用的地址空间建立,其物理存储器由物理扩展存储器取得。UMB由EMS管理,其大小可由EMS驱动程序设定。
●高端内存(HMA) 扩展内存中的第一个64KB区域(1024KB~1088KB)。由HIMEM.SYS建立和管理。
●XMS内存 符合XMS规范管理的扩展内存区。其驱动程序为HIMEM.SYS。
●EMS内存 符合EMS规范管理的扩充内存区。其驱动程序为EMM386.EXE等。
‘贰’ 什么是tlsf内存分配算法 它和普通的内存分配算法有什么区别
深入了解TLSF内存分配算法:实时系统的新选择
在探讨计算机系统的内存管理策略时,一个独特的算法——TLSF(Tiny Low Latency Scheling First Fit)引起了我们的关注。许多人可能对实时系统的定义有所混淆,误以为游戏或游戏引擎就代表了实时系统,实际上,即使在实时渲染中,也并非所有情况都属于严格意义上的实时系统。
TLSF算法的独特之处在于它的常数时间分配特性,这对于那些对响应时间有极高要求的实时系统来说,无疑是个福音。无论内存分配的数量如何,TLSF都能保证在短时间内完成,提供了一个可预期的性能基础。然而,这并不意味着它一定是最快的,实时系统追求的是稳定和可预测性,而非极致速度。相比之下,一般系统可能更注重速度,对响应时间的稳定性要求较低。
值得一提的是,TLSF已经有一个开源实现供开发者使用,由OlegHahm/tlsf项目提供。这个开源项目为开发者们提供了一个实践和优化TLSF内存分配算法的平台,让他们能在自己的实时系统项目中体验到这个算法的优势。
总的来说,TLSF内存分配算法因其在实时系统中对性能可预测性的保障,与普通内存分配算法形成了鲜明的对比。如果你正面临对实时性有高要求的项目,TLSF无疑是一个值得深入研究和考虑的选择。现在,你已经对这个算法有了初步的认识,不妨深入研究它的原理和实现,看看它如何在你的系统中发挥魔力。
‘叁’ 几种常见的内存分配算法
微软新开发的内存分配器mimalloc因其出色性能引起了关注,官方测试显示比tcmalloc快7%,jemalloc快14%,尽管代码量仅有几千行。本文将深入介绍几种常见的内存分配算法,以便更好地理解mimalloc的实现原理。
首先,linear allocator以预先分配内存块的方式运作,分配出去的内存不需释放,仅在结束时回收整块。这种策略适合局部逻辑中大量小对象的场景,能显着提升分配效率。
相比之下,fixed size allocator专门分配和释放固定大小的内存,通过预创建内存块并切割为小块组成freelist。它在现代内存管理器中扮演重要角色,支持不同大小对象的快速创建。
伙伴分配器(buddy allocator)则能分配不同大小的内存,大小需为2的幂。释放内存时,它会合并空闲的伙伴内存,形成更大内存。buddy allocator通过freelist数组和二叉树结构实现,代码和图例结合能帮助理解。
尽管如此,实现通用且高效的内存管理器绝非易事,需要考虑OS接口抽象、多线程性能、安全性和诊断性等复杂问题。这表明内存分配背后是复杂的指针和链表操作,通过实践这些算法,我们能更深入地理解这些概念。