租用幫助
我以前有一臺2核4線程的新加坡云主機,部署了網站,順便還可以幫朋友掛一個網站。那新加坡免備案空間中,2核4線是什么意思?其實:一個核上,假如有三個線程A,B,C。每一個都跑1秒,等待2秒。顯然,他們如果排隊排的剛好就能把這個核心擠滿了。2個的核就是*2=8個線程了。當然,實際情況不管有多少線程,都不能排除某個時刻所有線程都pending的情況。
2核4線程服務器測試:http://www.bxgb88.com/dedicated/singapore.html
大部分操作系統都支持多進程并發運行:你一邊使用站長工具挖掘關鍵詞,一邊打開網頁在查友商網站,同時還開著英雄聯盟······還沒完,每臺電腦運行時還有大量的底層支撐性程序在后臺運行······這些進程看上去像是在同時工作。真相是,對于一個CPU而言,他在某個時間點只能執行一個程序,即一個進程,其實CPU是不斷地在這些進程間輪換執行的,由于執行速度相對人的感覺來說過快,所以我們感覺不到而已。
而我們要談的多線程,則是多進程概念的擴展。操作系統可以同時執行多個任務,每個任務就是進程;進程可以同時執行多個任務,每個任務就是線程。
1、線程是進程的組成部分,一個進程可以擁有多個線程,一個線程必須有一個父進程。線程可以擁有自己的堆棧,自己的程序計數器和自己的局部變量,但不擁有系統資源,它與父進程的其他線程共享該進程所擁有的全部資源。因為多個線程共享父進程里的全部資源,因此編程更加方便,但必須更加小心。
2、線程可以完成一定的任務,可以與其他線程共享父進程中的共享變量及部分環境,相互之間協調來完成進程所要完成的任務。線程是獨立運行的,它并不知道進程中是否還有其他線程存在。線程的執行時搶占式的,也就是說,當前運行的線程在任何時候都可能被掛起,以便另外一個線程可以運行。
從邏輯角度來看,多線程存在于一個應用程序中,讓一個應用程序中可以有多個執行部分同時執行,但操作系統無須將多個線程看作多個獨立的應用,對多線程實現調度和管理以及資源分配。線程的調度和管理由進程本身負責完成。
總結起來,使用多線程編程具有以下優點:
(1)進程之間不能共享內存,但線程之間可以,且十分容易
(2)系統創建進程是需要為該進程重新分配系統資源,但創建線程則代價小得多,因此使用多線程來實現多任務并發比多進程的效率高。
多線程的實際應用:
(1)一個瀏覽器必須能同時下載多個圖片
(2)一個web服務器必須能同時相應多個用戶請求
(3)Java虛擬機本身就在后臺提供了一個超級線程來進行垃圾回收
一般來說,最容易實現和調試的寫法是,你開一個線程專門讀文件,一個線程專門寫文件,然后你自己把所有的讀寫都queue進這兩個線程里。剩下的,你的CPU有4個線程,你就開8個線程做計算。如果計算比讀寫文件慢的話,那理應100%占用CPU的。多線程主要作用是用來填補io,memory等長延時操作。
多線程服務器的劣勢:
1、是結構復雜,需要更多的晶體管邏輯,功耗會變大。
2、多線程會共享cache and tlb。 本來L1 cache就捉襟見肘,多一個線程就多分走一份。
對于一般的desktop/server應用單核雙線程是最經濟的配置。2核4線程已經足夠大部分中小網站運營, 4,8線程的處理器都是在一些特殊應用場景(e,g,包處理,high throughput,io intensive)需要程序員去fine tuning才能發揮最佳效能。