內存演算法
『壹』 請把內存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介面抽象、多線程性能、安全性和診斷性等復雜問題。這表明內存分配背後是復雜的指針和鏈表操作,通過實踐這些演算法,我們能更深入地理解這些概念。