利用時間片輪轉的方式,CPU給每個任務都服務一定的時間,然后把當前任務的狀態保存下來,在加載下一個任務后,繼續服務下一個任務,這個過程叫做上下文切換。即對於單核CPU,CPU在一個時刻只能運行一個線程,當在運行一個線程的過程中轉去運行另外一個線程,這個叫做線程上下文切換(對於進程也是類似)。
線程上下文切換過程中會記錄程序計數器、CPU寄存器的狀態等數據。
雖然多線程可以使得任務執行的效率得到提升,但是由於在線程切換時同樣會帶來一定的開銷代價,並且多個線程會導致系統資源占用的增加,所以在進行多線程編程時要注意這些因素。
時間片輪轉的方式使得多個任務在同一顆CPU上執行變成可能。
1、進程(有時也稱為任務)是指一個程序運行的實例。在Linux系統中,線程就是能並行運行並且與它們父進程(創建它們的進程)共享同一地址空間(一段內存區域)和其他資源的輕量級的進程。
2、上下文:指某一時間點CPU寄存器和程序計數器的內容。
3、寄存器:是CPU內部的數量較少但是速度很快的內存(與之對應的是CPU外部相對較慢的RAM主內存)。寄存器通過對常用值(通常是運算的中間值)的快速訪問來提高計算機程序運行的速度。
4、程序計數器:是一個專用的寄存器,用於表明指令序列中CPU正在執行的位置,存的值為正在執行的指令的位置或下一個將要被執行的指令的位置,具體依賴特定的系統。
5、PCB-“切換楨”:上下文切換可以認為是內核(操作系統的核心)在CPU上對於進程(包括線程)進行切換,上下文切換過程中的信息是保存在進程控制塊中的。PCB還經常被稱作“切換楨”。信息會一直保存到CPU的內存中,直到它們被再次使用。
6、上下文切換的活動
1)掛起一個進程,將這個進程在CPU中的狀態(上下文)存儲於內存中的某處。
2)在內存中檢索下一個進城的上下文並將其在CPU的寄存器中恢復。
3)跳轉到程序計數器所指向的位置(即跳轉到進程被中斷時的代碼行),已恢復在程序中的該進程。
7、引起線程上下文切換的原因
1)當前執行任務的時間片用完之后,系統CPU正常調度下一個任務;
2)當前執行任務碰到IO阻塞,調度器將此任務掛起,繼續下一任務;
3)多個任務搶占鎖資源,當前任務沒有搶到鎖資源,被調度器掛起,繼續下一個任務;
4)用戶代碼掛起當前任務,讓出CPU時間;
5)硬件中斷;