多線程切換以及線程進程之間關係

進程是資源擁有的單位。線程是調度的最小單位。又稱爲輕進程。他只擁有進程中一些資源,這次資源對於這個線程來說是必不可少的。而所有的線程共享進程的資源。因此不同的線程之間可以共享一些數據變量。而進程則不可以,因爲不同進程有不同過的進程控制塊,分別處於不同的屋裏地址空間裏面。


每個線程都有自己的工作內存,也就是棧,如果從更底層的來說,相當於硬件的高速緩存,進程的一些公共資源常存放在堆中也就是主內存。不同線程之間的內容切換,首先要把各自的數據放到主內存中,纔可以互相訪問切換。


傳統的操作系統中,沒有引入線程,則併發是指進程。而對於進程的併發調度,也就是上下文切換,需要浪費極大地系統資源,例如cpu現場的保護,寄存器,內存地址的信息記錄,調度算法的執行,以及進程狀態的轉換如從運行狀態轉換到阻塞狀態,而且還要把把進程轉到相應的隊列裏面。又因爲有些進程只有一部分代碼需要別的進程提供一些數據。如果因爲這一點的東西需要數據而阻塞,然後要發生強大的進程切換,明顯是浪費很多資源。
爲此,在後來的操作系統中引入了線程概念。線程就是把一個進程分成好多部分,每一個部分都是一個線程,這所有的線程,共享進程的資源。當有一個線程需要別的進程提供數據,發生阻塞的時候,只有這個線程發生阻塞,其他的線程或許不需要這些數據也可以運行,因此只需要阻塞這個線程。進行單個線程切換,而整個進程則不需要切換,因此效率更高。單個線程的調度只需要保存一些必要的信息,如寄存器值,棧之子指針內容。線程切換,只需要更改一些寄存器的指針,如PC,pd等寄存器,當然這些是通過硬件實現的,效率是很快的,然後指向當前線程的代碼開始地址處,當然對於源代碼來說,本質上會經過編譯程序和鏈接程序最終編程目標代碼存放在內存之中的某一空白的內存地址處,並同時記錄該內存地址的首地址,這些都是硬件級別的調用,只要要硬件的一些寄存器之類的東西轉換一下就可以。速度相當快。並不需要什麼進程調度算法,這些很慢的調度。因此引入線程,後系統的併發度會更高。




線程切換過程:
1.虛擬機啓動之後,就進入瞭解釋器的死循環,一直解釋執行pc指針對應的java字節碼。
2. 每個現在對應着一個stack,方面調用的時候,會在其上分配棧幀,由sp,fp等指針指向。
3. 線程調度,其實就是記錄下當前線程的pc,sp,fp等指針,並將這幾個指針(pc,sp,fp等,都是全局的)指向下一個將要執行的線程的相應位置。
4. 當恢復上述的幾個指針之後,就切換回之前的線程了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章