看過來

初來乍到者,請參閱這篇「緣起」。它是總索引!

2017年3月30日 星期四

[Rust] Rust 預設堆疊大小

本文討論到 Rust 程式的預設堆疊大小,那這裡的堆疊是指什麼?

Rust 和 C 語言一樣,若是宣告了自動變數(區域變數),那麼區域變數本身的空間必須由堆疊來供應。此外,進行函數呼叫的時候,為了保存返回位置,也需要使用堆疊。

(附帶一提,在 Rust 中,若想要進行動態分配,則必須使用 Box<T>; C 裡面則要使用 malloc。Rust 的 Vec<T> 內部使用了 Box<T>,所以可以達成動態大小。)

所以說,若您的程式需要很大的陣列空間,或者是會進行遞迴呼叫,那您可能會遇到堆疊空間不足的問題。所以了解堆疊空間限制,以及調整的方法就變成了重要的課題。

實務上來說,若能夠在編譯時調整堆疊空間(像是 C 語言),或者最起碼可以在啟動時調整(像是 JVM),則可以不用了解堆疊空間限制在哪裡,不夠的時候直接調整便可。然而,對 Rust 來說,目前似乎仍然沒有可以調整主執行緒(main thread)堆疊大小的方法:
雖然沒辦法調整主執行緒的堆疊大小,但是在 Rust 裡面,我們可以調整新生成執行緒的大小。利用這樣的原則,我們不只可以在發覺主執行緒堆疊不足時迴避此問題,還可以藉著比較已知堆疊大小的新執行緒以及主執行緒會發生堆疊溢滿(Stack overflow)的函數呼叫次數來推得一個系統的預設堆疊大小。

利用上面的概念,千秋設計了一支程式,它可以:
  • 示範如何調整新執行緒的堆疊大小
  • 利用 command-line switch ,您可以選擇測試主執行緒的堆疊大小,或是新生執行緒的堆疊大小,並且可以指定新生執行緒的堆疊大小
此程式所測試的堆疊大小,不是以具體大小來呈現,而是以「可以遞迴呼叫某函數幾次」來呈現。

此程式之程式碼倉庫位在 https://gitlab.com/chiakikame/rust_stack_size

沒有留言:

張貼留言