併發 上下文切換。

2021-09-01 10:33:59 字數 794 閱讀 4145

即使是單核處理器也支援多執行緒執行**,cpu通過給每個執行緒分配cpu時間片來實現這個機制。時間片是cpu分配給各個執行緒的時間,因為時間片非常短,所以cpu通過不停的切換執行緒執行,讓我們感覺多個執行緒是同時執行的,時間片一般是幾十毫秒(ms)。

cpu通過時間片分配演算法來迴圈執行任務,當前任務執行乙個時間片後會切換到下乙個任務。但是,在切換前會儲存上乙個任務的狀態,以便下次切換回這個任務時,可以再載入這個任務的狀態。所以任務從儲存到再載入的過程就是一次上下文切換。

這就像我們同時讀兩本書,當我們在讀一本英文的技術書時,發現某個單詞不認識,於是便開啟中英文本典,但是在放下英文技術書之前,大腦必須先記住這本書都到了多少頁的第多少行,等查完單詞之後,能夠繼續讀這本書。這樣的切換是會影響讀書效率的,同樣上下文切換也會影響多執行緒的執行速度。

經測試,當併發執行累加操作不超過百萬次時,速度會比序列化執行累加操作要慢。那麼,為什麼併發執行的速度會比序列慢呢?這時因為執行緒有建立和上下文切換的開銷。

下面我們來看看有什麼工具可以度量上下文切換帶來的消耗。

減少上下文切換的方法有無鎖併發程式設計、cas演算法、使用最少執行緒和使用協程。

通過減少線上大量waiting的執行緒,來減少上下文切換次數。

用jstack命令dump執行緒資訊,看看pid為3117的程序裡的執行緒都在做什麼。

統計所有執行緒分別處於什麼狀態。

開啟dump檔案檢視處於waiting(onobjectmonitor)的執行緒在做什麼。

減少多餘等待的工作執行緒數。

重啟。多使用jdk並發包提供的併發容器和工具類來解決併發問題,因為這些類都已經通過了充分的測試和優化。

上下文切換

1 系統呼叫 一次系統呼叫其實是發生了兩次cpu上下文的切換 首先將使用者態的cpu暫存器中的指令儲存在系統核心中。為了執行核心態 需要將暫存器更新為核心態指令的位置,然後跳轉到核心空間去執行任務。當核心態的指令執行完成的時候,cpu暫存器將恢復儲存在系統核心中的上一次執行的使用者態,然後切換到使用...

上下文切換

上下文切換 有時也稱做程序切換或任務切換 是指 cpu 從乙個程序或執行緒切換到另乙個程序或執行緒。上下文切換與模式切換 上下文切換只能發生在核心態中。核心態是 cpu 的一種有特權的模式,在這種模式下只有核心執行並且可以訪問所有記憶體和其他系統資源。其他的程式,如應用程式,在最開始都是執行在使用者...

上下文切換

vmstat cs 每秒上下文切換次數 的疑惑 in 每秒cpu中斷次數 shell vmstat 1 procs memory swap io system cpu r b swpd free buff cache si so bi bo in cs us sy id wa 1 0 0 45939...