多線程雙緩存
簡單來說就是多線程的時候,多線程同時修改同一個類的時候,由於訪問順序隨機導致類功能出錯,至於線程安全類設計方法很多的,Java可以用synchronize標識類,只允許一個線程在同一時間訪問它,選擇線程安全的數據類型例如ArrayList,數組是不安全的,你可以多去網路查!
㈡ 兩個同線程同頻率同緩存同核心數的CPU性能上是一樣的嗎
確實是事實穩定性下降,但有些處理器體質好,可以承受. ,超線程如果能把4線程用上,比雙線程快大約25%.但和同構架四核心確實沒法比.,很多程序用不到多線程 ,除非運行大量程序,否則多核心是雞肋,只有費電的作用,別看那CPU使用率低,其實能用上的處理器使用率早就滿了.i3 i5 i7和EXXXX 其實i沒有多大提升,同主頻核心線程下最多有15%.沒必要為了那一點性能換全套電腦
AMD性價比比較高,主板也相對便宜,好主板穩定性也不錯.E2200 和E5700 如果指令集一樣的話超頻 ,同主頻肯定是E2200比E5700略高因為有很多超頻的玩家都喜歡超外頻降低倍頻 .當然很多處理器的倍頻是完全鎖定的,或者是鎖定在一個范圍的,如果不鎖定范圍,那產品就沒有高價低價之分了.同構架 同核心的處理器成本基本一樣.
㈢ 三級緩存重要還是多線程重要
這問題有點象是高端雙核和中端四核一樣的對比。。。。沒有重要不重要,要看實際應用,現在的CPU甭管他有無三級緩存性能都已經非常強大了,實際應用就看你的具體使用習慣和應用軟體。。。。三級緩存普遍都是高端雙核或者高端四核採用了的,而超線程類似於加強多任務速度一樣,雖然是模擬雙核,但是畢竟多出一個模擬核心,在相對多任務環境中比起帶有三級緩存的CPU要有優勢。。。但是如果朋友沒有相對的多任務運行習慣,帶有三級緩存的CPU是你要首先考慮的,速度更加理想。。如果單就這個問題而言,三級換成重要性要比多線程重要,畢竟日常使用中多任務需求的朋友太少了,倒是非常注重單核心能力,很多朋友忽視三級緩存的重要性,三級緩存在運行大型軟體尤其是大型3D游戲時相比較不帶三級緩存的CPU優勢明顯,所以有高手戲稱速龍ⅡX4 6系就是一殘廢,很多對性能比較在意的都是直接選擇哪怕雙核的高端羿龍雙核產品,也不選擇速龍四核。。。。。還有不清楚,請你追問。。。真心希望能給你幫助!
㈣ 多核或者多線程CPU 緩存中命中的能同時使用嗎
可以,注意不要運行沖突軟體。
㈤ VC雙緩沖
你收到WM_PAINT消息是, 背景已經被WM_ERASEBKGND"擦"了.
你應該早些時候保存背景,到WM_PAINT時用.
㈥ 雙核和二級緩存
CPU緩存(Cache Memory)位於CPU與內存之間的臨時存儲器,它的容量比內存小但交換速度快。在緩存中的數據是內存中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可避開內存直接從緩存中調用,從而加快讀取速度。由此可見,在CPU中加入緩存是一種高效的解決方案,這樣整個內存儲器(緩存+內存)就變成了既有緩存的高速度,又有內存的大容量的存儲系統了。緩存對CPU的性能影響很大,主要是因為CPU的數據交換順序和CPU與緩存間的帶寬引起的。
緩存的工作原理是當CPU要讀取一個數據時,首先從緩存中查找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入緩存中,可以使得以後對整塊數據的讀取都從緩存中進行,不必再調用內存。
正是這樣的讀取機制使CPU讀取緩存的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在緩存中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先緩存後內存。
最早先的CPU緩存是個整體的,而且容量很低,英特爾公司從Pentium時代開始把緩存進行了分類。當時集成在CPU內核中的緩存已不足以滿足CPU的需求,而製造工藝上的限制又不能大幅度提高緩存的容量。因此出現了集成在與CPU同一塊電路板上或主板上的緩存,此時就把 CPU內核集成的緩存稱為一級緩存,而外部的稱為二級緩存。一級緩存中還分數據緩存(Data Cache,D-Cache)和指令緩存(Instruction Cache,I-Cache)。二者分別用來存放數據和執行這些數據的指令,而且兩者可以同時被CPU訪問,減少了爭用Cache所造成的沖突,提高了處理器效能。英特爾公司在推出Pentium 4處理器時,用新增的一種一級追蹤緩存替代指令緩存,容量為12KμOps,表示能存儲12K條微指令。
隨著CPU製造工藝的發展,二級緩存也能輕易的集成在CPU內核中,容量也在逐年提升。現在再用集成在CPU內部與否來定義一、二級緩存,已不確切。而且隨著二級緩存被集成入CPU內核中,以往二級緩存與CPU大差距分頻的情況也被改變,此時其以相同於主頻的速度工作,可以為CPU提供更高的傳輸速度。
二級緩存是CPU性能表現的關鍵之一,在CPU核心不變化的情況下,增加二級緩存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二級緩存上有差異,由此可見二級緩存對於CPU的重要性。
CPU在緩存中找到有用的數據被稱為命中,當緩存中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問內存。從理論上講,在一顆擁有二級緩存的CPU中,讀取一級緩存的命中率為80%。也就是說CPU一級緩存中找到的有用數據占數據總量的80%,剩下的20%從二級緩存中讀取。由於不能准確預測將要執行的數據,讀取二級緩存的命中率也在80%左右(從二級緩存讀到有用的數據占總數據的16%)。那麼還有的數據就不得不從內存調用,但這已經是一個相當小的比例了。目前的較高端的CPU中,還會帶有三級緩存,它是為讀取二級緩存後未命中的數據設計的—種緩存,在擁有三級緩存的CPU中,只有約5%的數據需要從內存中調用,這進一步提高了CPU的效率。
為了保證CPU訪問時有較高的命中率,緩存中的內容應該按一定的演算法替換。一種較常用的演算法是「最近最少使用演算法」(LRU演算法),它是將最近一段時間內最少被訪問過的行淘汰出局。因此需要為每行設置一個計數器,LRU演算法是把命中行的計數器清零,其他各行計數器加1。當需要替換時淘汰行計數器計數值最大的數據行出局。這是一種高效、科學的演算法,其計數器清零過程可以把一些頻繁調用後再不需要的數據淘汰出緩存,提高緩存的利用率。
CPU產品中,一級緩存的容量基本在4KB到64KB之間,二級緩存的容量則分為128KB、256KB、512KB、1MB、2MB等。一級緩存容量各產品之間相差不大,而二級緩存容量則是提高CPU性能的關鍵。二級緩存容量的提升是由CPU製造工藝所決定的,容量增大必然導致CPU內部晶體管數的增加,要在有限的CPU面積上集成更大的緩存,對製造工藝的要求也就越高。
雙核心CPU的二級緩存比較特殊,和以前的單核心CPU相比,最重要的就是兩個內核的緩存所保存的數據要保持一致,否則就會出現錯誤,為了解決這個問題不同的CPU使用了不同的辦法:
Intel雙核心處理器的二級緩存
目前Intel的雙核心CPU主要有Pentium D、Pentium EE、Core Duo三種,其中Pentium D、Pentium EE的二級緩存方式完全相同。Pentium D和Pentium EE的二級緩存都是CPU內部兩個內核具有互相獨立的二級緩存,其中,8xx系列的Smithfield核心CPU為每核心1MB,而9xx系列的Presler核心CPU為每核心2MB。這種CPU內部的兩個內核之間的緩存數據同步是依靠位於主板北橋晶元上的仲裁單元通過前端匯流排在兩個核心之間傳輸來實現的,所以其數據延遲問題比較嚴重,性能並不盡如人意。
Core Duo使用的核心為Yonah,它的二級緩存則是兩個核心共享2MB的二級緩存,共享式的二級緩存配合Intel的「Smart cache」共享緩存技術,實現了真正意義上的緩存數據同步,大幅度降低了數據延遲,減少了對前端匯流排的佔用,性能表現不錯,是目前雙核心處理器上最先進的二級緩存架構。今後Intel的雙核心處理器的二級緩存都會採用這種兩個內核共享二級緩存的「Smart cache」共享緩存技術。
AMD雙核心處理器的二級緩存
Athlon 64 X2 CPU的核心主要有Manchester和Toledo兩種,他們的二級緩存都是CPU內部兩個內核具有互相獨立的二級緩存,其中,Manchester核心為每核心512KB,而Toledo核心為每核心1MB。處理器內部的兩個內核之間的緩存數據同步是依靠CPU內置的System Request Interface(系統請求介面,SRI)控制,傳輸在CPU內部即可實現。這樣一來,不但CPU資源佔用很小,而且不必佔用內存匯流排資源,數據延遲也比Intel的Smithfield核心和Presler核心大為減少,協作效率明顯勝過這兩種核心。不過,由於這種方式仍然是兩個內核的緩存相互獨立,從架構上來看也明顯不如以Yonah核心為代表的Intel的共享緩存技術Smart Cache。
甲方:我在Windows XP操作系統中運行一款3D游戲時,卻突然看到系統托盤區中彈出「虛擬內存不足」這樣的提示。聯想到以前也曾出現過此種問題,我該如何去解決呢?
乙方:虛擬內存是將一部分硬碟空間來充當內存使用,雖然硬碟的運行速度不能與內存相比,可是容量卻要比內存的容量高出許多。其作用在於可將一些讀取到內存中卻暫時不用的數據轉移到虛擬內存中,這樣便可釋放出內存的空間,將有限的內存空間去繼續存放未被讀取的數據。
當出現虛擬內存不足的提示時,若不加以解決,那麼便會影響到系統運轉的效率。此時將虛擬內存的初始值和最大值設置為同一值,這樣就可以大大提高系統的性能。
丙方:乙方所說的解決方法有誤。這是因為如果將虛擬內存的初始值和最大值都設為兩個相同的數值,那麼在初始頁面文件很大的情況下,也許正好會讀取內存中一個容量較小的數據文件,這樣它在虛擬內存中所佔比例就越低,執行的速度也就越慢。而如果虛擬內存的初始頁面很少,那麼當數據超過初始頁面文件的容量時,就會自動溢出到最大頁面文件,但由於最大頁面文件的容量與初始頁面文件的容量相同,這樣發生內存溢出的錯誤也在所難免了。
所以我們在設置虛擬內存大小時,應當將初始頁面文件設得較小的容量,這樣才能在內存中盡可能地存儲更多數據,使其效率提高,同時也應提高最大頁面文件的容量,防止「虛擬內存不足」的提示再次出現。
㈦ C++建立兩個內存緩沖區 通過多線程共享內存進行讀寫
一旦shmget創建成功了,或者attach成功了。調用shmget會給你返回一個地址的,然後通過引用這個指針直接讀取數據。和其它的應用一樣。
例如
#define PERM S_IRUSR|S_IWUSR
int main(int argc,char **argv)
{
int shmid;
char *p_addr,*c_addr;
if(argc!=2)
{
fprintf(stderr,"Usage:%s\n\a",argv[0]);
exit(1);
}
if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)
{
fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));
exit(1);
}
if(fork())
{
p_addr=shmat(shmid,0,0);
memset(p_addr,'\0',1024);
strncpy(p_addr,argv[1],1024);
exit(0);
}
else
{
c_addr=shmat(shmid,0,0);
printf("Client get %s",c_addr);
exit(0);
}
}
復制代碼
㈧ 線程和緩存是什麼意思
線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以並發執行。由於線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
緩存是指臨時文件交換區,電腦把最常用的文件從存儲器里提出來臨時放在緩存里,就像把工具和材料搬上工作台一樣,這樣會比用時現去倉庫取更方便。因為緩存往往使用的是RAM(斷電即掉的非永久儲存),所以在忙完後還是會把文件送到硬碟等存儲器里永久存儲。電腦里最大的緩存就是內存條,緩存的大小與速度是直接關繫到硬碟的傳輸速度的重要因素,能夠大幅度地提高硬碟整體性能。
㈨ 什麼是雙線程
>? 我剛回答的管理員沒通過?
糾正下你說的,應該是超線程技術
2003 年,Intel在自家的至強上應用了新的技術:超線程技術,
超線程技術是在一顆CPU同時執行多個程序而共同分享一顆CPU內的資源,理論上能像兩顆CPU一樣在同一時間執行兩個線程,這樣,處理器需要多加入一個邏輯處理單元,而其餘部分如整數運算單元(ALU)、浮點運算單元(FPU)、二級緩存(L2 Cache)則保持不變,這些部分是被分享的。
雖然採用超線程技術能同時執行兩個線程,但它並不像兩個真正的CPU那樣,每個CPU都具有獨立的資源。當兩個線程都同時需要某一個資源時,其中一個要暫時停止,並讓出資源,直到這些資源閑置後才能繼續。因此超線程的性能並不等於兩顆CPU的性能。
雙內核處理器因為具有兩個完整的內核,所以同時可以進行兩個整數或者兩個浮點運算,這樣極大的提高了系統的利用效率,從而推動了系統性能的提升。
所以還是雙核好一點
㈩ 怎麼在C/C++程序中運用雙緩存,雙線程的大規模數據處理方法
無語了,又是你。。。
緩存在程序里就是依據程序需要申請的一段程序空間,可以用數組,可以用隊列,也可以用鏈表。你說的queue<>是STL提供的已經搭好框架的隊列。
具體需要怎樣的緩存要看你的程序需要。
我舉個例子,假如我是HTTP伺服器程序,每秒收到多個HTTP請求,我會用多進程(多進程比多線程穩定)或者多線程來處理各個請求,主進程等待HTTP服務埠來數據,每來一個請求就起一個線程去處理它。來的數據我就可以放在一個 queue<char*>的數據結構里,這個就是緩存了。每個線程我都傳個指針給他,讓線程自己去訪問其中一個緩存,取出HTTP請求做分析。而隊列中的其他緩存可以繼續接受數據。
創建線程的方法對操作系統有一定的依賴,在windows上一般是用CreateThread以及其相關函數,你可以查MSDN得到更詳細的信息,或者直接網路。在linux或者unix上,一般用folk來起進程,pthread線程庫(例如pthread_create)來操作線程。不過也有不用線程技術,用select epoll等技術的。這些你可以自己查到相應的例子。
希望這些對你有幫助。