linux系統命令大全分享 linux原理和方法( 四 )


當客戶改寫一行的時候,對應到 memline 的一個 line 的改寫,對應到這行 line 在哪個 block 的改寫,從而定時的刷到 swap 文件 。
vim 特別的文件 ~ 和 .swp ?
【linux系統命令大全分享 linux原理和方法】假設原文件名稱:test.txt。
1 test.txt~ 文件test.txt~ 文件估計很多的人都沒見過,因為泯滅的太快了 。這種文件在改寫原文件曾經生成,改寫原文件之后刪除 。作用來只存在于 buf_write,是為了安全備份的 。
劃重要時機:test.txt~ 和 test.txt 本質是一樣的,沒有很多的特殊格式,是客戶資料 。
讀者朋友試試 vim 一個 10 G的文件,之后改一行內容,:w 保存,大概很簡無腦單發現這種文件(因為備份和回寫時間巨長 ) 。
2 .test.txt.swp 文件這種文件估計絕往往一般狀態人都見過,.swp 文件生命周期存在于整個進程的生命周期,句柄是一直打開的 。很多的人認為 .test.txt.swp 是備份文件,其實準確來講并不是備份文件,這是為了實現虛擬內存空間的交換文件,test.txt~ 才是真正的備份文件 。swp 是 memfile 的一部分,前面 4k 為 header 元資料,后面的為 一個個 4k 的資料行封裝 。和客戶資料并不完整對應 。
memfile = 內存 + swp 才是最新的資料 。
思考解答1 vim 存儲原理是啥?沒啥,只是用的 read,write 這樣的系統調用來讀寫資料而已 。
2 vim 的過程有兩種冗余的文件?test.txt~ :是真正的備份文件,誕生于改寫原文件曾經,泯滅于改寫成功之后;.test.txt.swp :swap 文件,由 block 組成,里面可能由客戶未保存的改寫,等待:w 這種調用,就會覆蓋到原文件;
3 vim 寫超大文件的時候怎么慢?往往一般狀態下,你能直觀感受到,慢在兩個地方:
vim 打開的時候;
改寫了一行內容,:w 保存的時候;
先說第一個場景:vim 一個 10G 的文件,你的直觀感受是啥?
我的直觀感受是:命令敲下之后,應該去泡杯茶,等茶涼了一點,差不多就能觀看到的窗口了 。怎么?
在進程初始化的時候,初始化窗口曾經,create_windows -> open_buffer 里面調用 readfile會把整個文件讀一次(完美的讀一次),在屏幕上展示編碼過的字符 。
劃重要時機:初始化的時候,readfile 會把整個文件讀一次 。
10 G的文件,你隨便想想就了解了有多慢 。我們應該算一下,根據單盤硬件 100 M/s 的帶寬來算,也要 102 秒的時間 。
再說第二個場景:喝了口茶,改了一個單詞,:w 保存一下,媽呀,命令敲下之后,又應該去泡杯茶了?怎么?
先拷貝出一個 10G 的 test.txt~ 備份文件,102 秒就過去了;
test.txt 截斷為 0,再把 memfile( .test.txt.swp )拷貝回 test.txt,資料量 10 G,102 秒過去了(第一次可能更慢哦);
4 vim 寫大文件的時候,會有空間膨脹?是的,vim 一個 test.txt 10 G 的文件,會存在某個時刻,需要 >=30 G 的磁盤空間 。
原文件 test.txt 10 G
備份文件 test.txt~ 10G
swap 文件 .test.txt.swp >10G
總結vim 寫文件并不沒有用黑魔法,還是用的 read,write,樸實無華;
vim 寫超大文件,打開很慢,因為會讀一次文件( readfile ),保存的時候很慢,因為會讀寫兩遍文件(backup 一次,memfile 覆蓋寫原文件一次);
memfile 是 vim 抽象的一層虛擬存儲空間(物理上由內存 block 和 swp 文件組成)對應一個文件的最新改寫,存儲單元由 block 構成 。:w 保存的時候,只是從 memfile 讀,寫到原文件的過程;
memline 是基于 memfile 做的另一層封裝,把客戶的文件抽象成“行”的概念;
.test.txt.swp 文件是一直 open 的,memfile 會定時的交換資料進去,以便容災復原;
test.txt~ 文件才是真正的備份文件,誕生于 :w 覆蓋原文件曾經,泯滅于成功覆寫原文件之后;
vim 基礎都是整個文件的處理,并不是局部處理,大文件的寫開始不適合 vim,話說回去,正經人誰會用 vim 寫 10 G 的文件?vim 只是個文本寫器呀;
一個 readfile 函數 2533 行,一個 buf_write 函數 1987 行代碼 。。。不是我壓力各位的積極性,這 。。。反正我不想再看見它了 。。。

推薦閱讀