進程切換 多線程並發
並發:是指兩個或更多獨立的活動同時發生,在單個系統裏同時執行多個獨立任務,而非順序地進行一些活動
老:單個處理器,某一時刻執行一個任務,可以每秒進行多次任務切換
新:多核處理器,真正的並行多核任務,同時也可以進行任務切換
系統從一個任務到另一個任務(即進行切換),要進行一次上下文切換,切換時,操作系統必須為當前運行的任務保存CPU的狀態和指令指針,並計算出要切換到哪個任務,並為即將切換到的任務重新加載處理器狀態。然後,CPU將新任務的指令和數據的內存載入緩存中。
進程切換:從正在運行的進程中收回處理器,實質是把進程存放在處理器的寄存器中的中間數據找個地方存起來,從而把處理器的寄存器騰出來,讓其他進程使用。被終止運行進程的中間數據被存放在進程的私有堆棧。
讓進程來占用處理器,實質上是把某個進程存放在私有堆棧中寄存器的數據(前一次本進程被中止時的中間數據)再恢復到處理器的寄存器中去,並把待運行進程的斷點送入處理器的程序指針PC,於是待運行進程就開始被處理器運行了,也就是這個進程已經占有處理器的使用權了。
多進程並發:
這種進程間通信設置復雜,速度慢,因為操作系統會在進程間提供一定的保護措施,以避免一個進程去修改另一個進程的數據,另一個缺點是,運行多個進程所需的固定開銷,需要時間啟動進程等。
優點是:因為進程間有保護,更容易編寫安全的並發代碼等。
多線程並發:
一個進程中的所有線程,共享地址空間,並且線程訪問到大部分數據可以在線程之間傳遞,地址共享,缺少線程間數據保護,使操作系統的記錄工作量減小,多線程開銷遠遠小於多進程。
共享內存有代價:數據要被多個線程訪問,必須保證每個線程所訪問到的數據是一致的。
線程是有限的資源,太多線程同時運行會消耗很多操作系統資源,從而使操作系統整體上運行得更加緩慢。
每線程需要一個獨立的堆棧空間,運行太多的線程會耗盡進程的可用內存或地址空間。
每個線程都會有一個1MB的堆棧(很多系統都會這樣分配),對於一個可用地址空間4GB(32bit)的平坦架構的進程來說,4096個線程會用盡所有地址空間,不會給代碼,靜態數據或者堆數據留有任何空間。
運行越多線程,操作系統就要做越多的上下文切換。
進程切換 多線程並發