2011-05-22 33 views
1

什麼是內存中函數調用?有人可以請我指點一些資源,討論這種技術及其優點。我需要更多地瞭解他們,目前不知道該去哪裏。谷歌似乎沒有幫助,因爲它把我帶到了認知和神經系統等領域。內存中函數調用

+1

你能更好地指定你的意思嗎?你在哪裏讀過這個詞? – sarnold 2011-05-22 23:48:54

+0

盡我所知:如果一個程序或一組程序非常大,在運行時,它們被分配的內存被認爲是按功能分配的。這意味着,對於一組活動的程序,某些功能在內存中(這意味着調用很快),而其他功能則不在內存中,因此調用速度較慢。這個想法是以某種方式只能調用(儘可能)一次在內存中的函數。 – Ketan 2011-05-23 00:31:24

+0

6個問題,沒有被接受的答案? – Joe 2011-05-23 01:58:02

回答

1

假設你的解釋性評論是正確的(我必須看到你的問題的原始來源以確保.. )這可能是(a)函數綁定時間或(b)demand paging的問題。

功能綁定

當一個程序啓動時,連接器/加載器發現不屬於文件中解析可執行文件中的所有函數引用。它搜索所有鏈接庫以查找缺失的函數,然後進行迭代。至少Linux ld.so(8)鏈接器/加載器支持兩種操作模式:LD_BIND_NOW強制所有符號引用在程序啓動時解析。這非常適合查找錯誤,這意味着首次使用函數和重複使用函數沒有任何損失。它可以大大增加應用程序加載時間。如果沒有LD_BIND_NOW,功能將根據需要進行解析。這對於與大型庫鏈接的小程序非常有用,因爲它只能解決所需的少量功能,但對於較大的程序,這可能需要在程序生命週期內從磁盤重新加載庫,而且可以顯着影響影響應用程序運行的響應時間。

按需分頁

現代操作系統內核耍弄更virtual memory物理存儲器。無論機器中安裝的物理內存的實際數量多少,每個應用程序都認爲它可以訪問4 GB內存(對於32位應用程序)或更多內存(對於64位應用程序)的整個機器。每頁內存需要一個備份存儲,如果頁面必須在內存壓力下從物理內存中移出,將用於存儲該頁面的驅動器空間。如果它是純粹的數據,它將被存儲在交換分區交換文件中。如果它是可執行代碼,那麼它將被簡單地刪除,因爲如果它需要是,它可以在未來從文件中重新加載。請注意,這不會在逐個功能的基礎上發生 - 相反,它發生在,這是一個與硬件相關的功能。在大多數32位平臺上考慮4096個字節,或許在其他架構上可能或多或少,並且使用特殊的框架,大於2兆字節或4兆字節。如果缺少頁面的引用,memory management unit將發出page fault的信號,內核將從磁盤加載丟失的頁面並重新啓動進程。

+0

嗨,我很好奇,如果一個可執行文件編寫得不好,它有很多像外部函數(比如.so文件)引用類似函數的死代碼,但只有100個這樣的函數在運行時被實際調用,LD_BIND_NOW = 1會比LD_BIND_NOW沒有設置?因爲過程連接表將包含900個無用的功能地址?在內存佔用和性能的意義上更糟(因爲我不知道查找是否爲O(n))。提前致謝! – Hei 2017-12-19 00:58:37

+0

@Hei,最好問這是一個新問題,以獲得獲得高質量答案的最佳機會。我懷疑這種情況下的LD_BIND_NOW性能與需求綁定相比會非常痛苦,但LD_BIND_NOW的安全性好處可能使得它的價值完全相同。 – sarnold 2018-01-05 00:40:35

+0

謝謝。剛剛開始另一篇文章:https://stackoverflow.com/questions/48109146/ld-bind-now-can-make-the-executable-run-slower – Hei 2018-01-05 07:37:26