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 行代码 。。。不是我压力各位的积极性,这 。。。反正我不想再看见它了 。。。

推荐阅读