物理計算機中的併發問題和jvm中的情況有很多相似之處,jvm的併發解決方案也很大的參考了物理機的實現。在計算機中,絕大多數的運算任務都不可能只靠處理器"計算"就能完成,處理器(cpu)至少要與記憶體(memory)互動,如讀取運算資料、儲存運算結果等,這些i/o操作是很難消除的。也就是說,cpu要完成計算,就必須要和儲存裝置(memory)打交道,然而記憶體與處理器的運算速度有幾個數量級的差距。由於記憶體讀寫速度太慢,不能及時提供資料給cpu進行計算,會大大降低cpu的處理效率。為了解決cpu和記憶體(memory)之間的速度匹配問題,現代計算機系統不得不加入一層讀寫速度盡可能接近cpu運算速度的快取記憶體(cache)來作為記憶體與cpu之間的緩衝:將運算需要使用到的資料複製到快取(cache)中,讓運算能快速進行,當運算結束後再從快取(cache)同步回記憶體(memory)之中,這樣cpu就無須等待緩慢的記憶體讀寫了。基於快取記憶體的儲存互動很好的解決了cpu與記憶體的速度矛盾,但也為計算機系統帶來更高的複雜度,因為它引入了乙個新的問題:快取一致性(cache coherence)。在多處理器系統中,每個cpu都有自己的快取記憶體,而它們又共享同乙個主存(main memory)。當多個cpu的運算任務都涉及同一塊主記憶體區域時,將可能導致各自的快取資料不一致,如果真的發生這種情況,同步回到主存時以哪個cpu的快取資料為準呢?為了解決一致性的問題,需要各個處理器訪問快取時都遵循一些協議,在讀寫時要根據協議來進行操作,這些協議有'msi、mesi、mosi、synapse、firefly'等。
除了增加快取記憶體外,為了使得cpu內部的運算單元能盡量被充分利用,cpu可能會對輸入**進行亂序執行(out-of-order-execution)優化,cpu會在計算之後將亂序執行的結果重組,保證該結果與順序執行的結果是一致的,但並不保證程式中各個語句計算的先後順序與輸入**中的順序一致,因此,如果存在乙個計算任務依賴另外乙個計算任務的中間結果,那麼其順序性並不能靠**的先後順序來保證。
互動關係圖
cpu要讀取乙個資料時,首先從快取中查詢,如果找到就立即讀取並送給cpu處理;如果沒有找到,就從記憶體中讀取並送給cpu處理,同時把這個資料所在的資料塊放入快取中,可以使得以後對整塊資料的讀取都從快取中進行,不必再呼叫記憶體。這樣的讀取機制使cpu讀取快取的命中率非常高,大多數cpu可達到90%左右。也就是說cpu下一次要讀取的資料90%都在快取中,只有大約10%需要從記憶體讀取。這大大節省了cpu直接讀取記憶體的時間,也使cpu讀取資料時基本無需等待。總的來說,cpu讀取資料的順序是先快取後記憶體。cpu在快取中找到有用的資料被稱為命中,當快取中沒有cpu所需的資料時(未命中),這時cpu才訪問記憶體。從理論上講,在一顆擁有二級快取的cpu中,讀取一級快取的命中率為80%。也就是說cpu一級快取中找到的有用資料佔資料總量的80%,剩下的20%從二級快取中讀取。有的cpu甚至會有**快取,這樣做的目的是提高命中率,儘量減少直接從記憶體中讀取資料。
計算機中的編碼問題
2017 06 25 19 46 48 計算機中存在著很多編碼,諸如ascii,gbk,iso,utf 8,utf 16等,那這些編碼到底是怎麼產生,又有什麼區別呢?字元的含義 字元就是一系列有意義的圖形,如 a,u等等。該開始的時候,是美國人發明了計算機語言,英文本母只有26個,加上加減乘除,阿拉...
計算機中的位元組序問題
地點 基地 程式設計中的資料型別有很多事跨多個位元組的,比如char是用乙個位元組表示,而諸如int,float型別則用4個位元組表示double則用8個位元組表示,我們知道,資料物件例項是儲存在一定位址單元中的,我們也知道,儲存器中的每個位元組都由乙個唯一的位址標誌或者是儲存。那麼當資料物件跨多個...
計算機中的定址
電腦的位數通常是指cpu的處理位數,這個不是靠位址匯流排來決定的,這個位數指的是cpu 通用暫存器的資料寬度,即cpu一次運算可以處理的資料bit長度。前面所說的是記憶體空間足夠的情況,下面用過一道軟考題目解釋記憶體空間 定址範圍的情況 某計算機字長32位,儲存容量8mb。按字編址,其定址範圍為 0...