静雪的小屋

时间倒序 ↓
时间倒序 ↓
时间正序 ↑
热度倒序 ↓
热度正序 ↑

Sunpack开发后日谈(?)

初期只为了彻底解决“如何解压”这种问题的小项目,结果越做越发现不简单

有下面几个难点

  • Watch模式判稳模型:处理NTFS的事件系统的判稳模型的算法,不能轮询,要能处理事件风暴,这里事件过滤很重要。
  • 管理员安装软件问题:NTFS卷级日志要管理员权限,于是要处理Windows安装管理员权限软件问题。最坑爹的就是一个普通用户持有管理员Token安装软件,如果你写Appdata,数据会进管理员Appdata而不是当前用户的Appdata,导致当前用户运行软件找不到数据,解决方法就是安装全局机器。
  • 注册表坑:HKLM注册表注册toast通知身份不生效,必须HKLU。
  • 递归授权算法:这是开放性问题:什么算递归不能解压的文件。最终采用赔率模型。
  • 异步IO:overlapped IO平衡好粒度,异步IO看起来美好,管理成本不低,小任务管理成本过高,性能不如同步IO。同时异步IO的缓存性能和淘汰策略高度相关,遇到过缓存简单改FIFO,速度马上提升20%。
  • 7z并行算法的优化:难点是处理并行粒度,也就是要以低成本扫描迅速确定这个压缩包有多少个block可并行,根据需求并行,并防止内存爆炸。
  • 底层Rust分析:分析其实真不难,难点是你要平衡扫描成本和误判率,以及防止异常输入导致内存overflow。
  • WAL崩溃恢复:实现不难,难点是最低成本,毕竟确保绕过缓存的落盘写入极其昂贵,不能影响小任务速度
  • 分卷关系判断:混乱后缀下尽可能还原分卷,开放性信息瓶颈问题,难点在逼近信息论上限。
  • 密码批量探测:根据格式特点筛错误密码,难点是平衡成本和误判率,还有最后的兜底路径。
  • 错误处理状态机:状态爆炸,压缩包可能有各种错误,错误叠加而不能程序报错。
  • Windows原生托盘:难点一个是显示器分辨率,一个是资源管理器崩溃重启,这块全在给windows兜底。
  • 文件句柄管理:项目大了加上全面并发,各个地方都在读取,必须追踪,不追踪就会莫名其妙占用然后出极其难排查的竞态bug,这个就是项目当年最痛苦的bug。

做完后我也能理解为什么很多开源项目是大杂烩语言了()

  • 用Rust是因为Rust编译器和生态太好了,很多底层老旧库都有Rust新实现库,而且这些新实现的性能都特别好,现代特性用得很多

  • 用Python是因为开发效率高生态好,要不然哪怕增量编译也很麻烦。

  • 用C++是因为windows底层API最自然简单的交互方式就是C++,还有7z源码也是C++,你不得不用。
    至于C和汇编是7z源码和zlib-ng库代码自带的。

  • Powershell是windows开发脚本,用来构建环境,做windows原生测试的。

← 返回首页

发表评论

向右滑动验证

全部留言

加载评论中...