線程上下文切換
巧妙地利用了時間片輪轉的方式, CPU 給每個任務都服務一定的時間,然后把當前任務的狀態保存下來,在加載下一任務的狀態后,繼續服務下一任務,任務的狀態保存及再加載, 這段過程就叫做上下文切換。時間片輪轉的方式使多個任務在同一顆 CPU 上執行變成了可能。
進程
(有時候也稱做任務)是指一個程序運行的實例。在 Linux 系統中,線程就是能并行運行并且與他們的父進程(創建他們的進程)共享同一地址空間(一段內存區域)和其他資源的輕量級的進程。
上下文
是指某一時間點 CPU 寄存器和程序計數器的內容。
寄存器
是 CPU 內部的數量較少但是速度很快的內存(與之對應的是 CPU 外部相對較慢的 RAM 主內存)。寄存器通過對常用值(通常是運算的中間值)的快速訪問來提高計算機程序運行的速度。
程序計數器
是一個專用的寄存器,用于表明指令序列中 CPU 正在執行的位置,存的值為正在執行的指令的位置或者下一個將要被執行的指令的位置,具體依賴于特定的系統。
PCB-“切換楨”
上下文切換可以認為是內核(操作系統的核心)在 CPU 上對于進程(包括線程)進行切換,上下文切換過程中的信息是保存在進程控制塊(PCB, process control block)中的。PCB 還經常被稱作“切換楨”(switchframe)。信息會一直保存到 CPU 的內存中,直到他們被再次使用。
上下文切換的活動:
- 掛起一個進程,將這個進程在 CPU 中的狀態(上下文)存儲于內存中的某處。
- 在內存中檢索下一個進程的上下文并將其在 CPU 的寄存器中恢復。
- 跳轉到程序計數器所指向的位置(即跳轉到進程被中斷時的代碼行),以恢復該進程在程序中。
引起線程上下文切換的原因
- 當前執行任務的時間片用完之后,系統 CPU 正常調度下一個任務;
- 當前執行任務碰到 IO 阻塞,調度器將此任務掛起,繼續下一任務;
- 多個任務搶占鎖資源,當前任務沒有搶到鎖資源,被調度器掛起,繼續下一任務;
- 用戶代碼掛起當前任務,讓出 CPU 時間;
- 硬件中斷;