0.2 秒居然復制了一個 100G 文件?怎么做到的?
點擊藍色“程序員黃小斜”關注我喲
加個“星標”,每天和你一起多進步一點點!
cp?命令,把他給驚到了!cp??拷貝了一個 100 G的文件,竟然一秒不到就拷貝完成了!ls??看一把文件,顯示文件確實是 100 G。sh-4.4#?ls?-lh
-rw-r--r--?1?root?root?100G?Mar??6?12:22?test.txt
sh-4.4#?time?cp?./test.txt?./test.txt.cp
real?0m0.107s
user?0m0.008s
sys?0m0.085s
cp?一秒沒到就完成了工作,驚呆了,為啥呢?分析文件
du?命令看一下,卻只有 2M ,根本不是100G,這是怎么回事?sh-4.4#?du?-sh?./test.txt
2.0M?./test.txt
stat?命令顯示的信息:sh-4.4#?stat?./test.txt
??File:?./test.txt
??Size:?107374182400?Blocks:?4096???????IO?Block:?4096???regular?file
Device:?78h/120d?Inode:?3148347?????Links:?1
Access:?(0644/-rw-r--r--)??Uid:?(????0/????root)???Gid:?(????0/????root)
Access:?2021-03-13?12:22:00.888871000?+0000
Modify:?2021-03-13?12:22:46.562243000?+0000
Change:?2021-03-13?12:22:46.562243000?+0000
?Birth:?-
stat?命令輸出解釋:Size 為 107374182400(知識點:單位是字節(jié)),也就是 100G ; Blocks 這個指標顯示為 4096(知識點:一個 Block 的單位固定是 512 字節(jié),也就是一個扇區(qū)的大?。@里表示為 2M;
Size 表示的是文件大小,這個也是大多數人看到的大??; Blocks 表示的是物理實際占用空間;
現實的存取場景


文件系統(tǒng)
登記名字就是在文件系統(tǒng)記錄文件名; 生成的牌子就是元數據索引; 你的行李就是文件; 寄存室就是磁盤(容納東西的物理空間); 管理員整套運行機制就是文件系統(tǒng);
空間管理


先寫數據:數據先按照 Block 粒度存儲到磁盤的各個位置; 再寫元數據:然后把 Block 所在的各個位置保存起來,即inode(我用一本書來表示);

先讀inode,找到各個 Block 的位置; 然后讀數據,構造一個完整的文件,給到用戶;

inode/block 概念

前 12 個槽位(也就是 0 - 11 )我們成為直接索引; 第 13 個位置,我們稱為?1 級索引; 第 14 個位置,我們稱為?2 級索引; 第 15 個位置,我們稱為?3 級索引;




為什么cp那么快?
創(chuàng)建一個文件,這個時候分配一個 inode; 在 [ 0,4K ] 的位置寫入 4K 數據,這個時候只需要 一個 block,把這個編號寫到? block[0]?這個位置保存起來;在 [ 1T,1T+4K ] 的位置寫入 4K 數據,這個時候需要分配一個 block,因為這個位置已經落到三級索引才能表現的空間了,所以需要還需要分配出 3 個索引塊; 寫入完成,close 文件;

總結
首先,最關鍵的是把磁盤空間切成離散的、定長的 block 來管理; 然后,通過 inode 能查找到所有離散的數據(保存了所有的索引); 最后,實現索引塊和數據塊空間的后分配;

內容不堪入目...冷門貼吧突然火了

日本后端女開發(fā)吐槽:不要找中國程序員!

某程序員吐槽:前端開發(fā)被哄搶,??茖W歷能進大廠;客戶端開發(fā)找工作難如登天,985本碩拿不到一個offer!
—?【 THE END 】— 公眾號[程序員黃小斜]全部博文已整理成一個目錄,請在公眾號里回復「m」獲取! 最近面試BAT,整理一份面試資料《Java面試BATJ通關手冊》,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數據庫、數據結構等等。
獲取方式:點“在看”,關注公眾號并回復 PDF?領取,更多內容陸續(xù)奉上。
文章有幫助的話,在看,轉發(fā)吧。
謝謝支持喲 (*^__^*)
