【學習筆記】1. 棧的基本知識

1. 什麼是棧

1.1 棧

棧的做用域是進程。
在介紹棧以前,咱們先來看下進程的結構html

clipboard.png

注 : stack 就是進程中的棧區域。函數

1.2 棧的做用範圍

棧是C語言運行的基礎。進程在運行時,能夠不適用堆,可是必須使用棧。學習

棧主要做用於如下幾個方面.spa

  • 函數參數
  • 局部變量
  • 函數返回值
  • 編譯器生產的臨時變量

1.3 棧指針

通常用 FP SP 來指向指針

棧通常是滿減棧,FP 指向棧頂,SP 指向棧底。FP-SP 之間就是整個棧的大小。code

跳轉函數,經過移動FP,SP指針來從新劃分新的棧。視頻

1.4 棧的大小

能夠經過如下命令查詢和設置htm

ulimit -s

ulimit -s size (經過size 來設置,可是調高堆棧容量,會增長內存開銷和啓動時間)

棧的大小通常是8M (8192k)blog

定義一個 8M大小的棧,會溢出進程

clipboard.png

clipboard.png

若是加大棧的空間大小,就能夠正常的運行

clipboard.png

2. 棧在內存中的map

咱們經過查看當前運行進程,查看一下棧的分佈地址

self 是當前進程
cd /proc/self/

cat maps

clipboard.png

3. 棧溢出

如前面所述,在最大棧幀內,棧能夠動態擴展

超過最大值,就會發生棧溢出,產生段錯誤

4. 棧幀

clipboard.png

clipboard.png

棧幀通俗的說,就是棧的範圍。
好比第一個是 main 函數的棧幀區域, 包括 FP 和 LR
還有局部變量 函數參數 臨時存儲區

關於棧幀的使用,我會經過後續的一篇文章,來介紹在函數的調用過程當中,棧幀是如何工做的。

100. 致敬

若有不詳,請參考王老師的精彩講解 堆棧管理
學習過程當中,得到了極大的知足感,把以前的一些東西串聯了起來。十分感謝 王利濤老師
在此表示感謝。
PS:本文中全部的資源和圖片均來自視頻中
另外十分推薦一本書 深刻理解計算機系統

相關文章
相關標籤/搜索