五 記憶體和磁碟的親密關係

2022-04-06 11:19:15 字數 3846 閱讀 8529

(1)儲存程式方式指的是什麼?

在儲存裝置中儲存程式,並逐一執行的方式

(2)通過使用記憶體來提高磁碟訪問速度的機制稱為什麼?

磁碟快取

(3)把磁碟的一部分作為假想記憶體來使用的機制稱為什麼?

虛擬記憶體

(4)windows中,在程式執行時,儲存著可以動態載入呼叫的函式和資料的檔案稱為什麼?

動態鏈結庫

(5)在exe程式檔案中,靜態載入函式的方式稱為什麼?

靜態鏈結

(6)在windows計算機中,一般磁碟的1個扇區是多少位元組?

512位元組

程式儲存在儲存裝置中,通過有序地被讀出來實現執行,這一點大家都很清楚。這一機制稱為儲存程式方式(程式內建方式)。

然而,在磁碟中儲存的原始程式是無法直接執行的,因為負責解析和執行程式內容的cpu,需要通過內部程式計數器來指定記憶體位址,然後才能讀出程式。即使cpu可以直接讀出並執行磁碟中儲存的程式,由於磁碟讀取速度慢,程式的執行速度還是會降低。總之,儲存在磁碟中的程式需要讀入到記憶體後才能執行。

磁碟快取指的是把從磁碟中讀出的資料儲存到記憶體空間中的方式。這樣一來,當接下來需要讀取同一資料時,就不用通過實際的磁碟,而是從磁碟快取中把內容讀出。使用磁碟快取可以大大改善磁碟資料的訪問速度。

虛擬記憶體是指把磁碟的一部分作為假想的記憶體來使用。這與磁碟快取是假想的磁碟(實際上是記憶體)相對,虛擬記憶體是假想的記憶體(實際上是磁碟)。

通過借助虛擬記憶體,在記憶體不足時也可以執行程式。例如,在只剩下5mb記憶體空間的情況下也能執行10mb大小的程式。不過,就如本章開頭所講述的那樣,cpu只能執行載入到記憶體中的程式。虛擬記憶體雖說是把磁碟作為記憶體的一部分來使用,但實際上正在執行的程式部分,在這個時間點上是必須存在記憶體中的。也就是說,為了實現虛擬記憶體,就必須把實際記憶體(也稱為物理記憶體)的內容,和磁碟上的虛擬記憶體的內容進行部分置換(swap),並同時執行程式。

虛擬記憶體的方式有分頁式和分段式兩種。windows採用的是分頁式。該方式是指,在不考慮程式構造的情況下,把執行的程式按照一定大小的頁(page)進行分割,並以頁位單位在記憶體和磁碟間進行置換。在分頁式中,我們把磁碟的內容讀出到記憶體稱為page in,把記憶體的內容寫入磁碟稱為page out。一般情況下,windows計算機的頁的大小是4kb。也就是說,把大程式用4kb的頁來進行切分,並以頁為單位放入磁碟(虛擬記憶體)或記憶體中。

許多人可能會認為,通過借助磁碟虛擬記憶體就可以解決記憶體不足的問題。而虛擬記憶體也確實能避免因記憶體不足導致的應用無法啟動。不過,由於使用虛擬記憶體時發生的page in和page out往往伴隨著低速的磁碟訪問,因此在這個過程中,應用的執行會變得遲鈍起來。總的來說,虛擬記憶體無法徹底解決記憶體不足的問題。

為了從根本上解決記憶體不足的問題,需要增加記憶體的容量,或者盡量把執行的應用檔案變小。接下來會向大家介紹兩個把應用檔案變小的程式設計方法。

(1)通過dll檔案實現函式共有

dll(動態鏈結庫),顧名思義就是在程式執行時可以動態載入library(函式和資料的集合)的檔案。此外,還有乙個需要大家注意的地方,那就是多個應用可以共有同乙個dll檔案。而通過共有乙個dll檔案則可以達到節約記憶體的效果。

例如我們編寫了乙個具有某些處理功能的函式myfunc()。應用a和應用b都會使用這個函式,如果將這個函式內建(靜態鏈結),同時執行這兩個應用,記憶體中就存在了具有同一函式的兩個程式。這會導致記憶體的利用率變低。

如果函式myfunc()是獨立的dll檔案而不是應用的執行檔案(exe檔案)。由於同乙個dll檔案的內容在執行時可以被多個應用共有,因此記憶體中存在的函式myfunc()的程式就只有1個,這樣一來,記憶體的利用效率就提高了。

windows的作業系統本身也是多個dll檔案的集合體。dll還有乙個優點就是在不變更exe檔案的情況下,只通過公升級dll檔案就可以更新。

(2)通過呼叫_stdcall來減小程式檔案的大小

c語言中,在呼叫函式後,需要執行棧清理處理指令。棧清理處理是指,把不需要的資料從接收和傳遞函式的引數時使用的記憶體上的棧區域中清理出去。該命令不是程式記述的,而是在程式編譯時由編譯器自動附加到程式中的。編譯器預設將該處理附加在函式呼叫方。

上面**中,函式main()中呼叫了函式myfunc()。按照預設設定,棧的清理處理會附加在函式main()這一方。在同乙個程式中,同樣的函式可能會被多次反覆呼叫。而如果是同樣的函式,棧清理處理的內容也是一樣的。由於該處理是在呼叫函式的一方,因此就會導致同一處理被反覆呼叫。這就造成了記憶體的浪費。

在下圖的組合語言:

在32位cpu中,1次push指令可以儲存4個位元組的資料。在上面的**清單中,由於使用了兩次push指令把兩個引數(456和123)存入到了棧中,因此總的來說就是儲存了8位元組的資料。通過call指令呼叫函式myfunc()後,棧中儲存的資料就不再需要了。於是這時就通過add esp 8這個指令,是儲存著棧資料的esp暫存器前進8位來進行資料清理。

棧清理處理,比起在函式呼叫方進行,在反覆被呼叫的函式一方進行時,程式整體要小一些。這時所使用的就是_stdcall。在函式前加上_stdcall,就可以把棧清理處理變為在被呼叫函式一方進行。

磁碟的物理結構是指磁碟儲存資料的形式。

磁碟是通過把其物理表面劃分成多個空間來使用的。劃分的方式有扇區方式和可變長方式兩種,前者是指將磁碟劃分為固定長度的空間,後者則是指把磁碟劃分為長度可變的空間。一般windows計算機所使用的硬碟和軟盤,採用的都是扇區方式。扇區方式中,把磁碟表面分成若干個同心圓的空間就是磁軌,把磁軌按照固定大小(能儲存的資料長度相同)劃分而成的空間就是扇區。

扇區是對磁碟進行物理讀寫的最小單位。windows中使用的磁碟,一般1個扇區是512位元組。不過,windows在邏輯方面(軟體方面)對磁碟進行讀寫的單位是扇區整數倍簇。根據磁碟容量的不同,1簇可以是512位元組(1簇=1扇區),1kb(1簇=2扇區),2kb,4kb,8kb,16kb,32kb(1簇=64扇區)。磁碟的容量越大,簇的容量也越大。

這是我計算機上c盤的情況  採用的是4kb。不管是硬碟還是軟盤,不同的檔案是不能儲存在同乙個簇中的,否則就會導致只有一方的檔案不能被刪除。因此,不管多麼小的檔案,都會占用1簇的空間。所以說,所有的檔案都會占用1簇的整數倍的磁碟空間。

以簇位單位進行讀寫時,1簇中沒有填滿的區域會保持不被使用的狀態。雖然這看起來有點浪費,不過該機制就是如此規定的,所以我們也沒有什麼好辦法。另外,如果減少簇的容量,磁碟訪問次數就會增加,就會導致讀寫檔案的時間變長。由於在磁碟表面上,表示扇區區分的領域是必要的,因此,如果簇的容量過小,磁碟的整體容量也會減少。扇區和簇的大小,是由處理速度和儲存容量的平衡來決定的。

親密關係的維持

1.認知維持機制 2.行為維持機制 犧牲代價 順應現象 自我控制 寬容要求我們不要心懷怨恨,故而自控讓人更能寬恕 抵制 玩樂 令人興奮和快樂的活動 丹.卡納裡 蘿拉.斯塔福德 關係維持策略 維持策略涉及開放個體戀愛的保證和承諾 可靠的支援以及許多共同的朋友和活動等等這些策略都可能增強親密關係的6個成...

讀《親密關係》的收穫

親密關係 克里斯多福 孟 一 主要內容 本書主要講述在伴侶之間的親密關係的變化,從 月暈現象 到幻滅 內省,最後獲得啟示的過程。在 月暈 階段,我們所看到的皆是對方的美好,隨著時間的推移以及相互了解的加深,我們漸漸進入了幻滅階段,開始產生嫌隙 排斥,甚至憎惡等情緒。而進入內省階段,我們開始審視自己的...

2 7 3 假性親密關係的反思

在上一部分裡,我們 了關於破除親密關係的一些方法與技巧,今天我們通過對假性親密關係的反思,來看一看自己,走進自己的心。一段美好的親密關係,可以療癒乙個人的心靈創傷,成就更好的自己。有人在談了戀愛之後,從幼稚變得成熟了,懂得為他人著想了,但也有人談戀愛後,反而沒有了自己,這是為什麼呢?因為親密關係要向...