多線程是指從軟件或者硬件上實現多個線程并發執行的技術。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及芯片級多處理或同時多線程處理器。
多線程(英語:multithreading),是指從軟件或者硬件上實現多個線程并發執行的技術。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及芯片級多處理(Chip-level multithreading)或同時多線程(Simultaneous multithreading)處理器。在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理(Multithreading)”。
在計算機編程中,一個基本的概念就是同時對多個任務加以控制。許多程序設計問題都要求程序能夠停下手
頭的工作,改為處理其他一些問題,再返回主進程??梢酝ㄟ^多種途徑達到這個目的。最開始的時候,那些掌握機器低級語言的程序員編寫一些“中斷服務例程”,主進程的暫停是通過硬件級的中斷實現的。盡管這是一種有用的方法,但編出的程序很難移植,由此造成了另一類的代價高昂問題。中斷對那些實時性很強的任務來說是很有必要的。但對于其他許多問題,只要求將問題劃分進入獨立運行的程序片斷中,使整個程序能更迅速地響應用戶的請求。
最開始,線程只是用于分配單個處理器的處理時間的一種工具。但假如操作系統本身支持多個處理器,那么每個線程都可分配給一個不同的處理器,真正進入“并行運算”狀態。從程序設計語言的角度看,多線程操作最有價值的特性之一就是程序員不必關心到底使用了多少個處理器。程序在邏輯意義上被分割為數個線程;假如機器本身安裝了多個處理器,那么程序會運行得更快,毋需作出任何特殊的調校。根據前面的論述,大家可能感覺線程處理非常簡單。但必須注意一個問題:共享資源!如果有多個線程同時運行,而且它們試圖訪問相同的資源,就會遇到一個問題。舉個例子來說,兩個線程不能將信息同時發送給一臺打印機。為解決這個問題,對那些可共享的資源來說(比如打印機),它們在使用期間必須進入鎖定狀態。所以一個線程可將資源鎖定,在完成了它的任務后,再解開(釋放)這個鎖,使其他線程可以接著使用同樣的資源。
多線程是為了同步完成多項任務,不是為了提高運行效率,而是為了提高資源使用效率來提高系統的效率。線程是在同一時間需要完成多項任務的時候實現的。
最簡單的比喻多線程就像火車的每一節車廂,而進程則是火車。車廂離開火車是無法跑動的,同理火車也不可能只有一節車廂。多線程的出現就是為了提高效率。同時它的出現也帶來了一些問題。
在大多數研究領域內是要求線程調度程序要能夠快速選擇其中一個已就緒線程去運行,而不是一個一個運行而降低效率。所以要讓調度程序去分辨線程的優先級是很重要的。而線程調度程序可能是以硬件、軟件,或是軟硬件并存的形式存在。
而另一個研究領域則是要研究何種事件(高速緩存失敗、內部運行連續性、使用 DMA 等)會造成線程切換。
如果多線程的方案會復制所有軟件可見的狀態,包括特許的控制登錄、TLB 等,那就能夠讓虛擬機去創造各式線程。這樣子就允許在相同的處理器中每個線程跑各自的操作系統。換句話說,如果只有存儲了用戶模式的狀態,就能夠讓相同的裸晶大小的芯片在一段時間內處理更多的線程。
多線程硬件支持的目標,即支持快速進行就緒態線程、執行態線程間的切換。為達成這個目標,需要硬件實現保存、恢復程序看得見的寄存器以及一些對程序執行有影響的控制寄存器(如程序計數器 PC、程序狀態寄存器 SR)。從一個線程切換到另一個線程對硬件來講意味著保存當前線程的一組寄存器的值,并恢復即將執行線程的一組寄存器的值。
新增這些功能的硬件有以下優勢:
線程切換能夠在一個 CPU 周期內完成(有些硬件甚至沒有開銷,上個周期在運行線程 A,下個周期就已在運行線程 B)。
每個線程看起來就像是獨自運行的,即沒有與其他線程共享硬件資源。對操作系統來說,通常每個線程都被視做獨占一個處理器,這樣將簡化系統軟件的設計(尤其是對于支持多線程的操作系統)。
為了在各個線程間有效率的進行切換,每個線程需要保存自己的一組寄存器集(register set)。有些硬件設計成每個處理器核心具有兩組寄存器文件,以實現在多個線程間快速切換。
英文:Process、Thread
每個正在系統上運行的程序都是一個進程。每個進程包含一到多個線程。進程也可能是整個程序或者是部分程序的動態執行。線程是一組指令的***,或者是程序的特殊段,它可以在程序里獨立執行。也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程序里執行多任務。通常由操作系統負責多個線程的調度和執行。
線程是程序中一個單一的順序控制流程.在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
線程和進程的區別在于,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文.多線程主要是為了節約 CPU 時間,發揮利用,根據具體情況而定. 線程的運行中需要使用計算機的內存資源和 CPU。
使用 Runnable
class?MyThread{
public?static?void?main(String[]?args){
new?Thread(new?Runnable()?{
@Override????public?void?run()?{
//寫上線程需要執行的代碼
}
}).start();
}
}
這里推薦使用 Thread 類來實現多線程。
一個采用了多線程技術的應用程序可以更好地利用系統資源。其主要優勢在于充分利用了 CPU 的空閑時間片,可以用盡可能少的時間來對用戶的要求做出響應,使得進程的整體運行效率得到較大提高,同時增強了應用程序的靈活性。更為重要的是,由于同一進程的所有線程是共享同一內存,所以不需要特殊的數據傳送機制,不需要建立共享存儲區或共享文件,從而使得不同任務之間的協調操作與運行、數據的交互、資源的分配等問題更加易于解決。
在多線程應用中,考慮不同線程之間的數據同步和防止死鎖。當兩個或多個線程之間同時等待對方釋放資源的時候就會形成線程之間的死鎖。為了防止死鎖的發生,需要通過同步來實現線程安全。在 Visual Basic 中提供了三種方法來完成線程的同步。在 Java 中可用synchronized 關鍵字。
使用 Monitor 類可以同步靜態/實例化的方法的全部代碼或者部分代碼段。
手工同步:
可以使用不同的同步類(諸如 WaitHandle, Mutex, ReaderWriterLock, ManualResetEvent, AutoResetEvent 和 Interlocked 等)創建自己的同步機制。這種同步方式要求你自己手動的為不同的域和方法同步,這種同步方式也可以用于進程間的同步和解除由于對共享資源的等待而造成的死鎖。
·使用線程可以把占據時間長的程序中的任務放到后臺去處理。
·用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度。
·程序的運行速度可能加快。
·在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內存占用等等。
·如果有大量的線程,會影響性能,因為操作系統需要在它們之間切換。
·更多的線程需要更多的內存空間。
·線程可能會給程序帶來更多“bug”,因此要小心使用。
·線程的中止需要考慮其對程序運行的影響。
·通常塊模型數據是在多個線程間共享的,需要防止線程死鎖情況的發生。
一些線程模型的背景
可以重點討論一下在 Win32 環境中常用的一些模型。
·單線程模型
在這種線程模型中,一個進程中只能有一個線程,剩下的進程必須等待當前的線程執行完。這種模型的缺點在于系統完成一個很小的任務都必須占用很長的時間。
·塊線程模型(單線程多塊模型 STA)
這種模型里,一個程序里可能會包含多個執行的線程。在這里,每個線程被分為進程里一個單獨的塊。每個進程可以含有多個塊,可以共享多個塊中的數據。程序規定了每個塊中線程的執行時間。所有的請求通過 Windows 消息隊列進行串行化,這樣保證了每個時刻只能訪問一個塊,因而只有一個單獨的進程可以在某一個時刻得到執行。這種模型比單線程模型的好處在于,可以響應同一時刻的多個用戶請求的任務而不只是單個用戶請求。但它的性能還不是很好,因為它使用了串行化的線程模型,任務是一個接一個得到執行的。
·多線程塊模型(自由線程塊模型)
多線程塊模型(MTA)在每個進程里只有一個塊而不是多個塊。這單個塊控制著多個線程而不是單個線程。這里不需要消息隊列,因為所有的線程都是相同的塊的一個部分,并且可以共享。這樣的程序比單線程模型和 STA 的執行速度都要快,因為降低了系統的負載,因而可以優化來減少系統 idle 的時間。這些應用程序一般比較復雜,因為程序員必須提供線程同步以保證線程不會并發的請求相同的資源,因而導致競爭情況的發生。這里有必要提供一個鎖機制。但是這樣也許會導致系統死鎖的發生。
進程和線程都是操作系統的概念。進程是應用程序的執行實例,每個進程是由私有的虛擬地址空間、代碼、數據和其它各種系統資源組成,進程在運行過程中創建的資源隨著進程的終止而被銷毀,所使用的系統資源在進程終止時被釋放或關閉。
線程是進程內部的一個執行單元。系統創建好進程后,實際上就啟動執行了該進程的主執行線程,主執行線程以函數地址形式,比如說 main 或 WinMain 函數,將程序的啟動點提供給 Windows 系統。主執行線程終止了,進程也就隨之終止。
每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。用戶根據需要在應用程序中創建其它線程,多個線程并發地運行于同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變量和系統資源,所以線程間的通訊非常方便,多線程技術的應用也較為廣泛。多線程可以實現并行處理,避免了某項任務長時間占用 CPU 時間。要說明的一點是,到 2015 年為止,大多數的計算機都是單處理器(CPU)的,為了運行所有這些線程,操作系統為每個獨立線程安排一些 CPU 時間,操作系統以輪換方式向線程提供時間片,這就給人一種假象,好象這些線程都在同時運行。由此可見,如果兩個非?;钴S的線程為了搶奪對 CPU 的控制權,在線程切換時會消耗很多的 CPU 資源,反而會降低系統的性能。這一點在多線程編程時應該注意。C++ 11 標準中,STL 類庫也實現了多線程的類 std::thread,使得多線程編程更加方便。
Java 對多線程的支持是非常強大的,他屏蔽掉了許多的技術細節,讓我們可以輕松的開發多線程的應用程序。
Java 里面實現多線程,有 2 個方法:
使用 Thread 類
class?MyThread{
public?static?void?main(String[]?args){
new?Thread(){
public?void?run(){
//寫上線程需要執行的代碼
}
}.start();
}
}
在本質上和結構來說,.NET 是一個多線程的環境。有兩種主要的多線程方法是.NET 所提倡的:使用 ThreadStart 來開始你自己的進程,直接的(使用 ThreadPool.queueuserworkitem)或者間接的(比如 Stream.BeginRead,或者調用 BeginInvoke)使用 ThreadPool 類。一般來說,你可以"手動"為長時間運行的任務創建一個新的線程,另外對于短時間運行的任務尤其是經常需要開始的那些,進程池是一個非常好的選擇。進程池可以同時運行多個任務,還可以使用框架類。對于資源緊缺需要進行同步的情況來說,它可以限制某一時刻只允許一個線程訪問資源。這種情況可以視為給線程實現了鎖機制。線程的基類是 System.Threading。所有線程通過 CLI 來進行管理。
·創建線程:
創建一個新的 Thread 對象的實例。Thread 的構造函數接受一個參數:
Thread DummyThread = new Thread( new ThreadStart(dummyFunction) );
·執行線程:
使用 Threading 命名空間里的 start 方法來運行線程:
DummyThread.Start ();
·組合線程:
經常會出現需要組合多個線程的情況,就是當某個線程需要其他線程的結束來完成自己的任務。假設 DummyThread 必須等待 DummyPriorityThread 來完成自己的任務,只需要這樣做:
DummyPriorityThread.Join() ;
·暫停線程:
使得線程暫停給定的秒
DummyPriorityThread.Sleep(<Time in Second>);
·中止線程:
如果需要中止線程可以使用如下的代碼:
DummyPriorityThread.Abort();
·同步
經常會遇到需要在線程間進行同步的情況,下面的代碼給出了一些方法:
usingSystem;
usingSystem.Threading;
namespaceSynchronizationThreadsExample
{
classSynchronizationThreadsExample
{
privateintcounter=0;
staticvoidMain()
{
SynchronizationThreadsExampleSTE=newSynchronizationThreadsExample();
STE.ThreadFunction();
}
publicvoidThreadFunction()
{
ThreadDummyThread=newThread(newThreadStart(SomeFunction));
DummyThread.IsBackground=true;
DummyThread.Start();
console.writeline("Startedthread");
ThreadDummyPriorityThread=newThread(newThreadStart(SomeFunction));
DummyPriorityThread.IsBackground=true;
//="SecondThread";
DummyPriorityThread.Start();
Console.WriteLine("Startedthread");
DummyThread.Join();
DummyPriorityThread.Join();
}
publicvoidSomeFunction()
{
try
{
while(counter<10)
{
inttempCounter=counter;
tempCounter++;
Thread.Sleep(1);
counter=tempCounter;
Console.WriteLine("Thread.SomeFunction:"+Thread.+counter);
}
}
catch(ThreadInterruptedExceptionEx)
{
Console.WriteLine("Exceptioninthread"+Thread.);
}
finally
{
Console.WriteLine("ThreadExiting."+Thread);
}
}
}
}
·使用 Interlock
C#提供了一個特殊的類叫做 interlocked,就是提供了鎖機制的實現,可以加入如下的代碼實現鎖機制:
Interlocked.SomeFunction (ref counter);
·使用鎖
這是為了鎖定代碼關鍵區域以進行同步,鎖定代碼如下:
lock (this){ Some statements ;}
·使用 Monitor
當有需要進行線程管理的時候可以使用:
Monitor.Enter(this);
其他也有一些方法進行管理,這里就不一一提及了。
線程的缺點
線程自然也有缺點,以下列出了一些:
·如果有大量的線程,會影響性能,因為操作系統需要在他們之間切換;
·更多的線程需要更多的內存空間;
·線程會給程序帶來更多的 bug,因此要小心使用;
·線程的中止需要考慮其對程序運行的影響;
·通常塊模型數據是在多個線程間共享的,需要一個合適的鎖系統替換掉數據共享;
ISO C++ 11 標準在 STL 中提供了 std::thread 類,因此多線程變得非常容易。
#include?<thread>
using?namespace?std;
void?threadFunc(){
//這里寫上線程的內容
}
int?main(){
thread?t(threadFunc);
//啟動線程
t.join();
//等待線程運行完畢
return?0;
}
超線程(HT)是英特爾所研發的一種技術,于 2002 年發布。超線程的英文是HT技術,全名為Hyper-Threading,中文又名超線程。超線程技術原先只應用于 Xeon 處理器中,當時稱為 Super-Threading。之后陸續應用在 Pentium 4 中,將技術主流化。早期代號為 Jackson。
通過此技術,英特爾成為第一間公司實現在一個實體處理器中,提供兩個邏輯線程。之后的 Pentium D 縱使不支援超線程技術,但就集成了兩個實體核心,所以仍會見到兩個邏輯線程。超線程的未來發展,是提升處理器的邏輯線程,英特爾有計劃將 8 核心的處理器,加以配合超線程技術,使之成為 16 個邏輯線程的產品。
英特爾表示,超線程技術讓(P4)處理器增加 5%的裸晶面積,就可以換來 15%~30%的效能提升。但實際上,在某些程式或未對多執行緒編譯的程式而言,超線程反而會降低效能。除此之外,超線程技術亦要操作系統的配合,普通支援多處理器技術的系統亦未必能充分發揮該技術。例如 Windows 2000,英特爾并不鼓勵使用者在此系統中利用超線程。原先不支援多核心的 Windows XPHome Edition 卻支援超線程技術。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
安卓平板怎么投屏到電腦?將平板電腦和電腦連接到同一個熱點,完成屏幕投影。安卓平板可以連接主機當顯示器用嗎?可以,但是比較麻煩。首先下載軟件(電腦和手機打包的),安裝電腦。電腦安裝運行后,屏幕會在這里閃幾次。閃爍后右下角會有一個灰色的雙屏圖標,然后用數據線連接平板。如果提示安裝驅動,可以用91助手等軟件安裝,然后在平板上運行軟件,點擊usb連接,等待即可。連接后,電腦右下角的灰標亮起。然后,你可以在...
北京到青島動車最快時間?最新的復興號高鐵G187北京南至青島北3小時40分d725次列車每天都有嗎?D725次列車是北京至青島北的空調動車組列車。這列火車每天都有。但目前停運,預計2022年11月初恢復正常運行。每天22: 42從北京站始發,途經大明湖、淄博、濰坊,次日6: 34到達青島北站。全程873公里,運行7小時52分鐘。d725次列車每天都有嗎?D725次列車每天發車。D725次列車從北京...
蚌埠醫學院郵編?地址:安徽省蚌埠市東海大道2600號,233030。蚌埠學院國慶放幾天?放七天假,10月1日到10月7日。蚌埠大學,位于安徽省蚌埠市,是教育部批準的以工、理、管、文、教、藝為主的普通本科院校[1]2004年,學校合并成立蚌埠學院、蚌埠教育學院、蚌埠職工大學,更名為蚌埠學院。2019年,學校正式納入安徽省省級碩士項目建設單位。蚌埠學院環境科學專業怎么樣?蚌埠學院的師資力量一般。環境科...