九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
JAVA多線程(一)基本概念和上下文切換性能損耗

1 多線程概念

在理解多線程之前,我們先搞清楚什么是線程。根據(jù)維基百科的描述,線程是操作系統(tǒng)能夠進行運算調(diào)度的最小單位。它被包含在進程之中,是行程中的實際運行單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并行多個線程,每條線程并行執(zhí)行不同的任務(wù)。每個線程共享堆空間,擁有自己獨立的??臻g。

這里反復出現(xiàn)的概念是線程和進程,我們在這里列出它們的區(qū)別:

  • 線程劃分尺度小于進程,線程隸屬于某個進程;
  • 進程是CPU、內(nèi)存等資源占用的基本單位,線程是不能獨立占有這些資源的;
  • 進程之間相互獨立,通信比較困難,而線程之間共享一塊內(nèi)存區(qū)域,通信方便;
  • 進程在執(zhí)行過程中,包含比較固定的入口、執(zhí)行順序和出口,而進程的這些過程會被應(yīng)用程序控制。

多線程是指從軟件或者硬件上實現(xiàn)多個線程并發(fā)執(zhí)行的技術(shù)。具有多線程能力的計算機因有硬件支持而能夠在同一時間執(zhí)行多個線程,進而提升整體處理效能。

2 為什么要使用多線程

隨著計算機硬件的發(fā)展,多核CPU已經(jīng)屢見不鮮了,甚至手機處理器都早已是多核的天下。這就給我們使用多線程提供了硬件基礎(chǔ),但是,只是因為硬件讓我們可以實現(xiàn)多線程,就要這樣做嗎?一起來看看多線程的優(yōu)點:

  • 更高的運行效率。在多核CPU上,線程之間是互相獨立的,不用互相等待,也就是所謂的“并行“。舉個例子,一個使用多線程的文件系統(tǒng)可以實現(xiàn)高吞吐量和低延遲。這是因為我們可以用一個線程來檢索存儲在高速介質(zhì)(例如高速緩沖存儲器)中的數(shù)據(jù),另一個線程檢索低速介質(zhì)(例如外部存儲)中的數(shù)據(jù),二者互不干擾,也不用等到另一個線程結(jié)束才執(zhí)行;
  • 多線程是模塊化的編程模型。在單線程中,如果主執(zhí)行線程在一個耗時較長的任務(wù)上卡住,或者因為網(wǎng)絡(luò)響應(yīng)問題陷入長時間等待,此時程序不會響應(yīng)鼠標和鍵盤等操作。多線程通過將程序分成幾個功能相對獨立的模塊,單獨分配一個線程去執(zhí)行這個長耗時任務(wù),不影響其它線程的執(zhí)行,就可以避免這個問題;
  • 與進程相比,線程的創(chuàng)建和切換開銷更小。使用多線程為多個客戶端服務(wù),比使用多進程消耗的資源少得多。由于啟動一個新的線程必須給這個線程分配獨立的地址空間,建立許多數(shù)據(jù)結(jié)構(gòu)來維護線程代碼段、數(shù)據(jù)段等信息,而運行于同一進程內(nèi)的線程共享代碼段、數(shù)據(jù)段,線程的啟動和切換開銷小得多。一個典型的應(yīng)用例子就是Apache HTTP服務(wù)器所使用的線程池: 一個監(jiān)聽線程池專門用來監(jiān)聽是否有請求進入,另一個服務(wù)器線程池用來處理這些請求;
  • 通信方便。因為線程共享??臻g,可以通過線程之間共享的數(shù)據(jù)、代碼和文件來進行線程之間的通信(詳見我的另一篇JAVA多線程(四)數(shù)據(jù)共享)。相比之下,進程之間的通信則需要專門的消息傳遞機制;
  • 使用多線程能簡化程序的結(jié)構(gòu),使程序便于理解和維護。一個復雜的進程可以分成多個線程來執(zhí)行;
  • 更高的資源利用率。多CPU或多核計算機本來就具有執(zhí)行多線程的能力,如果只使用單個線程,將無法重復利用計算機資源,造成巨大浪費。

3 多線程上下文切換的性能損耗

前面夸了多線程的優(yōu)點,凡事都有兩面性,使用多線程也有弊端。盡管使用多線程往往可以獲得更大的吞吐率和更短的響應(yīng)時間,但是,多線程程序不一定比單線程程序執(zhí)行速度快。很多線程存在情況下,線程之間的切換會非常頻繁,切換帶來的性能損耗是非??捎^的。

3.1 上下文切換的概念

先來解釋一下什么是上下文切換(context switch)。在多任務(wù)處理系統(tǒng)中,作業(yè)數(shù)通常大于CPU數(shù)。為了讓用戶覺得這些任務(wù)在同時進行,CPU給每個任務(wù)分配一定時間,把當前任務(wù)狀態(tài)保存下來,當前運行任務(wù)轉(zhuǎn)為就緒(或者掛起、刪除)狀態(tài),另一個被選定的就緒任務(wù)成為當前任務(wù)。之后CPU可以回過頭再處理之前被掛起任務(wù)。上下文切換就是這樣一個過程,它允許CPU記錄并恢復各種正在運行程序的狀態(tài),使它能夠完成切換操作。在這個過程中,CPU會停止處理當前運行的程序,并保存當前程序運行的具體位置以便之后繼續(xù)運行。

上下文切換在不同的場合有不同的含義,在下表中列出:

上下文切換種類 描述
線程切換 同一進程中的兩個線程之間的切換
進程切換 兩個進程之間的切換
模式切換 在給定線程中,用戶模式和內(nèi)核模式的切換
地址空間切換 將虛擬內(nèi)存切換到物理內(nèi)存

根據(jù)種類的不同,切換時造成的性能消耗也不同。

究竟什么時候會發(fā)生上下文切換?總共有三種情況:

上下文切換發(fā)生條件 描述
中斷處理 中斷分為硬件中斷和軟件中斷,軟件中斷包括因為IO阻塞、未搶到資源或者用戶代碼等原因,線程被掛起
多任務(wù)處理 每個程序都有相應(yīng)的處理時間片,當前任務(wù)的時間片用完之后,系統(tǒng)CPU正常調(diào)度下一個任務(wù)
用戶態(tài)切換 這種情況下,上下文切換并非一定發(fā)生,只在特定操作系統(tǒng)才會發(fā)生上下文切換

3.2 上下文切換的步驟

為了理解為什么上下文切換的時候會損耗性能,我們應(yīng)該先看看上下文切換的過程中究竟發(fā)生了什么。在切換過程中,正在執(zhí)行的進程的狀態(tài)必須以某種方式存儲起來,這樣在未來才能被恢復。這里說的進程狀態(tài)包括該進程正在使用的所有寄存器(尤其是程序計數(shù)器),和一些必要的操作系統(tǒng)數(shù)據(jù)。保存進程狀態(tài)的數(shù)據(jù)結(jié)構(gòu)叫做“進程控制塊”(PCB,process control block);

PCB通常是系統(tǒng)內(nèi)存占用區(qū)中的一個連續(xù)存區(qū),它存放著操作系統(tǒng)用于描述進程情況及控制進程運行所需的全部信息,它使一個在多道程序環(huán)境下不能獨立運行的程序成為一個能獨立運行的基本單位或一個能與其他進程并發(fā)執(zhí)行的進程。

上下文切換的具體步驟是(假設(shè)當前進程是進程A,要切換到的下一個進程是進程B):

  1. 保存進程A的狀態(tài)(寄存器和操作系統(tǒng)數(shù)據(jù));
  2. 更新PCB中的信息,對進程A的“運行態(tài)”做出相應(yīng)更改;
  3. 將進程A的PCB放入相關(guān)狀態(tài)的隊列;
  4. 將進程B的PCB信息改為“運行態(tài)”,并執(zhí)行進程B;
  5. B執(zhí)行完后,從隊列中取出進程A的PCB,恢復進程A被切換時的上下文,繼續(xù)執(zhí)行A。

線程分為用戶級線程和內(nèi)核級線程。同一進程中的用戶級線程切換的時候,只需要保存用戶寄存器的內(nèi)容,程序計數(shù)器,棧指針,不需要模式切換。但是這樣會導致線程阻塞和無法利用多處理器。而同一進程中的內(nèi)核級線程切換的時候,就克服了這兩個缺點,但是除了保存上下文,還要進行模式切換。

線程切換和進程切換的步驟也不同。進程的上下文切換分為兩步:1.切換頁目錄以使用新的地址空間;2.切換內(nèi)核棧和硬件上下文。對于Linux來說,線程和進程的最大區(qū)別就在于地址空間。對于線程切換,第1步是不需要做的,第2是進程和線程切換都要做的。所以明顯是進程切換代價大。線程上下文切換和進程上下文切換一個最主要的區(qū)別是線程的切換虛擬內(nèi)存空間依然是相同的,但是進程切換是不同的。這兩種上下文切換的處理都是通過操作系統(tǒng)內(nèi)核來完成的。內(nèi)核的這種切換過程伴隨的最顯著的性能損耗是將寄存器中的內(nèi)容切換出。

3.3 上下文切換帶來的損耗

根據(jù)前面的切換步驟,我們可以很容易得到性能損耗的原因。

上下文切換會導致CPU在寄存器和運行隊列之間來回奔波。這種消耗可以分為兩種

損耗種類 描述
直接損耗 CPU寄存器需要保存和加載, 系統(tǒng)調(diào)度器的代碼需要執(zhí)行, TLB實例需要重新加載, CPU 的pipeline需要刷掉
間接損耗 多核的cache之間得共享數(shù)據(jù)
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
并發(fā)編程大掃盲:帶你了解何為線程上下文切換
單核多線程與多核多線程
Linux多線程編程和Linux 2.6下的NPTL
高并發(fā)Web服務(wù)的演變
多線程的優(yōu)劣/性能/系統(tǒng)開銷_龍宜坡
進程與線程的關(guān)系
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服