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


如下图:

linux原理和方法 linux系统命令大全分享

文章插图
block 很多的两种类别:pointer 类别:这种是中间的分支节点 。指向 block 的;
data 类别:这种是叶子节点;#define DATA_ID(('d' << 8) + 'a') // data block id
#define PTR_ID(('p' << 8) + 't') // pointer block id
这种 ID 等于魔数 。在 swp 文件中很简无脑单查看出去 。例如在下面的文件中第一个 4k 存储的是 block0 。第二个 4k 存储的是 pointer 类别的 block 。
linux原理和方法 linux系统命令大全分享

文章插图
第三 。第四个 4k 存储的是一个 data 类别的 block。里面存储了原文件资料 。
linux原理和方法 linux系统命令大全分享

文章插图
当客户改写一行的时候 。对应到 memline 的一个 line 的改写 。对应到这行 line 在哪个 block 的改写 。从而定时的刷到 swap 文件 。
linux原理和方法 linux系统命令大全分享

文章插图
vim 特别的文件 ~ 和 .swp ?
假设原文件名称: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 读 。写到原文件的过程;

推荐阅读