并發編程系列之上下文切換學習筆記
介紹上下文切換之前先介紹一下進程、線程的相關概念,以便于更好地理解上下文切換
進程:在操作系統中的定義是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位。在早期的操作系統中,確實是由進程直接執行程序的,所謂程序就是數據、指令及其組織形式的描述。進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統調度
線程:早期的操作系統程序是由進程執行,現在的操作系統就是由線程執行的,進程是線程的容器,每一個進程都有它自己的地址空間,一般情況下,包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲著活動過程調用的指令和本地變量。線程擁有自己獨立的棧和共享的堆,線程是共享堆,不共享棧的,線程同樣由操作系統調度
協程:協程與子例程類似。協程(coroutine)也是一種程序組件。協程和線程一樣共享堆,不共享棧。協程由程序員代碼控制是否調度,代碼控制得好的話,是可以避免無意義的調度的,所以協程是可以用于避免
在java原生的jdk沒有提供對應的api,只能通過第三方組件來做,github上有兩個是支持的框架,https://github.com/offbynull/coroutines,https://github.com/kilim/kilim
上下文切換(context switch):對于單核CPU來說,在一個時刻只能運行一個線程,對于并行來說,單核cpu也是可以支持多線程執行代碼的,CPU是通過給線程分配時間片來解決的,所謂時間片是CPU給每個現場分配的時間,時間片的時間是非常短的,所以執行完成一個時間片后,進行任務切換,切換之前先保存這個任務的狀態,以便于下次換回來的時候,可以加載這個任務的狀態,所以從保存任務狀態到再加載任務的過程稱為上下文切換,不僅在線程間可以上下文切換,進程也同樣可以
上下文切換測試:
Lmbench3 [1] 可 以 測 量 上 下 文 切 換 的 時 長。
使 用 vmstat 可 以 測 量 上 下 文 切 換 的 次 數。
避免上下文切換方法:
多線程的鎖競爭會導致上下文切換頻繁,所以就可以從這兩方面下手,一個方面是鎖,就是盡量不用鎖;一個方面是線程,不用線程,用其它方法替換
取模分段,將id按照hash算法取模分段,不同線程處理不同端的數據
CAS算法,java中的Atomic就是使用CAS算法來更新數據,并沒有使用鎖
使用協程的方法,在不必要的地方就不調用,避免上下文切換
volatitle的應用,volatile關鍵字可以說是輕量級的鎖,volatile關鍵字是實現線程操作可見性的,可以用于避免上下文切換
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。