聊聊計(jì)算機(jī)內(nèi)部的東西--一對(duì)吵鬧的夫妻(CPU和RAM)

? ? ? 做為程序員大家天天都在不停的寫(xiě)各種各種程序,想著如何如何改變世界(曾經(jīng)我是這么想的祝迂,但是現(xiàn)在我還是這么想的)姐军。但我在工作中發(fā)現(xiàn)好多同事對(duì)計(jì)算機(jī)本身這個(gè)東西并不了解,尤其是cpu宇攻、內(nèi)存惫叛、網(wǎng)絡(luò)、磁盤等等逞刷。不知道他們是如何運(yùn)轉(zhuǎn)的嘉涌。這也不能怪我們,現(xiàn)在的高級(jí)語(yǔ)言對(duì)他們封裝的太好了夸浅,好到我們都不知道他們是否還存在了仑最。但是我編寫(xiě)的程序需要運(yùn)行在她們上面,一不小心我們就會(huì)被她們捉弄了(相信大家都有這樣的體會(huì)帆喇,網(wǎng)絡(luò)怎么慢了警医、磁盤IO怎么慢了、線程怎么被夯住了等等),解決這些問(wèn)題真的很辣手啊预皇。在開(kāi)發(fā)出高性能高可靠的程序的時(shí)候你要非常了解你的宿主服務(wù)器侈玄,我們?cè)谌粘9ぷ髦卸际窃诓煌5膲赫ノ覀兊乃拗鞣?wù)器(把寶寶都?jí)赫サ墓?i>瘦如柴,我都看不下去了)深啤。我分享一下我自己對(duì)計(jì)算機(jī)的一些認(rèn)識(shí)拗馒。

一、從cup到內(nèi)存的距離

? ? ? ? CPU是機(jī)器的心臟溯街,你的所有的程序最終都是由它來(lái)執(zhí)行和運(yùn)算的诱桂。主內(nèi)存(RAM)是你的數(shù)據(jù)(包括代碼行)存放的地方。本文將忽略硬件驅(qū)動(dòng)和網(wǎng)絡(luò)之類的東西呈昔,我們的程序的目標(biāo)是盡可能多的在內(nèi)存中運(yùn)行挥等。CPU和主內(nèi)存之間有好幾層緩存,因?yàn)榧词怪苯釉L問(wèn)主內(nèi)存也是非常慢的堤尾。如果你正在多次對(duì)一塊數(shù)據(jù)做相同的運(yùn)算肝劲,那么在執(zhí)行運(yùn)算的時(shí)候把它加載到離CPU很近的地方就有意義了。

cpu-memory

? ? ? ?越靠近CPU的緩存越快也越小郭宝。所以L1緩存很小但很快(譯注:L1表示一級(jí)緩存)辞槐,并且緊靠著在使用它的CPU內(nèi)核。L2大一些粘室,也慢一些榄檬,并且仍然只能被一個(gè)單獨(dú)的 CPU 核使用。L3在現(xiàn)代多核機(jī)器中更普遍衔统,仍然更大鹿榜,更慢,并且被單個(gè)插槽上的所有 CPU 核共享锦爵。最后舱殿,你擁有一塊主存,由全部插槽上的所有 CPU 核共享险掀。

cpu到各個(gè)緩存的時(shí)間:

cpu到各個(gè)緩存的時(shí)間

二沪袭、cup如何調(diào)戲內(nèi)存

? ? ? ?當(dāng)CPU執(zhí)行運(yùn)算的時(shí)候,它先去L1查找所需的數(shù)據(jù)樟氢,再去L2枝恋,然后是L3,最后如果這些緩存中都沒(méi)有嗡害,所需的數(shù)據(jù)就要去主內(nèi)存拿焚碌。走得越遠(yuǎn),運(yùn)算耗費(fèi)的時(shí)間就越長(zhǎng)霸妹。所以如果你在做一些很頻繁的事十电,你要確保數(shù)據(jù)在L1緩存中。當(dāng)這份數(shù)據(jù)運(yùn)行完整后CPU會(huì)把數(shù)據(jù)回寫(xiě)到主內(nèi)存中去。

? ? ? 數(shù)據(jù)在緩存中不是以獨(dú)立的項(xiàng)來(lái)存儲(chǔ)的鹃骂,如不是一個(gè)單獨(dú)的變量台盯,也不是一個(gè)單獨(dú)的指針。緩存是由緩存行組成的畏线,通常是64字節(jié)(譯注:這篇文章發(fā)表時(shí)常用處理器的緩存行是64字節(jié)的静盅,比較舊的處理器緩存行是32字節(jié)),并且它有效地引用主內(nèi)存中的一塊地址寝殴。一個(gè)Java的long類型是8字節(jié)蒿叠,因此在一個(gè)緩存行中可以存8個(gè)long類型的變量。非常奇妙的是如果你訪問(wèn)一個(gè)long數(shù)組蚣常,當(dāng)數(shù)組中的一個(gè)值被加載到緩存中市咽,它會(huì)額外加載另外7個(gè)。

問(wèn)題:如果同一份數(shù)據(jù)同時(shí)被兩個(gè)cup加載并且都緩存到各自的L1緩存中時(shí)抵蚊,如何保證這兩份數(shù)據(jù)的一致性施绎?

cpu有個(gè)緩存一致性協(xié)議,這類協(xié)議有MSI贞绳、MESI谷醉、MOSI及Dragon Protocol,基本的思想是cpu通過(guò)各種機(jī)制保證:當(dāng)一份在多cpu共享的數(shù)據(jù)冈闭,其中一個(gè)cpu有修改時(shí)并寫(xiě)回主內(nèi)存后孤紧,別的cpu緩存會(huì)無(wú)效,使用時(shí)會(huì)強(qiáng)制從主內(nèi)存加載拒秘。

緩存一致性協(xié)議

三、mmap技術(shù)

? ? ? ?當(dāng)我們?cè)诓僮饕粋€(gè)文件時(shí)臭猜,linux是這樣的:常規(guī)文件操作為了提高讀寫(xiě)效率和保護(hù)磁盤躺酒,使用了頁(yè)緩存機(jī)制。這樣造成讀文件時(shí)需要先將文件頁(yè)從磁盤拷貝到頁(yè)緩存中蔑歌,由于頁(yè)緩存處在內(nèi)核空間羹应,不能被用戶進(jìn)程直接尋址,所以還需要將頁(yè)緩存中數(shù)據(jù)頁(yè)再次拷貝到內(nèi)存對(duì)應(yīng)的用戶空間中次屠。這樣园匹,通過(guò)了兩次數(shù)據(jù)拷貝過(guò)程,才能完成進(jìn)程對(duì)文件內(nèi)容的獲取任務(wù)劫灶。寫(xiě)操作也是一樣裸违,待寫(xiě)入的buffer在內(nèi)核空間不能直接訪問(wèn),必須要先拷貝至內(nèi)核空間對(duì)應(yīng)的主存本昏,再寫(xiě)回磁盤中(延遲寫(xiě)回)供汛,也是需要兩次數(shù)據(jù)拷貝。而使用mmap操作文件中,創(chuàng)建新的虛擬內(nèi)存區(qū)域和建立文件磁盤地址和虛擬內(nèi)存區(qū)域映射這兩步怔昨,沒(méi)有任何文件拷貝操作雀久。而之后訪問(wèn)數(shù)據(jù)時(shí)發(fā)現(xiàn)內(nèi)存中并無(wú)數(shù)據(jù)而發(fā)起的缺頁(yè)異常過(guò)程,可以通過(guò)已經(jīng)建立好的映射關(guān)系趁舀,只使用一次數(shù)據(jù)拷貝赖捌,就從磁盤中將數(shù)據(jù)傳入內(nèi)存的用戶空間中,供進(jìn)程使用矮烹。


mmap

? ? ? ?mmap是一種內(nèi)存映射文件的方法越庇,即將一個(gè)文件或者其它對(duì)象映射到進(jìn)程的地址空間,實(shí)現(xiàn)文件磁盤地址和進(jìn)程虛擬地址空間中一段虛擬地址的一一對(duì)映關(guān)系擂送。實(shí)現(xiàn)這樣的映射關(guān)系后悦荒,進(jìn)程就可以采用指針的方式讀寫(xiě)操作這一段內(nèi)存,而系統(tǒng)會(huì)自動(dòng)回寫(xiě)臟頁(yè)面到對(duì)應(yīng)的文件磁盤上嘹吨,即完成了對(duì)文件的操作而不必再調(diào)用read,write等系統(tǒng)調(diào)用函數(shù)搬味。相反,內(nèi)核空間對(duì)這段區(qū)域的修改也直接反映用戶空間蟀拷,從而可以實(shí)現(xiàn)不同進(jìn)程間的文件共享碰纬。

? ? ? 如果大家有平凡的對(duì)文件的讀寫(xiě)操作建議使用mmap,現(xiàn)在各個(gè)高級(jí)語(yǔ)言已經(jīng)支持如java的MappedByteBuffer等∥史遥現(xiàn)在好多中間件的文件操作都是使用mmap技術(shù)悦析。

四、Zero-Copy技術(shù)

? ? ? ? 許多web應(yīng)用都會(huì)向用戶提供大量的靜態(tài)內(nèi)容此衅,這意味著有很多data從硬盤讀出之后强戴,會(huì)原封不動(dòng)的通過(guò)socket傳輸給用戶。這種操作看起來(lái)可能不會(huì)怎么消耗CPU挡鞍,但是實(shí)際上它是低效的:kernal把數(shù)據(jù)從disk讀出來(lái)骑歹,然后把它傳輸給user級(jí)的application,然后application再次把同樣的內(nèi)容再傳回給處于kernal級(jí)的socket墨微。這種場(chǎng)景下道媚,application實(shí)際上只是作為一種低效的中間介質(zhì),用來(lái)把disk file的data傳給socket翘县。


? ? ? ? data每次穿過(guò)user-kernel boundary挠蛉,都會(huì)被copy脉漏,這會(huì)消耗cpu箫柳,并且占用RAM的帶寬苍碟。幸運(yùn)的是,你可以用一種叫做Zero-Copy的技術(shù)來(lái)去掉這些無(wú)謂的copy忘伞。應(yīng)用程序用zero copy來(lái)請(qǐng)求kernel直接把disk的data傳輸給socket狗热,而不是通過(guò)應(yīng)用程序傳輸钞馁。Zero copy大大提高了應(yīng)用程序的性能,并且減少了kernel和user模式的上下文切換∧涔危現(xiàn)在各個(gè)高級(jí)語(yǔ)言已經(jīng)完美支持Zero-Copy技術(shù)僧凰,javaapi的java.nio.channel.FileChannel的transferTo()方法。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熟丸,一起剝皮案震驚了整個(gè)濱河市训措,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌光羞,老刑警劉巖绩鸣,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纱兑,居然都是意外死亡呀闻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門潜慎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捡多,“玉大人,你說(shuō)我怎么就攤上這事铐炫±菔郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵倒信,是天一觀的道長(zhǎng)科贬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)鳖悠,這世上最難降的妖魔是什么榜掌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮乘综,結(jié)果婚禮上憎账,老公的妹妹穿的比我還像新娘。我一直安慰自己瘾带,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布熟菲。 她就那樣靜靜地躺著看政,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抄罕。 梳的紋絲不亂的頭發(fā)上允蚣,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音呆贿,去河邊找鬼嚷兔。 笑死森渐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冒晰。 我是一名探鬼主播同衣,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼壶运!你這毒婦竟也來(lái)了耐齐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蒋情,失蹤者是張志新(化名)和其女友劉穎埠况,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體棵癣,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辕翰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狈谊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喜命。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖的畴,靈堂內(nèi)的尸體忽然破棺而出渊抄,到底是詐尸還是另有隱情,我是刑警寧澤丧裁,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布护桦,位于F島的核電站,受9級(jí)特大地震影響煎娇,放射性物質(zhì)發(fā)生泄漏二庵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一缓呛、第九天 我趴在偏房一處隱蔽的房頂上張望催享。 院中可真熱鬧,春花似錦哟绊、人聲如沸因妙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攀涵。三九已至,卻和暖如春洽沟,著一層夾襖步出監(jiān)牢的瞬間以故,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工裆操, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怒详,地道東北人炉媒。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像昆烁,于是被迫代替她去往敵國(guó)和親吊骤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容