2015-08-16 55 views
1

正如我們所知,線程屬於同一進程,爲自己使用相同的共享地址空間同時運行,這是否意味着線程間同時共享內存空間,如果是,那麼該怎麼做?爲什麼我們需要上下文切換,如果他們都能夠同時使用內存空間?多線程相同的地址空間

回答

0

每個線程都有自己的堆棧和可執行文件中的一個地方。

上下文切換是處理器獲取正確的指令,該線程與正確的堆棧和值寄存器

2

爲什麼我們需要上下文切換,如果他們都能夠同時使用 內存空間?

線程上下文切換是關於CPU時間而不是內存映射。想象一下,你有兩個同樣重要的工作者線程爲了兩個線程完成他們的工作,他們必須公平地從調度器接收CPU時間。這就是爲什麼你需要線程上下文切換。事實上,他們在同一進程內工作,使得這個上下文切換比進程上下文切換更輕,但是線程上下文切換是必要的。在線程上下文切換期間,虛擬內存空間保持不變,但IP(指令指針),SP(堆棧指針),通用寄存器等寄存器會因爲其他「執行者」獲取CPU時間而重新加載。

你的問題的其他部分已經在這個堆棧溢出線程中得到了解答。

線程切換和處理開關之間的主要區別是 ,一個線程切換期間,虛擬內存空間保持 相同的,而它的處理切換期間沒有。這兩種類型都涉及 將控制交給操作系統內核執行 上下文切換。切換進出操作系統內核 的過程以及切換寄存器的成本是執行上下文切換的最大的固定成本。

更模糊的成本是上下文切換混淆緩存機制的處理器。基本上,當你進行上下文切換時,處理器在其緩存 中「記住」的所有內存地址實際上變得毫無用處。這裏最重要的一點是當 您更改虛擬內存空間時,處理器的後備緩衝區(TLB)或等效緩衝區會被刷新,因此內存訪問會花費很多時間。這在 期間不會發生線程切換。

thread context switch vs process context switch

+0

謝謝您的回答,但我想澄清一下,如果上下文切換是所有關於CPU的時間,然後線程必須使用它接二連三按照它們的優先級,這表明即使內存空間不能同時使用,因爲我們可能有許多線程同時處於運行狀態,但由於分配給它們的CPU時間,仍然會在別人之前執行。因此,爲什麼我們說線程正在同時運行。 – Manish

+0

我們說線程是同時運行的,因爲它們可以同時運行,但並不是所有線程都一次運行。一個CPU內核可以一次運行一個線程。如果你有一個雙核CPU,那麼兩個線程可以同時運行。所以如果我們有一個帶有三個線程的程序,那麼必須有一個上下文切換來運行第三個線程。 – shf301