正如我們所知,線程屬於同一進程,爲自己使用相同的共享地址空間同時運行,這是否意味着線程間同時共享內存空間,如果是,那麼該怎麼做?爲什麼我們需要上下文切換,如果他們都能夠同時使用內存空間?多線程相同的地址空間
1
A
回答
0
每個線程都有自己的堆棧和可執行文件中的一個地方。
上下文切換是處理器獲取正確的指令,該線程與正確的堆棧和值寄存器
2
爲什麼我們需要上下文切換,如果他們都能夠同時使用 內存空間?
線程上下文切換是關於CPU時間而不是內存映射。想象一下,你有兩個同樣重要的工作者線程爲了兩個線程完成他們的工作,他們必須公平地從調度器接收CPU時間。這就是爲什麼你需要線程上下文切換。事實上,他們在同一進程內工作,使得這個上下文切換比進程上下文切換更輕,但是線程上下文切換是必要的。在線程上下文切換期間,虛擬內存空間保持不變,但IP(指令指針),SP(堆棧指針),通用寄存器等寄存器會因爲其他「執行者」獲取CPU時間而重新加載。
你的問題的其他部分已經在這個堆棧溢出線程中得到了解答。
線程切換和處理開關之間的主要區別是 ,一個線程切換期間,虛擬內存空間保持 相同的,而它的處理切換期間沒有。這兩種類型都涉及 將控制交給操作系統內核執行 上下文切換。切換進出操作系統內核 的過程以及切換寄存器的成本是執行上下文切換的最大的固定成本。
更模糊的成本是上下文切換混淆緩存機制的處理器。基本上,當你進行上下文切換時,處理器在其緩存 中「記住」的所有內存地址實際上變得毫無用處。這裏最重要的一點是當 您更改虛擬內存空間時,處理器的後備緩衝區(TLB)或等效緩衝區會被刷新,因此內存訪問會花費很多時間。這在 期間不會發生線程切換。
相關問題
- 1. 多線程虛擬地址空間?
- 2. 線程在別人的地址空間
- 3. 多線程Linux進程的地址空間佈局
- 4. 線程返回到壞空間地址
- 5. 「過程映像」和「過程的地址空間」是否是相同的概念?
- 6. 虛擬和物理地址空間是相同的
- 7. 多個設備的相同IP地址?
- 8. 多個網址相同目的地
- 9. 可達性vs地址空間vs地址總線
- 10. 當程序具有相同的虛擬地址空間時,情況如何
- 11. 進程的內存地址空間
- 12. 什麼是進程的地址空間?
- 13. PThreads地址空間
- 14. Linux進程虛擬地址空間的地址範圍
- 15. 虛擬地址系統上的進程地址空間
- 16. 在與Firefox不同的地址空間中運行小程序
- 17. 空間相同
- 18. 線程環境塊如何在地址空間限制之上?
- 19. 多線程,線程間通信,同步
- 20. Linux中的全局或本地線性地址空間?
- 21. ARM linux:進程地址空間
- 22. cudaMalloc在不同的CPU線程上返回相同的內存地址
- 23. 路由表中有兩個地址目的地址相同的線路
- 24. 多線程BlockingCollection相同的值
- 25. 多個線程持有相同的鎖?
- 26. 多線程調用相同的函數
- 27. C++多線程代碼執行在相同的時間單線程
- 28. 系統DLLs地址空間
- 29. Internet Explorer地址空間
- 30. 虛擬地址空間
謝謝您的回答,但我想澄清一下,如果上下文切換是所有關於CPU的時間,然後線程必須使用它接二連三按照它們的優先級,這表明即使內存空間不能同時使用,因爲我們可能有許多線程同時處於運行狀態,但由於分配給它們的CPU時間,仍然會在別人之前執行。因此,爲什麼我們說線程正在同時運行。 – Manish
我們說線程是同時運行的,因爲它們可以同時運行,但並不是所有線程都一次運行。一個CPU內核可以一次運行一個線程。如果你有一個雙核CPU,那麼兩個線程可以同時運行。所以如果我們有一個帶有三個線程的程序,那麼必須有一個上下文切換來運行第三個線程。 – shf301