線程上下文切換
巧妙地利用了時間片輪轉的方式, CPU 給每個任務都服務一定的時間,然後把目前任務的狀态儲存下來,在加載下一任務的狀态後,繼續服務下一任務,任務的狀态儲存及再加載, 這段過程就叫做上下文切換。時間片輪轉的方式使多個任務在同一顆 CPU 上執行變成了可能。

1 程序
程序(也稱作任務)是指一個程式運作的執行個體。在 Linux 系統中,線程就是能并行運作并且與他們的父程序(建立他們的程序)共享同一位址空間(一段記憶體區域)和其他資源的輕量級的程序。
2 上下文
是指某一時間點 CPU 寄存器和程式計數器的内容。
3 寄存器
是 CPU 内部的數量較少但是速度很快的記憶體(與之對應的是 CPU 外部相對較慢的 RAM 主記憶體)。寄存器通過對常用值(通常是運算的中間值)的快速通路來提高計算機程式運作的速度。
4 程式計數器
是一個專用的寄存器,用于表明指令序列中 CPU 正在執行的位置,存的值為正在執行的指令的位置或者下一個将要被執行的指令的位置,具體依賴于特定的系統。
5 PCB-“切換桢”
上下文切換可以認為是核心(作業系統的核心)在 CPU 上對于程序(包括線程)進行切換,上下文切換過程中的資訊是儲存在程序控制塊(PCB, process control block)中的。PCB 還經常被稱作“切換桢”(switchframe)。資訊會一直儲存到 CPU 的記憶體中,直到他們被再次使用。
6 上下文切換的活動
- 挂起一個程序,将這個程序在 CPU 中的狀态(上下文)存儲于記憶體中的某處。
- 在記憶體中檢索下一個程序的上下文并将其在 CPU 的寄存器中恢複。
- 跳轉到程式計數器所指向的位置(即跳轉到程序被中斷時的代碼行),以恢複該程序在程式中。
7 引起線程上下文切換的原因
- 目前執行任務的時間片用完之後,系統 CPU 正常排程下一個任務;
- 目前執行任務碰到 IO 阻塞,排程器将此任務挂起,繼續下一任務;
- 多個任務搶占鎖資源,目前任務沒有搶到鎖資源,被排程器挂起,繼續下一任務;
- 使用者代碼挂起目前任務,讓出 CPU 時間;
- 硬體中斷。