2
當一個進程需要動態庫中的函數時,是將整個庫加載到內存中還是隻加載函數?加載和動態鏈接
例如: 當我使用printf()
或任何函數從libc的(假設它是一個動態庫),被加載到內存或只是printf()
單獨功能的整體的libc?
當一個進程需要動態庫中的函數時,是將整個庫加載到內存中還是隻加載函數?加載和動態鏈接
例如: 當我使用printf()
或任何函數從libc的(假設它是一個動態庫),被加載到內存或只是printf()
單獨功能的整體的libc?
是整個庫加載到內存中還是隻是函數單獨加載?
答案取決於您「加載到內存」中的意思,以及您在哪個操作系統上運行程序。
讓我們考慮一下Linux,並且典型地鏈接到libc.so
。
有,含.data
和libc.so.6
.text
整個PT_LOAD
段mmap()
編入程序的第一條指令之前內存甚至執行(因爲你的程序會記錄它需要在其.dynamic
部分libc.so.6
)。
從此,代碼需求調頁當你訪問它。當您撥打printf
時,包含代碼爲printf
的頁面將從磁盤中分頁,或者(更可能)從緩衝區高速緩存中重新使用。
作者:「disk」(「paged in from disk」)u表示內存或交換。 – vanangamudi 2013-05-06 20:28:14
@vanangamudi請使用整個單詞,如「你」而不是「你」。不,通過「磁盤」我的意思是這種磁盤:http://en.wikipedia.org/wiki/Hard_disk_drive_platter – 2013-05-06 22:07:27