有人會問,為什么要講CPU的內(nèi)存架構(gòu)呢轩性?代碼的運(yùn)行他離不開CUP赏廓,理解好CUP內(nèi)存架構(gòu),才能明白Java虛擬機(jī)是如何和CUP聯(lián)合工作的愚铡。So,這篇文章給大家粗淺的來講解一下CPU的內(nèi)存架構(gòu)蛉签,如有不當(dāng)之處,還忘各位讀者指正……
來一張沥寥,現(xiàn)在大多數(shù)計(jì)算機(jī)硬件架構(gòu)的簡圖:
現(xiàn)在的計(jì)算機(jī)碍舍,基本都是多個CPU,并且有些CPU還是多核的邑雅,因此你的Java程序中片橡,每個CUP執(zhí)行一個線程,并且倆個或者倆個以上的CPU在同時執(zhí)行任務(wù)淮野,這種情況就是我么所說的:并發(fā)捧书。
什么是寄存器,點(diǎn)擊訪問骤星,百度百科:寄存器
每個CPU都有自己的寄存器经瓷,CPU在寄存器上執(zhí)行操作的速度,遠(yuǎn)遠(yuǎn)大于在主內(nèi)存中洞难。
每個CPU還有自己的高速緩存層舆吮,CPU訪問緩存層的速度快于訪問主存的速度,但比訪問內(nèi)部寄存器的速度還要慢一點(diǎn)廊营。
一個計(jì)算機(jī)還包含一個主存歪泳。所有的CPU都可以訪問主存。主存通常比CPU中的緩存大得多露筒。
通常情況下呐伞,當(dāng)CPU需要讀取主內(nèi)存的時候,他會將部分?jǐn)?shù)據(jù)讀到慎式,CPU緩存中伶氢,甚至可以將CPU緩存中的部分?jǐn)?shù)據(jù)讀到寄存器中趟径,然后在寄存器中操作,操作完成后癣防,需要將數(shù)據(jù)寫入主存中的時候蜗巧,先將數(shù)據(jù)刷新至CPU緩存中,然后在某個時間點(diǎn)將數(shù)據(jù)刷新到主存中蕾盯。
當(dāng)CPU需要在緩存層存放一些東西的時候幕屹,存放在緩存中的內(nèi)容通常會被刷新回主存。CPU緩存可以在某一時刻將數(shù)據(jù)局部寫到它的內(nèi)存中级遭,和在某一時刻局部刷新它的內(nèi)存望拖。它不會再某一時刻讀/寫整個緩存。
For example:
int i=i+1
當(dāng)線程執(zhí)行這個語句時挫鸽,會先從主內(nèi)存中讀取i的值说敏,然后復(fù)制一份到CPU的高速緩存中,然后CPU執(zhí)行指令對i進(jìn)行加1的操作丢郊,然后將數(shù)據(jù)寫入高速緩存盔沫,最后將最新的i值刷新到主存當(dāng)重。