为什么早期的 Windows 需要整理碎片 & 为什么 Linux 和 macOS 不需要碎片整理
Windows为什么需要碎片整理?
- FAT 文件系统,其设计决定了同一份文件可能会散落在磁盘的不同位置
- 固态硬盘在上古时代没有普及,机械硬盘的随机读写性能(大量时间花在寻道和旋转上)很差
Linux 和 MacOS 为什么不需要碎片整理?
- 文件系统基于区块分配的设计使得磁盘上出现碎片的概率很低,延迟分配,自动的整理策略解放了操作系统的使用者,在多数情况下不需要考虑磁盘的碎片化;
- 固态硬盘的随机读写性能远远好于机械硬盘,随机读写和顺序读写虽然也有性能差异,但是没有机械硬盘的差异巨大;而频繁的碎片整理也会影响固态硬盘的使用寿命;
为什么 IPv6 难以取代 IPv4
首先,IPv6是为了解决 IP 地址即将被耗尽的问题。之所以没有取代,可以分成两个层面来看:
- IPv4 地址耗尽问题得以缓解:
- NAT 技术缓解了 IPv4 地址短缺的问题:局域网对外暴露同一IP,不同端口。并且NAT能够保护私有内部的网络,提供防火墙的功能
- IPv4 地址管控:更细粒度的管控(无类别域间路由(CIDR)基于可变长子网掩码) IPv4 地址并回收闲置的资源;
- IPv6 本身设计问题
- 不能向后兼容:只能通过双协议栈、隧道技术或者 NAT64 实现协议的过渡
为什么 MD5 不能用于存储密码
其实现在用哈希函数来存储密码都不够安全。
- 哈希:攻击者可以通过彩虹表(一张预计算的大表,其中存储着一些常见密码的哈希)来破解
- 哈希加盐:哈希函数计算较快;在GPU比较牛逼的情况下,哈希碰撞容易破解 其他密码存储方法:
- 加密:缺陷在于 “如何存储用于加密密码的秘钥”
- bcrypt:bcrypt 也是哈希,但是它有个特点,当计算大量密码的时候速度比较慢,大大提高了攻击成本。
JavaScript Debugger 原理揭秘
- 计算机的本质就是解释器
- Debugger 实现
- 编译型语言/可执行文件:依靠 cpu 支持的中段机制。 软中断:运行时替换执行的内容,debugger 程序会在需要设置断点的位置把指令内容换成 INT 3(0xCC,3号中断); 把替换的机器码记录下来,需要恢复执行时替换回去。 硬中断:通过 cpu 提供的 4 个中断寄存器(DR0 - DR3)
- 解释型语言:debugger 客户端 v8 引擎会把设置断点、获取环境信息、执行脚本的能力通过 socket 暴露出去,socket 传递的信息格式就是 v8 debug protocol
- nodejs debugger:
- —inspect
- —inspect-brk 首行断点
- 适配层协议:debugger adaptor protocol
前端工程师应该掌握的产品思维
前端也需要学一些产品思维,学会在需求会上提问。