堆疊 作業系統(一)

2021-09-14 06:29:56 字數 1146 閱讀 2719

很早就想寫一篇文章,關於作業系統中的堆疊。

說是堆疊,其實就是作業系統如何處理**的,即如何為**中的各種型別的變數、常量、方法體(函式體)等等分配記憶體空間。

了解這些內容,可以幫助我們做一些判斷:

幫助我們在程式出錯時更快找到錯誤地點。

幫助們盡可能利用效率高的方式程式設計。

接下來開始**作業系統中的堆疊。

堆:由程式設計師申請的一片資料區域,並在程式執行完之前由程式設計師手動釋放。類似於鍊錶結構。

棧:由作業系統自動分配的區域,在程式結束後自動**。類似於棧結構。

上面只是給出了簡單的理解,但是很模糊。翻譯一下上面兩句話,就是:行如c/c++中的malloc,new,delete,free這些關鍵字,對這些關鍵字宣告的內容來說,這些內容儲存在堆中;而行如乙個函式中的區域性變數,則是儲存在棧中的。

這就是堆疊中最基礎的東西。

給出一段簡單的**:

#include using namespace std;

void s_swap(int &a, int &b)

int main(); //p2是char型別的,在函式體宣告,也存在棧區

int* p3 = new int[20]; //p3是int*型別的,在函式體中宣告,也儲存在棧區

return 0;

}

看完上面這個**,你可能糊塗了:不是說new出來的是存放在堆中麼?

對!new int[20]這個部分申請的記憶體空間是存放在堆中的,但是p3是個指標變數,它存放在棧中!而這個指標變數指向堆中的申請出來的大小為20b的空間。

當然,還有許多地方沒說明白。比如下面這個程式:

#includeusing namespace std;

int a;

int b = 0;

int main()

我們現在不知道這些型別的資料存放在哪了。因為看似他們不屬於任何乙個分支。static int d是儲存在函式體中的全域性變數。int b也是宣告在函式外的變數。

不過不明白也沒關係,因為他們既不儲存在棧中,也不儲存在堆中。

具體在哪,看這裡:堆疊-作業系統(二)

作業系統(一)

1.01 歷史 1.02 分類 作業系統 桌面作業系統 redhat fedora slackware ubuntu debian suse linux centos 伺服器作業系統 linux ubuntu deepin startos mint debain suse redhat centos...

作業系統(一)

1 單道批處理系統 batch processing system 2 多道批處理系統 multiprogrammed batch processing system 3 分時系統 time sharing system 程序控制 為作業建立程序 撤銷已結束的程序 控制程序狀態轉換。程序同步 為多個...

作業系統(一)

1.設計現代os的主要目標是什麼?方便性 有效性 可擴充性和開放性 2.os的作用可表現在那幾個方面?os作為使用者與計算機硬體系統之間的介面 os作為計算機系統資源的管理者 os 實現了對計算機資源的抽象 3.為什麼說作業系統實現了對計算機資源的抽象?os首先在裸機上覆蓋一層i o裝置管理軟體,由...