進程、線程、服務和任務的區別以及多線程與超線程的概念


 1、進程、線程、服務和任務的區別

    進程(process),是指運行中的應用程序,每一個進程都有自己獨立的內存空間。一個應用程序可以同時啟動多個進程。例如對於IE瀏覽器程序,每打開一個IE瀏覽器窗口,就啟動了一個新的進程。同樣,每次執行JDK的java.exe程序,就啟動了一個獨立的Java虛擬機進程,該進程的任務是解析並執行Java程序代碼。

    線程(thread),是操作系統能夠進行運算的最小單位。線程被包含在進程之中,是行程中的實際運行單位。一條線程是指進程中的一個單一順序的控制流,一個進程中可以並行多個線程,每條線程並行執行不同的任務。當進程內的多個線程同時運行時,這種運行方式稱為並發運行。許多服務器程序,如數據庫服務器和Web服務器,都支持並發運行,這些服務器能同時響應來自不同客戶的請求。

    進程和線程的主要區別在於:每個進程都需要操作系統為其分配獨立的內存地址空間,而同一進程中的所有線程在同一塊地址空間中工作,這些線程可以共享同一塊內存和系統資源,比如共享一個對象或者共享已經打開的一個文件。

    服務(service),也稱為守護線程,是沒有界面的,默默運行在系統后台的。他可以為應用程序提供一些更有特色的東西,比如播放MP3,開啟一個播放MP3的服務,用戶點擊開始按鈕通知服務開啟,點擊關閉按鈕通知服務關閉,如果你禁用這個服務,那別人想播放MP3那是不行的,而且服務之間是有可能互相依靠的。

    任務(task),是指由軟件完成的一個活動。任務是比較抽象的概念,是一個一般性的術語,一個任務既可以是一個進程,也可以是一個線程。簡而言之,它指的是一系列共同達到某一目的的操作。例如,讀取數據並將數據放入內存中。這個任務可以作為一個進程來實現,也可以作為一個線程(或作為一個中斷任務)來實現。

 

2、多線程(multithreading)與超線程(Hyper-Threading)

    在講多線程之前,需要知道什么是同步、什么是異步。簡單的說,同步就是要兩端按照同一個頻率來進行消息處理,異步就是兩端按自己的頻率來進行消息處理。我們略去底層硬件定義的那種晦澀的解釋方式,用比較通俗的語言來解釋下:

    同步:發送方發出數據后,等接收方發回響應以后才發下一個數據包的通訊方式;

    異步:發送方發出數據后,不等接收方發回響應,接着發送下個數據包的通訊方式。

    下面我們講一下多線程。假設現在有一個CPU,運行兩個線程,那么這兩個線程其實不是並行運行的,在微觀的CPU內部里面,還是串行處理的。CPU通過線程中斷,讓某一個線程掛起來,然后切換到另一個線程,執行一會兒,再切換回來,使得宏觀上看上去好像兩個線程同時運行一樣。線程切換肯定會帶來一定的性能犧牲,於是我們可以增加CPU,這樣就真正的做到微觀上面的線程並行了,然而線程數大於物理CPU核數后肯定會帶來線程切換帶來的性能影響,那為何要用多線程呢?

    計算機最重要的部位就是CPU,只有當CPU充分利用的時候,計算機的威力才會被發揮回來,因此我們的目的就是提高CPU的利用率,不讓其空閑。

    假設我們現在運行的任何程序都是純異步的,也就是說沒有存在任何的等待時間,換一句話說CPU從來不會空閑起來,此時的線程數如果大於物理CPU個數的話將會得不償失,因為線程切換回帶來一定的性能開銷。

    然而不幸的是,現實總是那么的殘酷,世界到處存在等待的時間,CPU也不例外。想想看買票都需要排隊等待呢,換句專業的術語就是“同步”。那我們想想為啥我們現實生活中會發生等待現象呢?因為資源單一,試想一下,如果我們每個人都有票了,那還排啥隊啊,為啥買票,票不在我們手里唄;為啥排隊,售票點就那么幾個,人又那么多,無規矩不成方圓唄。

    計算機里面同樣也是這樣的情況,就那么幾個硬件,比如我就一個硬盤,可是四個CPU來訪問,這時候CPU多有啥用,你還是得等待,不等待就跟你買票付了錢,人家突然沖過來把票搶走了,什么素質啊。這就是互斥鎖存在的意義了,訪問共享資源的時候要鎖住線程,不能讓其他人來搶劫。別人就只能等待了。

    等待意味着什么,意味着你只能想辦法浪費時間了,睡覺也好,打游戲也好,聽音樂也好。如果這個線程等待了,就相當於它去睡覺了,那如果此時CPU只有一個線程呢?這個線程等待的時候, CPU就空閑着了。這就是多線程存在的意義了,在大多數存在同步等待情況的程序中,線程數如果大於物理CPU個數的時候,是可以充分利用CPU,提高性能的。但無限制的加大線程數會帶來線程切換的開銷,所以一個服務程序的最優線程數需要根據具體情況來具體評估。幸運的是,大部分的服務都是存在同步情況的,於是多線程就顯得非常有用處了。

    那超線程什么呢。我們回顧一下多線程概念,電腦在執行命令的時候會鎖定了下個將被執行的指令的內存儲存位置,使CPU精確地知道從哪兒得到這些指令。當一個線程發送到CPU,這線程的內存地址就被鎖定,所以CPU明白從哪里開始執行線程。電腦能夠遞增處理每個指令,一直到處理完一個線程為止。在線程執行以后,電腦就會重新讀入下個要執行的指令位置。不同線程可以彼此相互中斷,即強迫CPU把電腦上當前處理的結算結果儲存在棧里。而這樣造成的缺陷就是CPU每次只能處理一個線程。而超線程技術呢?就是讓一個CPU可以每次執行一條以上來自不同線程的技術,這樣可以減少很大部分的多線程切換操作。不同於提高CPU的時鍾速度和增加緩存容量等物理手段,超線程技術可以讓系統誤以為系統內有兩塊物理CPU,操作系統就會同時向那‘兩’塊CPU發送2個線程的任務。在帶有超線程技術的CPU上, CPU將會嘗試同時執行兩個線程(兩個線程使用一個cpu上的不同執行單元),因此解決了CPU執行單元利用率低下的問題。不過,如果線程的數目小於物理CPU核數的話,那么其實有無開啟超線程其實並沒有多大的區別。只有當開啟的線程數目大於CPU核數的情況下其優勢可能才會體現出來,然而這樣的情況也只是在多線程比單線程更適合的程序才可以,即大量的同步通信的程序上其多線程的效果才會可能體現出來。這時候開啟超線程有可能會帶來收益,而且這些線程的功能點重合越少,效果越明顯。而一般的商業網絡服務器都存在網絡交互的情況,因此超線程可能可以帶來一定的提升,然而還是有可能會帶來零收益、甚至反作用的,所以需要經過嚴格的評估測試后再進行決策。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM