每個(gè)線程有自己?jiǎn)为?dú)的棧嗎 多線程中棧與堆是公有的還是私有的?
多線程中棧與堆是公有的還是私有的?在多線程環(huán)境中,每個(gè)線程都有一個(gè)堆棧和一個(gè)程序計(jì)數(shù)器。堆棧和程序計(jì)數(shù)器用于保存線程的執(zhí)行歷史和線程的執(zhí)行狀態(tài)。它們是線程的私有資源。其他資源(如堆、地址空間、全局變量
多線程中棧與堆是公有的還是私有的?
在多線程環(huán)境中,每個(gè)線程都有一個(gè)堆棧和一個(gè)程序計(jì)數(shù)器。
堆棧和程序計(jì)數(shù)器用于保存線程的執(zhí)行歷史和線程的執(zhí)行狀態(tài)。它們是線程的私有資源。其他資源(如堆、地址空間、全局變量)由同一進(jìn)程中的多個(gè)線程共享。
線程棧和進(jìn)程棧有什么區(qū)別?
要弄清楚線程堆棧和進(jìn)程堆棧的區(qū)別,首先要弄清楚線程和進(jìn)程之間的關(guān)系。線程和進(jìn)程之間有許多相似之處。人們通常稱線程為輕量級(jí)進(jìn)程。這個(gè)所謂的輕量級(jí)進(jìn)程意味著線程沒(méi)有自己的系統(tǒng)資源,線程附加到創(chuàng)建它們的進(jìn)程。我們可以從兩個(gè)方面來(lái)理解線程的輕量級(jí):1。由于進(jìn)程之間的線程共享同一個(gè)進(jìn)程地址空間,進(jìn)程之間的進(jìn)程切換不會(huì)引起進(jìn)程地址空間的切換,從而避免了昂貴的進(jìn)程切換。當(dāng)然,不同進(jìn)程組之間需要進(jìn)行進(jìn)程切換。2有資源的進(jìn)程是操作系統(tǒng)中擁有資源的獨(dú)立單元。創(chuàng)建和取消進(jìn)程時(shí),操作系統(tǒng)會(huì)為進(jìn)程分配和回收資源,包括地址空間、文件、IO、頁(yè)表等。但由于線程附加到進(jìn)程并創(chuàng)建進(jìn)程,因此線程的代碼段、數(shù)據(jù)段、打開(kāi)文件、IO資源、地址空間、頁(yè)表與所有線程共享整個(gè)過(guò)程。從上面我們可以看出,一個(gè)線程沒(méi)有獨(dú)立的地址空間,這意味著屬于同一進(jìn)程的所有線程堆棧都在它們所屬進(jìn)程的地址空間中,并且它們的堆棧地址是不同的。但是,如果在操作期間堆棧交叉,則可能會(huì)破壞其他線程的堆棧空間。實(shí)際上,一個(gè)進(jìn)程可以看作是一個(gè)主線程,它的堆棧與其他線程沒(méi)有什么不同。單個(gè)線程只有一個(gè)堆棧,而多線程為每個(gè)線程分配一個(gè)堆棧,并且這些堆棧的地址不同。這一結(jié)論可以通過(guò)以下方法加以驗(yàn)證。1PsList輸出系統(tǒng)進(jìn)程及其線程,并在我的機(jī)器上獲得以下結(jié)果