內(nèi)存管理,是指軟件運行時對計算機內(nèi)存資源的分配和使用的技術(shù)。其最主要的目的是如何高效,快速的分配,并且在適當(dāng)?shù)臅r候釋放和回收內(nèi)存資源。
一個運行中的程序,譬如網(wǎng)頁瀏覽器在個人電腦或是圖靈機(Turing machine)里面,為一個進程將數(shù)據(jù)轉(zhuǎn)換于真實世界及電腦內(nèi)存之間,然后將數(shù)據(jù)存于電腦內(nèi)存內(nèi)部(在計算機科學(xué),一個程序是一群指令的集合,一個進程是電腦在運行中的程序)。內(nèi)存能被實際組織在許多方法里頭,例如磁帶或是磁盤,或是小數(shù)組容量的微芯片。 從1950年代開始,計算機變的更復(fù)雜,它被連接于許多種類的內(nèi)存。內(nèi)存管理的任務(wù)也變得復(fù)雜,甚至必須要在同一臺機器上相同的時間運行多個進程。
在內(nèi)存內(nèi),一個程序(操作系統(tǒng))在每一個數(shù)據(jù)區(qū)塊持續(xù)地追蹤實體位置,及移動實體上的數(shù)據(jù)去改善其性能及保證可靠性,對于每個用戶層(user-level)的程序,操作系統(tǒng)分配一段虛擬內(nèi)存空間,當(dāng)進程起始時,不需要移動數(shù)據(jù)到實體設(shè)備間,數(shù)據(jù)存于磁盤內(nèi)的虛擬內(nèi)存空間,也不需要去配置主存空間給該進程,當(dāng)用戶有需要用到時,他們才會很自由地加載到主存內(nèi)。
可以想像一個很大的程序,當(dāng)他運行時變成進程,而大部分的內(nèi)存空間都被存到磁盤內(nèi)虛擬內(nèi)存地址,需要用到的部分才被加載到內(nèi)存內(nèi)部提供服務(wù)。
主存使用
一個程序結(jié)構(gòu)由以下兩部分而成:
-
“本文區(qū)塊”,也就是指令存放,提供CPU使用及運行
-
“數(shù)據(jù)區(qū)塊”,存儲程序內(nèi)部本身設(shè)置的數(shù)據(jù),例如常數(shù)字符串,像是GUI接口內(nèi)部一些文字消息,或是程序設(shè)計時所放入的消息數(shù)據(jù),數(shù)據(jù)可借由程序運行時由輸入(input)的方式加入,或者經(jīng)由程序運行的流程中被移除。
當(dāng)一個程序運行,操作系統(tǒng)將程序的數(shù)據(jù)區(qū)塊及本文區(qū)塊映射到虛擬內(nèi)存空間內(nèi)部,然后在內(nèi)存運行程序的指令,無論如何,當(dāng)程序運行時就必須去存儲暫時性的數(shù)據(jù),或更重要的,它會調(diào)用一些函數(shù)(function)或是例程(subroutine),并且存儲當(dāng)前函數(shù)的狀態(tài),最好的數(shù)據(jù)結(jié)構(gòu)方法,數(shù)據(jù)由堆棧(stack)的方式存儲,當(dāng)我們完成這個函數(shù),數(shù)據(jù)會由堆棧的pop方式取出,堆棧將會在函數(shù)的生命周期內(nèi)動態(tài)的成長,操作系統(tǒng)提供區(qū)分本文區(qū)塊及數(shù)據(jù)區(qū)塊,而堆棧區(qū)塊則在一個進程的最頂端,這種方式稱為段式結(jié)構(gòu)(segments)或“分段