偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

避免“卡脖子”!如何減少內(nèi)存I/O延遲對程序的影響?

存儲 數(shù)據(jù)管理
單來說,內(nèi)存 IO 就像是計算機的 “數(shù)據(jù)高速公路”,負責(zé)在內(nèi)存和其他設(shè)備(如硬盤、CPU 等)之間傳輸數(shù)據(jù)。它的速度和效率直接影響著計算機系統(tǒng)的整體性能。

你有沒有想過,當你點擊電腦上的一個應(yīng)用程序,它是如何瞬間啟動并開始運行的?當你在玩一款大型游戲時,那些精美的畫面和流暢的動作又是如何快速呈現(xiàn)在你眼前的?其實,這背后都離不開一個關(guān)鍵的技術(shù) —— 內(nèi)存 IO。

簡單來說,內(nèi)存 IO 就像是計算機的 “數(shù)據(jù)高速公路”,負責(zé)在內(nèi)存和其他設(shè)備(如硬盤、CPU 等)之間傳輸數(shù)據(jù)。它的速度和效率直接影響著計算機系統(tǒng)的整體性能。想象一下,如果這條 “高速公路” 擁堵不堪,數(shù)據(jù)傳輸緩慢,那么我們使用電腦時就會明顯感覺到卡頓和延遲,無論是工作、學(xué)習(xí)還是娛樂,體驗都會大打折扣。 接下來,就讓我們一起深入探索內(nèi)存 IO 的原理,揭開它神秘的面紗。

一、內(nèi)存IO的硬件基礎(chǔ)

1.1 CPU與內(nèi)存的 “親密接觸”

在計算機的硬件世界里,CPU 和內(nèi)存是兩個至關(guān)重要的組件,它們之間的協(xié)同工作對于計算機的性能起著決定性的作用。那么,CPU 是如何與內(nèi)存進行連接和通信的呢?這就涉及到內(nèi)存控制器(IMC,Integrated Memory Controller)和 DDR PHY 等硬件組件 。

內(nèi)存控制器就像是 CPU 與內(nèi)存之間的 “交通樞紐”,它負責(zé)管理內(nèi)存的訪問、地址解碼以及數(shù)據(jù)的傳輸?shù)戎匾蝿?wù)。在早期的計算機系統(tǒng)中,內(nèi)存控制器通常位于主板芯片組的北橋芯片內(nèi)部,CPU 要和內(nèi)存進行數(shù)據(jù)交換,需要經(jīng)過 “CPU-- 北橋 -- 內(nèi)存 -- 北橋 --CPU” 五個步驟,這種模式下數(shù)據(jù)延遲較大,影響了計算機系統(tǒng)的整體性能。后來,AMD 在 K8 系列 CPU 中率先將內(nèi)存控制器整合到 CPU 內(nèi)部,數(shù)據(jù)交換過程簡化為 “CPU-- 內(nèi)存 --CPU” 三個步驟,大大降低了傳輸延遲。如今,現(xiàn)代處理器大多采用了集成內(nèi)存控制器的設(shè)計,這使得 CPU 能夠更快地響應(yīng)內(nèi)存請求,提高了內(nèi)存訪問的速度。

而 DDR PHY(DDR Physical Layer)則是連接 DDR 內(nèi)存條和內(nèi)存控制器的橋梁,它主要承擔著命令及數(shù)據(jù)傳輸、提供鏈路延時以及控制邏輯等功能。在數(shù)據(jù)傳輸過程中,DDR PHY 需要把 DDRC(DDR Controller,DDR 控制器)邏輯電路系統(tǒng)時鐘域的命令及數(shù)據(jù),和 DRAM(Dynamic Random Access Memory,動態(tài)隨機存取存儲器,即我們常說的內(nèi)存)接口時鐘域的命令及數(shù)據(jù)進行相互轉(zhuǎn)換和透傳,確保數(shù)據(jù)能夠準確無誤地在 CPU 和內(nèi)存之間傳輸。同時,它還通過模擬電路實現(xiàn)可配置大小的鏈路延時,對 DRAM 接口并行的命令、數(shù)據(jù)信號進行延時控制,并通過數(shù)字邏輯實現(xiàn)對 DRAM 接口并行的命令、數(shù)據(jù)信號進行 training(校準),以調(diào)整相互相位關(guān)系,達到可靠的通信質(zhì)量。

1.2內(nèi)存的微觀世界:顆粒與矩陣

當我們打開電腦主機,看到內(nèi)存條上那些黑色的小方塊,它們就是內(nèi)存顆粒(Chip),這些顆粒是內(nèi)存的核心組成部分,也是數(shù)據(jù)存儲的基本單元。但內(nèi)存的物理結(jié)構(gòu)遠比我們看到的要復(fù)雜得多,它還包括 Rank、Bank 以及內(nèi)部電容矩陣結(jié)構(gòu)等。

在內(nèi)存中,Rank 指的是屬于同一個組的 Chip 的總和。這些 Chip 并行工作,共同組成一個 64bit(對于支持 ECC 功能的內(nèi)存是 72bit)的數(shù)據(jù)集合,供 CPU 來同時讀取。通常一個通道(channel)能夠同時讀寫 64bit 的數(shù)據(jù),這就意味著如果單個內(nèi)存顆粒的位寬(例如常見的 4bit、8bit 或 16bit )不足 64bit,就需要多個顆粒并聯(lián)起來組成一個 Rank。比如,對于位寬為 8bit 的顆粒,就需要 8 個 Chip 來組成一個 Rank,以滿足 CPU 的數(shù)據(jù)讀寫需求。

而在每個內(nèi)存顆粒內(nèi)部,又包含了多個 Bank??梢园?Bank 想象成是內(nèi)存顆粒中的一個獨立存儲區(qū)域,每個 Bank 內(nèi)部是一個電容的行列矩陣結(jié)構(gòu)。這個矩陣由多個方塊狀的元素構(gòu)成,每個方塊元素就是內(nèi)存管理的最小單位,也叫內(nèi)存顆粒位寬。當內(nèi)存進行尋址時,就是通過指定行地址(Row Address)和列地址(Column Address),來準確地定位到矩陣中的某個存儲單元(CELL),從而實現(xiàn)數(shù)據(jù)的讀寫操作。例如,當 CPU 需要讀取內(nèi)存中的某個數(shù)據(jù)時,內(nèi)存控制器會將地址信號發(fā)送給內(nèi)存顆粒,內(nèi)存顆粒根據(jù)地址信號中的行地址和列地址,找到對應(yīng)的存儲單元,然后將數(shù)據(jù)返回給 CPU。

從內(nèi)存控制器到內(nèi)存顆粒內(nèi)部的電容矩陣結(jié)構(gòu),這些硬件組件相互協(xié)作,共同構(gòu)建了內(nèi)存 IO 的硬件基礎(chǔ),為計算機系統(tǒng)的數(shù)據(jù)存儲和傳輸提供了堅實的保障。了解這些硬件基礎(chǔ),有助于我們更好地理解內(nèi)存 IO 的工作原理以及如何優(yōu)化計算機系統(tǒng)的內(nèi)存性能。

1.3 什么是IO?

在計算機操作系統(tǒng)中,所謂的I/O就是 輸入(Input)和輸出(Output),也可以理解為讀(Read)和寫(Write),針對不同的對象,I/O模式可以劃分為磁盤IO模型和網(wǎng)絡(luò)IO模型。

IO操作會涉及到用戶空間內(nèi)核空間的轉(zhuǎn)換,先來理解以下規(guī)則:

  • 內(nèi)存空間分為用戶空間和內(nèi)核空間,也稱為用戶緩沖區(qū)和內(nèi)核緩沖區(qū);
  • 用戶的應(yīng)用程序不能直接操作內(nèi)核空間,需要將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間才能使用;
  • 無論是read操作,還是write操作,都只能在內(nèi)核空間里執(zhí)行;
  • 磁盤IO和網(wǎng)絡(luò)IO請求加載到內(nèi)存的數(shù)據(jù)都是先放在內(nèi)核空間的;

再來看看所謂的讀(Read)和寫(Write)操作:

  • 讀操作:操作系統(tǒng)檢查內(nèi)核緩沖區(qū)有沒有需要的數(shù)據(jù),如果內(nèi)核緩沖區(qū)已經(jīng)有需要的數(shù)據(jù)了,那么就直接把內(nèi)核空間的數(shù)據(jù)copy到用戶空間,供用戶的應(yīng)用程序使用。如果內(nèi)核緩沖區(qū)沒有需要的數(shù)據(jù),對于磁盤IO,直接從磁盤中讀取到內(nèi)核緩沖區(qū)(這個過程可以不需要cpu參與)。而對于網(wǎng)絡(luò)IO,應(yīng)用程序需要等待客戶端發(fā)送數(shù)據(jù),如果客戶端還沒有發(fā)送數(shù)據(jù),對應(yīng)的應(yīng)用程序?qū)蛔枞?,直到客戶端發(fā)送了數(shù)據(jù),該應(yīng)用程序才會被喚醒,從Socket協(xié)議找中讀取客戶端發(fā)送的數(shù)據(jù)到內(nèi)核空間,然后把內(nèi)核空間的數(shù)據(jù)copy到用戶空間,供應(yīng)用程序使用。
  • 寫操作:用戶的應(yīng)用程序?qū)?shù)據(jù)從用戶空間copy到內(nèi)核空間的緩沖區(qū)中(如果用戶空間沒有相應(yīng)的數(shù)據(jù),則需要從磁盤—>內(nèi)核緩沖區(qū)—>用戶緩沖區(qū)依次讀?。?,這時對用戶程序來說寫操作就已經(jīng)完成,至于什么時候再寫到磁盤或通過網(wǎng)絡(luò)發(fā)送出去,由操作系統(tǒng)決定。除非應(yīng)用程序顯示地調(diào)用了sync 命令,立即把數(shù)據(jù)寫入磁盤,或執(zhí)行flush()方法,通過網(wǎng)絡(luò)把數(shù)據(jù)發(fā)送出去。

二、內(nèi)存IO的工作流程

2.1從請求到響應(yīng):數(shù)據(jù)的驚險之旅

當 CPU 需要從內(nèi)存中讀取數(shù)據(jù)時,內(nèi)存 IO 的過程就正式啟動了,這一過程仿佛一場驚險刺激的冒險,數(shù)據(jù)在各個環(huán)節(jié)中穿梭,每一步都關(guān)乎著計算機系統(tǒng)的運行效率 。

首先是行地址預(yù)充電(tRP,Row Precharge Time),這是內(nèi)存操作的起始步驟。當內(nèi)存完成上一次的讀寫操作后,需要對行地址進行預(yù)充電,以便為下一次的訪問做好準備。這個過程就像是運動員在比賽前的熱身,雖然看似簡單,但卻必不可少。tRP 的時間長短以時鐘周期為單位,它決定了內(nèi)存從一次操作結(jié)束到下一次行激活開始之間的等待時間。在現(xiàn)代內(nèi)存中,tRP 通常是幾個時鐘周期,例如對于 DDR4 內(nèi)存,tRP 的值可能在 10 - 20 個時鐘周期左右,具體數(shù)值取決于內(nèi)存的規(guī)格和工作頻率。

完成行地址預(yù)充電后,接下來就是打開行內(nèi)存(tRCD,Row Address to Column Address Delay)。這一步驟是內(nèi)存訪問的關(guān)鍵環(huán)節(jié),它需要花費一定的時間來激活指定的行地址,并將該行的數(shù)據(jù)加載到行緩沖器(Row Buffer)中。tRCD 的延遲時間同樣以時鐘周期計算,它表示從發(fā)出行地址到可以訪問該行中的列數(shù)據(jù)之間所需的最小時鐘周期數(shù)。一般來說,tRCD 的值會比 tRP 略長一些,對于 DDR4 內(nèi)存,tRCD 可能在 12 - 25 個時鐘周期之間。這就好比在一個大型圖書館中,要找到特定書架上的某本書,首先需要確定書架的位置(行地址),然后才能在書架上查找具體的書籍(列地址),這個確定書架位置的過程就類似于打開行內(nèi)存的操作,需要一定的時間。

當行內(nèi)存打開并將數(shù)據(jù)加載到行緩沖器后,就可以發(fā)送列地址(CL,Column Address Latency)了。CL 指的是從發(fā)送列地址到內(nèi)存開始返回數(shù)據(jù)之間的周期數(shù),它是內(nèi)存延遲的一個重要參數(shù)。CL 的值越小,說明內(nèi)存響應(yīng)速度越快,能夠更快地將數(shù)據(jù)返回給 CPU。例如,常見的 DDR4 內(nèi)存的 CL 值可能在 15 - 20 之間,不同品牌和型號的內(nèi)存,CL 值會有所差異。這就像你在網(wǎng)上購物下單后,商家發(fā)貨的速度有快有慢,CL 值就反映了內(nèi)存 “發(fā)貨”(返回數(shù)據(jù))的快慢程度。

最后,經(jīng)過前面一系列的操作,數(shù)據(jù)終于從內(nèi)存中返回給 CPU。CPU 接收到數(shù)據(jù)后,會將其放入自己的緩存(Cache)中,以便后續(xù)能夠更快速地訪問和處理。整個內(nèi)存 IO 的過程,從 CPU 發(fā)出請求到數(shù)據(jù)返回,雖然看似短暫,但卻涉及多個復(fù)雜的步驟和精確的時間控制,任何一個環(huán)節(jié)的延遲都可能影響到計算機系統(tǒng)的整體性能。

2.2隨機IO與順序 IO:速度的較量

在內(nèi)存 IO 中,數(shù)據(jù)的訪問方式主要分為隨機 IO 和順序 IO,這兩種訪問方式就像是兩個不同風(fēng)格的運動員,在速度上展開了激烈的較量。

順序 IO 是指按照連續(xù)的地址順序?qū)?nèi)存進行訪問,就像你在書架上依次取出相鄰位置的書籍一樣。這種訪問方式的特點是數(shù)據(jù)的讀取或?qū)懭胧沁B續(xù)的,內(nèi)存可以充分利用其預(yù)取機制,提前將后續(xù)可能需要的數(shù)據(jù)加載到行緩沖器中,從而大大提高了數(shù)據(jù)傳輸?shù)男省@?,當你在播放高清視頻時,視頻數(shù)據(jù)是以連續(xù)的方式存儲在內(nèi)存中的,通過順序 IO,內(nèi)存可以快速地將一幀幀的視頻數(shù)據(jù)傳輸給 CPU 和顯卡,保證視頻的流暢播放。在順序 IO 模式下,由于不需要頻繁地切換行地址和列地址,減少了行地址預(yù)充電和打開行內(nèi)存等操作的次數(shù),所以能夠?qū)崿F(xiàn)較高的數(shù)據(jù)傳輸速率,通常順序 IO 的速度要比隨機 IO 快很多 。

而隨機 IO 則是指以不連續(xù)的地址方式對內(nèi)存進行訪問,數(shù)據(jù)的讀取或?qū)懭胛恢檬请S機分布的,如同在一個巨大的圖書館中隨機尋找不同位置的書籍。在隨機 IO 中,每次訪問內(nèi)存都可能需要重新進行行地址預(yù)充電、打開行內(nèi)存以及發(fā)送列地址等操作,這些額外的操作增加了內(nèi)存訪問的延遲。例如,在數(shù)據(jù)庫系統(tǒng)中,當進行復(fù)雜的查詢操作時,可能需要隨機讀取內(nèi)存中不同位置的數(shù)據(jù)記錄,這就會導(dǎo)致頻繁的隨機 IO 操作。由于每次隨機訪問都需要花費一定的時間來完成上述步驟,所以隨機 IO 的速度相對較慢,其性能往往受到行地址切換和列地址查找的影響。

為了更直觀地理解隨機 IO 和順序 IO 對性能的影響,我們可以以一個簡單的文件讀取操作為例。假設(shè)我們有一個大小為 1GB 的文件,存儲在內(nèi)存中。如果采用順序 IO 的方式讀取這個文件,內(nèi)存可以按照文件的存儲順序,連續(xù)地將數(shù)據(jù)讀取出來,可能只需要幾毫秒的時間就能完成整個文件的讀取。但如果采用隨機 IO 的方式,每次讀取一個隨機位置的數(shù)據(jù)塊,由于需要頻繁地進行內(nèi)存尋址操作,讀取相同大小的文件可能需要幾十毫秒甚至更長的時間,這會顯著降低系統(tǒng)的響應(yīng)速度。在實際的計算機應(yīng)用中,許多程序和系統(tǒng)都需要根據(jù)不同的業(yè)務(wù)需求,合理地選擇隨機 IO 或順序 IO 方式,以達到最佳的性能表現(xiàn)。

三、內(nèi)存 IO與操作系統(tǒng)

3.1用戶空間與內(nèi)核空間的 “楚河漢界”

在操作系統(tǒng)的世界里,內(nèi)存就像是一片廣闊的領(lǐng)土,被劃分為了兩個截然不同的區(qū)域:用戶空間和內(nèi)核空間 。這兩個區(qū)域就如同楚河漢界一般,有著明確的界限和分工。

以 32 位操作系統(tǒng)為例,其尋址空間為 4GB(2 的 32 次方),這就好比是一個擁有 4GB 容量的大倉庫。操作系統(tǒng)將這個大倉庫一分為二,最高的 1GB 空間被劃分為內(nèi)核空間,供操作系統(tǒng)內(nèi)核使用;而剩下的 3GB 空間則分給了各個用戶進程,也就是用戶空間 。在 Linux 系統(tǒng)中,這種劃分尤為典型,內(nèi)核空間就像是倉庫中一個戒備森嚴的特殊區(qū)域,只有操作系統(tǒng)內(nèi)核這個 “管理員” 才有權(quán)限進入和操作,它可以訪問受保護的內(nèi)存空間,也能夠直接與底層硬件設(shè)備進行交互。比如,當電腦需要讀取硬盤上的數(shù)據(jù)時,內(nèi)核空間就會負責(zé)與硬盤控制器進行通信,安排數(shù)據(jù)的讀取工作。

圖片

而用戶空間則是普通應(yīng)用程序的 “活動地盤”,像我們?nèi)粘J褂玫霓k公軟件、游戲、瀏覽器等應(yīng)用程序,都運行在用戶空間中。這里的程序只能在規(guī)定的范圍內(nèi)活動,它們不能直接訪問內(nèi)核空間的數(shù)據(jù),也不能隨意操作硬件設(shè)備。這就像是普通員工只能在自己的辦公區(qū)域內(nèi)工作,不能隨意闖入管理員的專屬區(qū)域。用戶空間的存在,有效地保護了操作系統(tǒng)內(nèi)核的安全,避免了應(yīng)用程序因錯誤操作而導(dǎo)致系統(tǒng)崩潰的風(fēng)險。

 盡管用戶空間和內(nèi)核空間有著嚴格的界限,但它們并不是完全孤立的,在內(nèi)存 IO 過程中,兩者需要密切協(xié)作。當應(yīng)用程序需要進行 IO 操作,比如讀取文件或者向網(wǎng)絡(luò)發(fā)送數(shù)據(jù)時,它會向內(nèi)核空間發(fā)起請求,內(nèi)核空間接收到請求后,會利用自己的權(quán)限和資源,完成實際的 IO 操作,然后再將結(jié)果返回給用戶空間的應(yīng)用程序。這種協(xié)作機制,確保了整個計算機系統(tǒng)的高效運行。

那為什么要這樣劃分出空間范圍呢?

也很好理解,畢竟操作系統(tǒng)身份高貴,太重要了,不能和用戶應(yīng)用程序在一起玩耍,各自的數(shù)據(jù)都要分開存儲并且嚴格控制權(quán)限不能越界。這樣才能保證操作系統(tǒng)的穩(wěn)定運行,用戶應(yīng)用程序太不可控了,不同公司或者個人都可以開發(fā),碰到坑爹的誤操作或者惡意破壞系統(tǒng)數(shù)據(jù)直接宕機玩完了。隔離后應(yīng)用程序要掛你就掛,操作系統(tǒng)可以正常運行。

簡單說,內(nèi)核空間 是操作系統(tǒng) 內(nèi)核代碼運行的地方,用戶空間 是 用戶程序代碼運行的地方。當應(yīng)用進程執(zhí)行系統(tǒng)調(diào)用陷入內(nèi)核代碼中執(zhí)行時就處于內(nèi)核態(tài),當應(yīng)用進程在運行用戶代碼時就處于用戶態(tài)

同時內(nèi)核空間可以執(zhí)行任意的命令,而用戶空間只能執(zhí)行簡單的運算,不能直接調(diào)用系統(tǒng)資源和數(shù)據(jù)。必須通過操作系統(tǒng)提供接口,向系統(tǒng)內(nèi)核發(fā)送指令。

一旦調(diào)用系統(tǒng)接口,應(yīng)用進程就從用戶空間切換到內(nèi)核空間了,因為開始運行內(nèi)核代碼了。

簡單看幾行代碼,分析下是應(yīng)用程序在用戶空間和內(nèi)核空間之間的切換過程:

str = "i am qige" // 用戶空間
x = x + 2
file.write(str) // 切換到內(nèi)核空間
y = x + 4 // 切換回用戶空間

上面代碼中,第一行和第二行都是簡單的賦值運算,在用戶空間執(zhí)行。第三行需要寫入文件,就要切換到內(nèi)核空間,因為用戶不能直接寫文件,必須通過內(nèi)核安排。第四行又是賦值運算,就切換回用戶空間。

用戶態(tài)切換到內(nèi)核態(tài)的3種方式:

  1. 系統(tǒng)調(diào)用。也稱為 System Call,是說用戶態(tài)進程主動要求切換到內(nèi)核態(tài)的一種方式,用戶態(tài)進程使用操作系統(tǒng)提供的服務(wù)程序完成工作,比如上面示例代碼中的寫文件調(diào)用,還有像 fork() 函數(shù)實際上就是執(zhí)行了一個創(chuàng)建新進程的系統(tǒng)調(diào)用。而系統(tǒng)調(diào)用的機制其核心還是使用了操作系統(tǒng)為用戶特別開放的一個中斷來實現(xiàn)。
  2. 異常。當CPU在用戶空間執(zhí)行程序代碼時發(fā)生了不可預(yù)期的異常,這時會觸發(fā)由當前運行進程切換到處理此異常的內(nèi)核相關(guān)程序中,切換到內(nèi)核態(tài),比如缺頁異常。
  3. 外圍設(shè)備的中斷。當外圍設(shè)備完成用戶請求的某些操作后,會向CPU發(fā)送相應(yīng)的中斷信號,這時CPU會暫停執(zhí)行下一條即將執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號對應(yīng)的處理程序,如果當前正在運行用戶態(tài)下的程序指令,自然就發(fā)了由用戶態(tài)到內(nèi)核態(tài)的切換。比如硬盤數(shù)據(jù)讀寫完成,系統(tǒng)會切換到中斷處理程序中執(zhí)行后續(xù)操作等。

以上3種方式,除了系統(tǒng)調(diào)用是進程主動發(fā)起切換,異常和外圍設(shè)備中斷是被動切換的;查看 CPU 時間在 User Space 與 Kernel Space 之間的分配情況,可以使用top命令。它的第三行輸出就是 CPU 時間分配統(tǒng)計。

3.2系統(tǒng)調(diào)用:用戶與內(nèi)核的 “通信使者”

那么,用戶空間的應(yīng)用程序是如何與內(nèi)核空間進行溝通和協(xié)作的呢?這就不得不提到系統(tǒng)調(diào)用(System Call),它就像是用戶與內(nèi)核之間的 “通信使者”,負責(zé)傳遞雙方的請求和響應(yīng) 。

system_call()片段

...
   pushl %eax    /*將系統(tǒng)調(diào)用號壓棧*/
SAVE_ALL
...
cmpl$(NR_syscalls), %eax    /*檢查系統(tǒng)調(diào)用號
Jb nobadsys
Movl $(-ENOSYS), 24(%esp)   /*堆棧中的eax設(shè)置為-ENOSYS, 作為返回值
Jmp ret_from_sys_call
nobadsys:
…
call  *sys_call_table(,%eax,4) #調(diào)用系統(tǒng)調(diào)用表中調(diào)用號為eax的系統(tǒng)調(diào)用例程
movl %eax,EAX(%esp) #將返回值存入堆棧中
Jmp ret_from_sys_call
  • 首先將系統(tǒng)調(diào)用號(eax)和可以用到的所有CPU寄存器保存到相應(yīng)的堆棧中(由SAVE_ALL完成);
  • 對用戶態(tài)進程傳遞過來的系統(tǒng)調(diào)用號進行有效性檢查(eax是系統(tǒng)調(diào)用號,它應(yīng)該小于 NR_syscalls)
  • 如果是合法的系統(tǒng)調(diào)用,再進一步檢測該系統(tǒng)調(diào)用是否正被跟蹤;
  • 根據(jù)eax中的系統(tǒng)調(diào)用號調(diào)用相應(yīng)的服務(wù)例程。
  • 服務(wù)例程結(jié)束后,從eax寄存器獲得它的返回值,并把這個返回值存放在堆棧中,讓其位于用戶態(tài)eax寄存器曾存放的位置。
  • 然后跳轉(zhuǎn)到ret_from_sys_call(),終止系統(tǒng)調(diào)用程序的執(zhí)行。

SAVE_ALL宏定義

#define SAVE_ALL  
cld; 
pushl %es;  
pushl %ds; 
pushl %eax;  
pushl %ebp;  
pushl %edi;  
pushl %esi;  
pushl %edx; 
pushl %ecx; 
pushl %ebx; 
movl $(__KERNEL_DS),%edx; 
movl %edx,%ds;  
movl %edx,%es;
  • 將寄存器中的參數(shù)壓入到核心棧中(這樣內(nèi)核才能使用用戶傳入的參數(shù)。)
  • 因為在不同特權(quán)級之間控制轉(zhuǎn)換時,INT指令不同于CALL指令,它不會將外層堆棧的參數(shù)自動拷貝到內(nèi)層堆棧中。所以在調(diào)用系統(tǒng)調(diào)用時,必須把參數(shù)指定到各個寄存器中

當用戶程序進行IO讀寫時,通常會依賴底層的read和write兩大系統(tǒng)調(diào)用。雖然不同操作系統(tǒng)中這兩個系統(tǒng)調(diào)用的名稱和形式可能略有差異,但它們的基本功能是一致的。在Linux 系統(tǒng)中,系統(tǒng)調(diào)用read用于從文件或設(shè)備中讀取數(shù)據(jù),而 write 則用于將數(shù)據(jù)寫入文件或設(shè)備。

以讀取文件為例,當應(yīng)用程序調(diào)用read系統(tǒng)調(diào)用時,它會向內(nèi)核傳遞一些參數(shù),比如文件描述符(用于標識要讀取的文件)、數(shù)據(jù)存儲的緩沖區(qū)地址以及要讀取的數(shù)據(jù)長度等 。內(nèi)核接收到這些參數(shù)后,會根據(jù)文件描述符找到對應(yīng)的文件,并從文件中讀取指定長度的數(shù)據(jù)。但這個讀取過程并不是直接將數(shù)據(jù)從物理設(shè)備(如磁盤)讀取到應(yīng)用程序的內(nèi)存中,而是先將數(shù)據(jù)讀取到內(nèi)核緩沖區(qū)。內(nèi)核緩沖區(qū)就像是一個臨時的數(shù)據(jù)中轉(zhuǎn)站,數(shù)據(jù)會在這里停留一段時間。然后,內(nèi)核再將數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到應(yīng)用程序的進程緩沖區(qū)(也就是用戶空間中應(yīng)用程序指定的內(nèi)存區(qū)域),這樣應(yīng)用程序就成功地讀取到了文件中的數(shù)據(jù) 。

在這個過程中,系統(tǒng)調(diào)用起到了關(guān)鍵的橋梁作用。它實現(xiàn)了用戶空間與內(nèi)核空間的數(shù)據(jù)交換,讓應(yīng)用程序能夠借助內(nèi)核的強大功能來完成各種 IO 操作。同時,系統(tǒng)調(diào)用也提供了一種安全的機制,確保應(yīng)用程序只能按照規(guī)定的方式訪問內(nèi)核資源,避免了非法訪問和操作帶來的安全隱患。例如,在 Windows 系統(tǒng)中,應(yīng)用程序調(diào)用 WriteFile 函數(shù)進行文件寫入操作時,實際上也是通過系統(tǒng)調(diào)用將數(shù)據(jù)傳遞給內(nèi)核,由內(nèi)核負責(zé)將數(shù)據(jù)寫入磁盤。不同的操作系統(tǒng)可能會采用不同的方式來實現(xiàn)系統(tǒng)調(diào)用,比如在 x86 體系結(jié)構(gòu)中,通常是通過中斷指令(如 INT 0x80)來觸發(fā)系統(tǒng)調(diào)用,而在現(xiàn)代的 64 位系統(tǒng)中,可能會使用更高效的 syscall 指令 。但無論采用何種方式,系統(tǒng)調(diào)用都是用戶空間與內(nèi)核空間交互的重要途徑,對于內(nèi)存 IO 以及整個計算機系統(tǒng)的運行都起著不可或缺的作用。

3.3 IO工作原理

無論是 Socket 還是文件的讀寫,用戶程序進行 IO 的操作時,用到的 read&write 兩個系統(tǒng)調(diào)用,都不負責(zé)數(shù)據(jù)在內(nèi)核緩沖區(qū)和磁盤之間的交換;底層的讀寫交換,是由操作系統(tǒng) kernel 內(nèi)核完成的。

以磁盤 IO 為例:

  • read 系統(tǒng)調(diào)用,并不是把數(shù)據(jù)直接從物理設(shè)備讀數(shù)據(jù)到內(nèi)存;而是把數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到進程緩沖區(qū);
  • write 系統(tǒng)調(diào)用,也不是直接把數(shù)據(jù)寫入到物理設(shè)備;而是把數(shù)據(jù)從進程緩沖區(qū)復(fù)制到內(nèi)核緩沖區(qū)。

圖片

四、內(nèi)存IO的性能奧秘

4.1內(nèi)存延遲:時間的枷鎖

在內(nèi)存 IO 的世界里,內(nèi)存延遲就像是套在數(shù)據(jù)傳輸速度上的 “枷鎖”,而 CL、tRCD、tRP、tRAS 這幾個參數(shù),則是構(gòu)成這把 “枷鎖” 的關(guān)鍵部件 。

CL(Column Address Latency),即列地址選通延遲,是內(nèi)存時序中最為關(guān)鍵的參數(shù)之一,它就像一個短跑運動員起跑時的反應(yīng)時間,代表了從內(nèi)存控制器發(fā)出讀取命令到數(shù)據(jù)開始傳送之間的延遲時間。CL 的值越小,說明內(nèi)存的反應(yīng)速度越快,能夠更快地將數(shù)據(jù)傳遞給 CPU。例如,對于 DDR4 內(nèi)存來說,常見的 CL 值可能在 15 - 20 之間,如果一款內(nèi)存的 CL 值為 15,那么在同等條件下,它的數(shù)據(jù)傳輸速度就會比 CL 值為 20 的內(nèi)存更快。

tRCD(Row Address to Column Address Delay),行地址傳輸?shù)搅械刂返难舆t時間,它是內(nèi)存延遲的另一個重要組成部分。在內(nèi)存的工作過程中,需要先激活行地址,然后才能訪問該行中的列地址,tRCD 就表示從接收到行地址信號后,到能夠訪問列地址之間所需等待的時鐘周期數(shù)。這個過程就好比你在圖書館找書,先找到了存放書籍的書架(行地址),然后還需要在書架上找到具體的某本書(列地址),而 tRCD 就是從找到書架到找到書之間所花費的時間。對于 DDR4 內(nèi)存,tRCD 的值通常在 12 - 25 個時鐘周期左右,不同的內(nèi)存規(guī)格和品牌,tRCD 的值會有所差異。

tRP(RAS Precharge Time),行預(yù)充電時間,它決定了內(nèi)存從一次操作結(jié)束到下一次行激活開始之間的等待時間。當內(nèi)存完成一次讀寫操作后,需要對行地址進行預(yù)充電,以便為下一次的訪問做好準備。這個過程類似于運動員在比賽前的熱身,雖然看似簡單,但卻是必不可少的環(huán)節(jié)。tRP 的時間長短以時鐘周期為單位,對于 DDR4 內(nèi)存,tRP 一般在 10 - 20 個時鐘周期左右。如果 tRP 的值設(shè)置過長,會導(dǎo)致內(nèi)存的訪問效率降低;而如果設(shè)置過短,可能會影響內(nèi)存的穩(wěn)定性。

tRAS(RAS Active Time),行激活時間,它表示行激活命令與預(yù)充電命令之間的最小時鐘周期數(shù)。tRAS 的值直接影響著內(nèi)存的讀寫性能,一般來說,tRAS 的值會比其他幾個參數(shù)要大一些。例如,對于 DDR4 內(nèi)存,tRAS 的值可能在 30 - 50 個時鐘周期之間。tRAS 的設(shè)置需要綜合考慮內(nèi)存的頻率、穩(wěn)定性以及其他時序參數(shù)等因素,如果 tRAS 設(shè)置不當,可能會導(dǎo)致內(nèi)存無法正常工作或者出現(xiàn)數(shù)據(jù)錯誤。

在實際應(yīng)用中,我們可以通過調(diào)整這些內(nèi)存延遲參數(shù)來優(yōu)化內(nèi)存性能。比如,在 BIOS 中,有經(jīng)驗的用戶可以手動設(shè)置 CL、tRCD、tRP、tRAS 等參數(shù)的值。一般來說,將這些參數(shù)的值設(shè)置得越低,內(nèi)存的延遲就越小,性能也就越高。但是,過低的參數(shù)設(shè)置可能會導(dǎo)致內(nèi)存的穩(wěn)定性下降,甚至出現(xiàn)系統(tǒng)藍屏、死機等問題。因此,在優(yōu)化內(nèi)存延遲參數(shù)時,需要在性能和穩(wěn)定性之間找到一個平衡點。同時,不同的主板和內(nèi)存對參數(shù)的支持范圍也有所不同,在調(diào)整參數(shù)之前,最好先查閱主板和內(nèi)存的說明書,了解其推薦的參數(shù)設(shè)置范圍。

4.2緩存與局部性原理:速度的秘密武器

為了突破內(nèi)存延遲這把 “枷鎖” 對性能的限制,計算機系統(tǒng)引入了 CPU 緩存(L1、L2、L3),它就像是一把強大的 “秘密武器”,能夠顯著提升內(nèi)存 IO 的性能 。

CPU 緩存是位于 CPU 和主內(nèi)存之間的高速存儲區(qū)域,按照距離 CPU 核心的遠近和性能的高低,可分為 L1 緩存、L2 緩存和 L3 緩存 。L1 緩存集成在 CPU 核心內(nèi)部,與處理器核心非常接近,速度最快,通常分為 L1 指令緩存(I-cache)和 L1 數(shù)據(jù)緩存(D-cache),分別用于存儲指令和數(shù)據(jù),其容量相對較小,一般在幾十 KB 到幾百 KB 之間。L2 緩存可能集成在單個核心內(nèi)部,或者與多個核心共享,速度比 L1 緩存稍慢,但仍然比主內(nèi)存快很多,容量比 L1 緩存大,通常在幾百 KB 到幾 MB 之間。L3 緩存通常是一個較大的緩存,被整個 CPU 的所有核心共享,速度比 L1 和 L2 緩存慢,但比主內(nèi)存快很多,容量最大,通常在幾 MB 到幾十 MB 之間 。

當 CPU 需要讀取數(shù)據(jù)時,會首先在 L1 緩存中查找,如果在 L1 緩存中找到了所需的數(shù)據(jù)(這被稱為緩存命中),那么 CPU 可以在極短的時間內(nèi)獲取到數(shù)據(jù),大大提高了數(shù)據(jù)訪問的速度。如果在 L1 緩存中沒有找到數(shù)據(jù)(緩存未命中),CPU 會接著在 L2 緩存中查找,若 L2 緩存也未命中,則繼續(xù)在 L3 緩存中查找。只有當 L1、L2、L3 緩存都未命中時,CPU 才會去主內(nèi)存中讀取數(shù)據(jù),而從主內(nèi)存中讀取數(shù)據(jù)的速度要比從緩存中讀取慢得多,這就會導(dǎo)致內(nèi)存 IO 的延遲增加。

那么,CPU 緩存為什么能夠如此有效地提升內(nèi)存 IO 性能呢?這就要歸功于數(shù)據(jù)訪問的局部性原理。局部性原理主要包括時間局部性(Temporal Locality)和空間局部性(Spatial Locality) 。

時間局部性是指如果一個數(shù)據(jù)項被訪問,那么在不久的將來它很可能再次被訪問。例如,在一個循環(huán)結(jié)構(gòu)中,循環(huán)變量和循環(huán)體內(nèi)的數(shù)據(jù)會在每次迭代中被重復(fù)訪問。當 CPU 第一次訪問這些數(shù)據(jù)時,會將它們加載到緩存中,后續(xù)再次訪問時,就可以直接從緩存中獲取,而不需要再次訪問主內(nèi)存,從而大大提高了數(shù)據(jù)訪問的速度。

空間局部性則是指如果一個數(shù)據(jù)項被訪問,那么與它相鄰的數(shù)據(jù)項也很可能在不久的將來被訪問。因為程序中的數(shù)據(jù)通常是按順序存儲和訪問的,尤其是在數(shù)組或列表等數(shù)據(jù)結(jié)構(gòu)中。例如,在遍歷一個數(shù)組時,當 CPU 訪問數(shù)組中的某個元素時,它很可能緊接著會訪問該元素相鄰的下一個元素。利用空間局部性原理,CPU 在從主內(nèi)存讀取數(shù)據(jù)時,會將該數(shù)據(jù)所在的一個數(shù)據(jù)塊(通常稱為緩存行,cache line)一起加載到緩存中,這樣當下次訪問相鄰數(shù)據(jù)時,就可以直接從緩存中獲取,減少了對主內(nèi)存的訪問次數(shù) 。

為了更好地理解緩存和局部性原理的作用,我們可以通過一個簡單的例子來說明。假設(shè)我們有一個程序需要對一個大型數(shù)組進行求和操作。如果沒有 CPU 緩存,每次訪問數(shù)組中的元素時,CPU 都需要從主內(nèi)存中讀取數(shù)據(jù),由于主內(nèi)存的訪問速度相對較慢,這個求和操作將會花費較長的時間。但是,有了 CPU 緩存之后,當 CPU 第一次訪問數(shù)組中的某個元素時,會將該元素所在的緩存行加載到緩存中,而緩存行中包含了該元素以及相鄰的一些元素。在后續(xù)的訪問中,CPU 可以直接從緩存中獲取這些相鄰元素的數(shù)據(jù),大大提高了數(shù)據(jù)訪問的速度,從而加快了整個求和操作的執(zhí)行效率。

在實際的計算機應(yīng)用中,我們可以通過優(yōu)化程序的內(nèi)存訪問模式,充分利用緩存和局部性原理來提高系統(tǒng)的整體性能。比如,在編寫代碼時,盡量將頻繁訪問的數(shù)據(jù)和代碼放在一起,以提高時間局部性;對于數(shù)組等數(shù)據(jù)結(jié)構(gòu)的訪問,盡量按照順序進行,以提高空間局部性。同時,一些高級編程語言和編譯器也會自動進行一些優(yōu)化,以充分利用緩存和局部性原理,例如,編譯器會對循環(huán)進行優(yōu)化,將循環(huán)體內(nèi)的數(shù)據(jù)訪問盡可能地集中在一個較小的內(nèi)存區(qū)域內(nèi),從而提高緩存的命中率 。

五、內(nèi)存IO的應(yīng)用與優(yōu)化

5.1實際應(yīng)用中的內(nèi)存 IO

在數(shù)據(jù)庫系統(tǒng)中,內(nèi)存 IO 扮演著至關(guān)重要的角色。以 MySQL 數(shù)據(jù)庫為例,當我們執(zhí)行一條查詢語句時,數(shù)據(jù)庫首先會在內(nèi)存中查找是否有所需的數(shù)據(jù)。如果數(shù)據(jù)在內(nèi)存中(即緩存命中),那么數(shù)據(jù)庫可以快速地將數(shù)據(jù)返回給用戶,大大提高了查詢的響應(yīng)速度。這是因為內(nèi)存的訪問速度遠遠快于磁盤,從內(nèi)存中讀取數(shù)據(jù)可以避免磁盤 IO 帶來的高延遲。

例如,在一個電商系統(tǒng)中,用戶查詢商品信息時,數(shù)據(jù)庫可以通過內(nèi)存 IO 快速返回商品的名稱、價格、庫存等數(shù)據(jù),讓用戶能夠迅速得到結(jié)果,提升了用戶體驗。但如果數(shù)據(jù)不在內(nèi)存中(緩存未命中),數(shù)據(jù)庫就需要從磁盤中讀取數(shù)據(jù),并將其加載到內(nèi)存中,這個過程涉及到大量的磁盤 IO 操作,會顯著增加查詢的時間。因此,數(shù)據(jù)庫通常會使用緩存機制,如 InnoDB Buffer Pool,來盡可能地將熱點數(shù)據(jù)存儲在內(nèi)存中,減少磁盤 IO 的次數(shù),提高系統(tǒng)的整體性能 。

文件系統(tǒng)操作也離不開內(nèi)存 IO 的支持。當我們在電腦上打開一個文件時,操作系統(tǒng)會先將文件的部分數(shù)據(jù)讀取到內(nèi)存中,這樣后續(xù)對文件的讀取和修改操作就可以直接在內(nèi)存中進行,而不需要頻繁地訪問磁盤。這不僅提高了文件操作的速度,還減少了磁盤的磨損。比如,我們在使用 Word 編輯文檔時,每一次的文字輸入、格式調(diào)整等操作,都是先在內(nèi)存中進行處理,只有當我們保存文件時,操作系統(tǒng)才會將內(nèi)存中的數(shù)據(jù)寫入磁盤。而且,文件系統(tǒng)還會利用內(nèi)存緩存來提高文件訪問的效率,它會將最近訪問過的文件數(shù)據(jù)和元數(shù)據(jù)(如文件大小、創(chuàng)建時間、權(quán)限等)緩存到內(nèi)存中,當再次訪問相同的文件時,可以直接從內(nèi)存中獲取,避免了重復(fù)的磁盤讀取操作 。

在服務(wù)器端編程中,內(nèi)存 IO 同樣發(fā)揮著關(guān)鍵作用。以 Web 服務(wù)器為例,當它接收到客戶端的請求時,需要快速地讀取和處理相關(guān)的數(shù)據(jù),并將響應(yīng)結(jié)果返回給客戶端。這就要求服務(wù)器能夠高效地進行內(nèi)存 IO 操作,以應(yīng)對大量的并發(fā)請求。例如,在一個高流量的電商網(wǎng)站中,服務(wù)器需要同時處理成千上萬的用戶請求,如商品瀏覽、下單、支付等操作。通過合理地利用內(nèi)存 IO,服務(wù)器可以快速地讀取用戶請求數(shù)據(jù),查詢數(shù)據(jù)庫獲取相關(guān)信息,然后將處理結(jié)果返回給用戶,保證了網(wǎng)站的流暢運行和快速響應(yīng)。同時,服務(wù)器還可以使用內(nèi)存緩存來存儲一些常用的數(shù)據(jù),如熱門商品信息、用戶登錄狀態(tài)等,減少對數(shù)據(jù)庫的訪問壓力,提高系統(tǒng)的性能和吞吐量 。

5.2優(yōu)化策略:提升內(nèi)存 IO 性能的秘訣

為了充分發(fā)揮內(nèi)存 IO 的優(yōu)勢,提高計算機系統(tǒng)的性能,我們可以采用一系列的優(yōu)化策略。

合理使用緩存是提升內(nèi)存 IO 性能的重要方法之一。緩存就像是一個高速的數(shù)據(jù)存儲區(qū)域,它可以存儲經(jīng)常訪問的數(shù)據(jù),當再次需要這些數(shù)據(jù)時,可以直接從緩存中獲取,而不需要從速度較慢的內(nèi)存或磁盤中讀取。除了前面提到的 CPU 緩存和數(shù)據(jù)庫緩存外,操作系統(tǒng)也提供了文件系統(tǒng)緩存。

在 Linux 系統(tǒng)中,文件系統(tǒng)緩存會將最近讀取或?qū)懭氲奈募?shù)據(jù)存儲在內(nèi)存中,當應(yīng)用程序再次訪問相同的文件時,操作系統(tǒng)可以直接從內(nèi)存中提取數(shù)據(jù),而無需再次訪問磁盤,從而大大降低了 IO 延遲,提高了系統(tǒng)的響應(yīng)性能 。我們還可以在應(yīng)用程序?qū)用鏄?gòu)建自己的緩存機制。比如,在一個基于 Java 開發(fā)的 Web 應(yīng)用中,可以使用 Guava Cache 來緩存一些常用的數(shù)據(jù),如用戶信息、配置參數(shù)等。通過設(shè)置合理的緩存策略,如緩存過期時間、最大緩存容量等,可以有效地提高數(shù)據(jù)的訪問速度,減少對數(shù)據(jù)庫和文件系統(tǒng)的 IO 壓力 。

優(yōu)化數(shù)據(jù)結(jié)構(gòu)也能顯著提升內(nèi)存 IO 性能。不同的數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中的存儲方式和訪問效率各不相同,選擇合適的數(shù)據(jù)結(jié)構(gòu)可以減少內(nèi)存的使用量和 IO 操作的次數(shù)。例如,在處理大量的鍵值對數(shù)據(jù)時,哈希表(Hash Table)是一種非常高效的數(shù)據(jù)結(jié)構(gòu)。它通過哈希函數(shù)將鍵映射到一個特定的位置,從而實現(xiàn)快速的查找操作。相比于鏈表(Linked List)等其他數(shù)據(jù)結(jié)構(gòu),哈希表的查找時間復(fù)雜度平均為 O (1),大大提高了數(shù)據(jù)的訪問速度。這意味著在進行內(nèi)存 IO 操作時,能夠更快地定位和讀取所需的數(shù)據(jù),減少了 IO 延遲 。

再比如,在需要頻繁進行插入和刪除操作的場景中,動態(tài)數(shù)組(如 Java 中的 ArrayList)可能不是最佳選擇,因為每次插入或刪除元素時,可能需要移動大量的元素,導(dǎo)致內(nèi)存IO開銷增大。而鏈表則更適合這種場景,因為鏈表的插入和刪除操作只需要修改指針,不需要移動大量的數(shù)據(jù),從而減少了內(nèi)存IO的操作次數(shù) 。

采用異步 IO 也是優(yōu)化內(nèi)存 IO 性能的有效手段。在傳統(tǒng)的同步 IO 模式下,當應(yīng)用程序發(fā)起一個 IO 操作時,它會一直等待該操作完成,才能繼續(xù)執(zhí)行后續(xù)的代碼。這就好比你去餐廳點餐,服務(wù)員在給你上菜之前,你只能干等著,不能做其他事情。而在異步 IO 模式下,應(yīng)用程序發(fā)起 IO 操作后,可以繼續(xù)執(zhí)行其他任務(wù),當 IO 操作完成時,系統(tǒng)會通過回調(diào)函數(shù)或事件通知應(yīng)用程序。這樣就提高了程序的并發(fā)性能,減少了 IO 操作對程序執(zhí)行流程的阻塞 。

在 Node.js 中,其核心的異步 IO 模型使得它非常適合處理高并發(fā)的網(wǎng)絡(luò)應(yīng)用。當 Node.js 應(yīng)用程序發(fā)起一個文件讀取操作時,它不會等待文件讀取完成,而是繼續(xù)執(zhí)行其他代碼,如處理其他網(wǎng)絡(luò)請求。當文件讀取完成后,系統(tǒng)會觸發(fā)一個回調(diào)函數(shù),將讀取到的數(shù)據(jù)傳遞給應(yīng)用程序進行后續(xù)處理。這種異步 IO 的方式,使得 Node.js 能夠在處理大量并發(fā)請求時,依然保持高效的性能 。

內(nèi)存 IO 在數(shù)據(jù)庫讀寫、文件系統(tǒng)操作、服務(wù)器端編程等眾多實際應(yīng)用場景中都起著不可或缺的作用。通過合理使用緩存、優(yōu)化數(shù)據(jù)結(jié)構(gòu)、采用異步 IO 等優(yōu)化策略,我們可以有效地提升內(nèi)存 IO 的性能,讓計算機系統(tǒng)運行得更加高效、流暢,為我們的工作和生活帶來更好的體驗 。

責(zé)任編輯:武曉燕 來源: 深度Linux
相關(guān)推薦

2024-04-09 13:00:34

數(shù)據(jù)中心

2010-12-13 13:26:25

分頁

2023-02-01 16:11:58

2019-05-24 09:47:09

ARM華為芯片

2022-03-14 16:56:51

俄羅斯半導(dǎo)體產(chǎn)業(yè)制裁

2022-07-21 10:23:14

CIO影子IT云計算

2022-01-04 19:21:46

數(shù)據(jù)存儲數(shù)據(jù)存儲

2021-10-25 09:41:40

軟件 4G 5G

2024-04-30 11:44:24

2021-03-02 09:56:33

技術(shù)研發(fā)指標

2023-09-21 18:16:57

Linux內(nèi)核系統(tǒng)

2020-12-04 07:51:24

CQRS模型查詢

2020-10-27 08:58:47

設(shè)計NUMA內(nèi)存

2019-04-30 09:00:08

人工智能AI開發(fā)者

2011-04-11 11:32:29

Oracle分區(qū)表磁盤IO沖突

2017-03-01 12:36:15

Linux驅(qū)動技術(shù)內(nèi)存

2025-06-16 09:46:06

2021-10-29 11:04:08

物聯(lián)網(wǎng)IOT

2017-03-25 21:33:33

Linux調(diào)度器

2015-06-11 10:08:57

網(wǎng)絡(luò)延遲應(yīng)用性能網(wǎng)絡(luò)監(jiān)控
點贊
收藏

51CTO技術(shù)棧公眾號