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