:電腦里的“1“到底是什么)
一句話1不是某種神秘的東西它通常就是某個地方存著一小堆電子或者某根導線上有較高的電壓。電腦只是約定電壓高于某個值算 1低于某個值算 0。前面講網(wǎng)絡(luò)時我們一直在說字節(jié)“位”“包”。這一篇往下挖到底一個位在物理上到底是什么。一、生活里的例子一排水杯桌上擺著 8 個水杯杯里有水 → 記作1杯里沒水 → 記作08 個杯子就能表示一個字節(jié)比如01000001字母 A。但現(xiàn)實中會有幾個麻煩水杯的問題電腦里對應(yīng)的問題杯子有細縫水會慢慢漏掉電荷會泄漏所以 DRAM 需要不停刷新杯里只剩半杯水算有還是沒有需要一個閾值來判斷想知道有沒有水只能倒出來看DRAM 的讀取是破壞性的讀完要寫回杯子用久了會裂閃存SSD的擦寫壽命“充電狀態(tài)就是杯子里有水”。下面看看不同的杯子分別是什么。二、先搞清楚充電是什么意思電荷與電壓電荷物質(zhì)里帶電粒子的多少。電子帶負電一個電子的電量約為 1.6 × 10?1? 庫侖。電壓兩點之間的電勢差可以理解為水位差?!俺潆姴⒉皇茄b進了電”而是把電子從一邊搬到另一邊讓兩邊形成電壓差。電容器最簡單的杯子┌─────┐ ← 一塊金屬板電子被抽走帶正電 │ 絕緣 │ ← 中間是絕緣層電子過不去 └─────┘ ← 另一塊金屬板電子堆積帶負電存了多少電荷取決于兩個因素Q C × V 電荷量 電容大小 × 電壓電荷存在那里兩板之間就有電壓電路可以檢測到這個電壓。1其實是一個電壓范圍數(shù)字電路不要求電壓正好是某個值而是按范圍判斷電壓 1.0V ┤██████████ 判定為 1高電平 0.7V ┤────────── 高電平閾值 │ 不確定區(qū) ← 落在這里結(jié)果不可靠電路設(shè)計會盡量避免 0.3V ┤────────── 低電平閾值 0V ┤██████████ 判定為 0低電平中間留出來的空白區(qū)叫噪聲容限即使有點干擾、有點漏電只要沒跨過閾值0 還是 01 還是 1。這就是數(shù)字比模擬可靠的根本原因模擬信號每一點誤差都會被記錄下來數(shù)字信號只要不越過閾值誤差就會被抹掉。三、DRAM內(nèi)存條最典型的充電 1你電腦里的內(nèi)存條就是 DRAM。每個位由1 個晶體管 1 個電容組成簡稱 1T1C字線Word Line選中這一行 │ ┤ 晶體管開關(guān) 位線 ───────┤ Bit Line │ ═╪═ 電容存電荷 │ 接地狀態(tài)電容含義充了電有電壓1也可以反過來約定沒充電接近 0V0一個1到底有多少電子現(xiàn)代 DRAM 單元的電容大約在10 fF飛法10?1? 法拉量級工作電壓約 1VQ C × V ≈ 10 × 10?1? × 1 10?1? 庫侖 電子數(shù) ≈ 10?1? ÷ (1.6 × 10?1?) ≈ 60,000 個你內(nèi)存里的一個1大約就是幾萬個電子擠在一個極小的電容里。16GB 內(nèi)存有約 1370 億個這樣的電容。漏電 → 必須刷新絕緣層不完美電子會慢慢漏走。幾十毫秒后“1就可能變成0”。所以內(nèi)存控制器會定期把每一行讀出來再寫回去標準規(guī)定通常每64ms內(nèi)要把所有行刷新一遍。寫入 1 ████████████ 過了一會████████???? 電子在漏 刷新 ████████████ 讀出來判定為 1重新充滿這就是DRAM中 D 的意思Dynamic動態(tài)需要不停維護。斷電后刷新停止幾秒到幾分鐘內(nèi)數(shù)據(jù)就消失了。讀取會破壞數(shù)據(jù)位線本身的電容比單元電容大得多可能大 10 倍以上。打開晶體管后單元里的電荷分攤到位線上位線電壓只變化幾十到一百多毫伏。1. 先把位線預(yù)充到中間電壓比如 0.5V 2. 打開晶體管單元電荷和位線混合 3. 位線電壓變成 0.55V單元原來是 1或 0.45V原來是 0 4. 靈敏放大器Sense Amplifier把這個微小差別放大成完整的 1 或 0 5. 放大后的結(jié)果順便寫回單元恢復電荷這就像用一個大杯子去量小杯子里的水倒進去后只能看到水面輕微上升還得用放大鏡判斷然后再把水倒回來。四、SRAMCPU 緩存不靠存電荷靠互相撐住CPU 的 L1、L2、L3 緩存用的是 SRAM每個位用6 個晶體管┌──→ 反相器 A ──┐ │ ▼ └─── 反相器 B ←─┘ A 輸出 1 → B 輸出 0 → A 繼續(xù)輸出 1 → ……兩個反相器把 1 變 0、把 0 變 1 的電路首尾相接形成互相鎖定的穩(wěn)定狀態(tài)。DRAMSRAM怎么存電容里的電荷兩個反相器互相維持的電壓每位晶體管數(shù)1 個 1 個電容6 個需要刷新嗎需要不需要只要通電速度較慢很快密度 / 成本密度高、便宜占地大、貴用途內(nèi)存條CPU 緩存、寄存器附近SRAM 的1不是一堆靜止的電子而是電源持續(xù)供電撐住的一個電壓狀態(tài)。就像兩個人背靠背站著互相支撐只要有力氣供電誰都不會倒。這也解釋了前面講性能時說的緩存很快但很小因為每一位都很貴。五、閃存SSD、U 盤、手機存儲把電子關(guān)進籠子閃存斷電后數(shù)據(jù)還在靠的是浮柵Floating Gate或電荷捕獲層控制柵 ═════════════ 絕緣層很薄 ┌───────────┐ │ 浮 柵 │ ← 四面都被絕緣層包住的籠子 └───────────┘ 絕緣層很薄 ═════════════ 源極 溝道 漏極操作原理寫入編程加較高電壓讓電子隧穿絕緣層進入浮柵量子隧穿效應(yīng)保存斷電后電子被絕緣層困住可以保存數(shù)年讀取浮柵里的電子會改變晶體管的導通門檻閾值電壓測一下導不導通就知道擦除加反向高壓把電子拉出來?? 這里充電反而表示 0NAND 閃存中按慣例狀態(tài)浮柵值擦除后電子很少1編程后電子較多0所以**充電 1只是一種約定不是物理定律**。一塊全新、擦除干凈的閃存讀出來全是0xFF全是 1。一個位用多少電子越來越少類型每個單元存幾位需要區(qū)分的電荷等級SLC1 位2 級MLC2 位4 級TLC3 位8 級QLC4 位16 級工藝越先進單元越小每個等級之間相差的電子數(shù)就越少有時只有幾十個電子的量級。QLC 要在同一個籠子里分辨 16 種滿的程度就像在一個杯子里分辨 16 種水位。后果原因壽命短擦寫次數(shù)少每次隧穿都會輕微損傷絕緣層籠子越來越漏需要強力糾錯ECC、LDPC少幾個電子就可能被誤判長期斷電可能丟數(shù)據(jù)電子會極其緩慢地漏出速度較慢寫入要多次充一點、測一下逐步逼近目標電荷量六、其他地方的1位置1是什么CPU 寄存器觸發(fā)器類似 SRAM 的鎖存結(jié)構(gòu)輸出的高電壓CPU 內(nèi)部導線導線被充到高電壓導線本身也有微小電容機械硬盤磁性顆粒的磁化方向沒有電荷光盤反射面上的凹坑與平面之間的變化網(wǎng)線電壓在一段時間內(nèi)的變化模式還經(jīng)過編碼光纖光脈沖的有無或強弱Wi-Fi / 4G電磁波的相位和幅度組合一個符號可以攜帶多位上一組網(wǎng)絡(luò)文章里講的包“帶寬”到了最底層就是這一行網(wǎng)線上的電壓跳變、光纖里的光閃爍。網(wǎng)卡把這些物理信號翻譯成 0 和 1再交給內(nèi)核。七、為什么電腦會發(fā)熱因為一直在充放電CPU 里有幾十億個晶體管導線和晶體管柵極都相當于微小電容。每次一個位從 0 變 1就要給這些電容充電從 1 變 0就要放電能量變成熱量。CPU 的動態(tài)功耗大致是P ≈ α × C × V2 × f α每個周期有多少比例的電路在翻轉(zhuǎn) C被充放電的電容總量 V電壓 f頻率結(jié)論說明電壓影響最大平方關(guān)系電壓降低 10%功耗約降低 19%所以降壓是筆記本、手機省電的主要手段頻率越高越熱每秒充放電次數(shù)更多數(shù)據(jù)翻轉(zhuǎn)越多越耗電一直不變的位幾乎不耗動態(tài)功耗和游戲開發(fā)的聯(lián)系手機游戲發(fā)燙降頻本質(zhì)就是每秒充放電的次數(shù)和電量太多熱量散不出去。降低幀率、減少無用計算等于減少充放電次數(shù)。八、“1會不會自己變成0”會原因說明漏電DRAM 靠刷新、閃存靠糾錯和定期重寫來應(yīng)對宇宙射線 / 高能粒子粒子穿過芯片產(chǎn)生電荷可能翻轉(zhuǎn)一個位單粒子翻轉(zhuǎn)高海拔、航天設(shè)備更明顯Rowhammer反復高頻訪問 DRAM 某一行相鄰行的電容受干擾漏電更快可能翻位曾被用于安全攻擊電壓不穩(wěn) / 過度超頻信號還沒穩(wěn)定到閾值以上就被讀取閃存磨損絕緣層損壞電荷關(guān)不住應(yīng)對方法方法用在哪里ECC 內(nèi)存服務(wù)器內(nèi)存自動糾正單位錯誤校驗和 / 哈希網(wǎng)絡(luò)包、文件下載CDN 那一篇的下載后校驗哈希閃存控制器的 LDPC 糾錯SSD 內(nèi)部冗余與重試網(wǎng)絡(luò)可靠傳輸ACK 與重傳前面網(wǎng)絡(luò)篇講的校驗 重傳和內(nèi)存的 ECC 是同一個思想物理世界的 0 和 1 并不完美可靠性是靠上層機制補出來的。九、用代碼模擬一下 DRAM 漏電與刷新用一個簡單模型直觀感受電荷按比例泄漏低于閾值就讀錯。usingSystem;classDramCell{publicdoubleVoltage;// 當前電壓constdoubleVdd1.0;// 滿電電壓constdoubleThreshold0.5;// 判定閾值constdoubleLeakPerMs0.01;// 每毫秒泄漏 1%簡化publicvoidWrite(boolbit)Voltagebit?Vdd:0.0;publicvoidTick(doublems)Voltage*Math.Pow(1-LeakPerMs,ms);publicboolRead(){boolbitVoltageThreshold;Write(bit);// 讀取是破壞性的讀完寫回相當于刷新returnbit;}}classProgram{staticvoidMain(){varnoRefreshnewDramCell();varwithRefreshnewDramCell();noRefresh.Write(true);withRefresh.Write(true);for(intt0;t120;t10){Console.WriteLine(${t,4}ms 不刷新:{noRefresh.Voltage:F2}V $定期刷新:{withRefresh.Voltage:F2}V);noRefresh.Tick(10);withRefresh.Tick(10);if(t%4030)withRefresh.Read();// 每 40ms 刷新一次}Console.WriteLine($不刷新讀到:{(noRefresh.Read()?1:0)});// 0數(shù)據(jù)丟了Console.WriteLine($定期刷新讀到:{(withRefresh.Read()?1:0)});// 1數(shù)據(jù)還在}}運行后能看到不刷新的那個單元大約 70ms 后電壓跌破 0.5V“1變成了0”定期刷新的始終保持在閾值以上。真實 DRAM 的泄漏速度和刷新機制比這復雜得多這里只是演示原理。十、常見的誤解誤解實際情況“1 就是有電流流過”通常是有電壓電荷積累不一定有電流SRAM 和 DRAM 保持狀態(tài)時幾乎沒有電流“充電一定是 1”只是約定NAND 閃存里電子多反而是 0“1 就是正好 1 伏”是一個電壓范圍靠閾值判斷“內(nèi)存斷電馬上清零”DRAM 電荷要逐漸泄漏低溫下甚至能保留數(shù)秒以上冷啟動攻擊就利用了這一點“硬盤也是靠充電”機械硬盤靠磁化方向不靠電荷“數(shù)字信號不會出錯”會只是有閾值和糾錯機制擋住了大部分錯誤“存儲里的數(shù)據(jù)是永久的”閃存會老化和漏電長期不通電的 SSD 有丟數(shù)據(jù)風險重要數(shù)據(jù)要備份一句話總結(jié)1在物理上通常是某個地方積累了一些電子形成了高于閾值的電壓。DRAM電容里約幾萬個電子會漏電所以每幾十毫秒要刷新一次讀取時還會被破壞、需要寫回。SRAM兩個反相器互相鎖住的電壓狀態(tài)只要通電就能保持快但貴。閃存電子被隧穿關(guān)進浮柵斷電也能保存而且按慣例電子多的是 0。不管哪一種1都只是物理狀態(tài) 人為約定 閾值判斷。計算機之所以可靠是因為在這些并不完美的物理狀態(tài)之上又疊加了閾值、刷新、糾錯和校驗。