我們知道thread
有自己的堆棧,它在該進程中實現。但我的問題是,當thread
在他自己的堆棧中實現時,它是由進程或任何其他函數使用的相同堆棧?線程在內存中執行?
還有一個疑問:thread
共享它的全局變量,文件描述符,信號處理程序等等。但是它如何在所有線程執行的地址內共享所有這些參數?
簡要解釋將被讚賞。
我們知道thread
有自己的堆棧,它在該進程中實現。但我的問題是,當thread
在他自己的堆棧中實現時,它是由進程或任何其他函數使用的相同堆棧?線程在內存中執行?
還有一個疑問:thread
共享它的全局變量,文件描述符,信號處理程序等等。但是它如何在所有線程執行的地址內共享所有這些參數?
簡要解釋將被讚賞。
當線程在他自己的堆棧中實現時,它是由進程或任何其他使用相同的堆棧?
不能完全解析這個,但我得到了我認爲的要點。
在大多數情況下,在多線程應用程序的Linux下,所有線程共享相同的地址空間。每個線程(如果它在單獨的處理器上運行)可能具有本地高速緩存內存,但總體地址空間由所有線程共享。即使每個線程的堆棧空間也被所有線程共享 - 只是每個線程都有不同的連續內存區域。
但是它如何在同一地址內共享所有這些參數?
全局變量,文件描述符等也是如此。它們都是共享的。
在Linux下運行的大多數線程實現都使用clone(2)系統調用來創建新的線程進程。從clone man page引用:
clone()以類似於fork(2)的方式創建一個新進程。它實際上是一個在底層clone()系統調用之上分層的庫函數,以下簡稱爲sys_clone。 sys_clone的描述在本頁末尾給出。
與fork(2)不同,這些調用允許子進程與調用進程共享部分執行上下文,如內存空間,文件描述符表和信號處理程序表。
您可以在Linux下使用ps -eLf
來查看克隆進程。
你可以回答這個問題。現在很難解析。 – Gray