跳轉至內容

視覺化計算/記憶體演化圖

來自華夏公益教科書,開放的書籍,開放的世界

記憶體佈局圖記憶體演化圖 描述線性地址空間的內容,可以是某個時間點的快照,也可以是隨時間變化的快照。

歷史和已知用途

[編輯 | 編輯原始碼]

記憶體佈局/演化圖通常用於描述語言系統(編譯器直譯器)。它們經常出現在程式語言概念、計算機硬體或編譯器設計方面的本科課程中,例如在討論 函式呼叫時的棧分配記憶體 或記錄或陣列在記憶體中的資料佈局時。

記憶體佈局圖至少可以追溯到 綠龍書(Aho & Ullman 1977),該書展示了許多用於棧幀佈局的 MLD(在第 10 章中);記憶體演化圖最近被用來說明記憶體的使用和重用,以生成學生在複習講義時可以理解的圖表。

視覺化的內容

[編輯 | 編輯原始碼]

記憶體佈局圖記憶體演化圖 都提供有關計算機記憶體中值組織的資訊,指示每個記憶體單元中包含的值。前者顯示給定時刻記憶體內容的快照;後者顯示內容隨時間的演變。

如下所示,可以說明記憶體的各種不同用途,例如棧幀佈局、資料結構組織、堆(自由儲存)佈局等。

根據需要,圖可以顯示帶標籤但沒有值的抽象佈局,也可以顯示特定程式特定執行的記憶體映像,包括每個記憶體單元中的特定值。風格上的變化包括標籤是在給定記憶體單元旁邊還是在單元中寫入。

視覺化技術

[編輯 | 編輯原始碼]

記憶體佈局圖

[編輯 | 編輯原始碼]

記憶體佈局圖可以簡單地是一組矩形,通常垂直堆疊,每個矩形對應於一個給定的記憶體單元或單元組。根據重點,佈局圖可以顯示所有單元或只顯示部分單元,並且可以顯示每個位元組或每個記憶體字。例如,為了說明使用棧幀來存放函式引數,使用這個示例 C++ 程式來計算一個數的冪

bool even(int i) { // return True iff i is an even number
    return i % 2 == 0;
}

double power(double base, int exp) {
    if (exp == 1)
        return base;
    else if (even(exp)) {
        double base_to_half_exp = power(base, exp/2);
        return base_to_half_exp * base_to_half_exp;
    }
    else
        return base * power(base, exp-1);
}

#include <iostream>

int main() {
    std::cout << power(2, 10) << std::endl;
}

我們可以為每個字畫一個方框(對於雙字畫一個大方框),產生類似於以下的圖表(例如,當我們檢查 4 是否為偶數,以計算 power(2, 10) 時)--- 精心格式化和手繪的影像可能看起來像這樣(手繪影像中可能令人困惑的劃線和擦除是下面記憶體演化圖的動機)

上面的示例顯示了程式特定執行的特定值;綠龍書第 10 章中的圖顯示了相同主題的更抽象檢視。

記憶體佈局圖經常用於討論資料結構在記憶體中佈局的選擇。例如,Scott 的 程式語言實用 第 7.3 章展示了在記憶體中佈局一個與下面幾乎相同的結構的幾種方法(帶有一個示例 MLD,基於每個欄位對齊到字的假設,並且“bool”值將儲存在記憶體的 1 個位元組中)。注意,Scott 的圖比這裡顯示的圖更抽象,因為它們不包含所有欄位的特定值。

                                       
struct element {   // similar to Ex. 7.35 of Scott's "Programming Language Pragmatics" (3rd ed).
  char   name[2];
  int    atomic_number;
  double atomic_weight;
  bool   metallic;
};

struct element aluminum = {{'A', 'l'}, 13, 26.98, true };

記憶體演化圖

[編輯 | 編輯原始碼]

記憶體演化圖是一種系統地捕捉記憶體使用隨時間變化的方法。可以將其視為一系列不同時間點的佈局圖,彼此對齊,例如隨著時間的推移從左到右進行。通常,未更改的很大範圍的值不會被複制,因此當某個單元沒有顯示值時,就會回看左側。將下面的圖表與上面的手繪影像進行對比 --- MED 即使是手繪的,也提供了對發生的事情的更易於理解的影像。(還要注意,這裡的 MED 比上面的 MLD 顯示了更多資訊,因為它包含了幀指標和堆疊指標資訊,以及一個額外的函式呼叫;將這些新增到上面的圖片中會使清晰度上的差異更加明顯。)

華夏公益教科書