先说结论吧:DRAM的随机读写速度必然慢于连续读写。
主要原因是CPU存在着多层次的cache,随机读写会造成大量的cache miss,必然引发速度下降。除非是完全没有cache的CPU,比如Intel第一代的8086 CPU。
因为不存在cache,所以随机读写速度基本上跟连续读写是一样的,但8086的随机跳转性能会差一些,因为8086上还是有几个字节的指令预取缓存的。
回到题主的问题,段页式转化是必然要产生性能损失的,极端的例子是虚拟化,虚拟化是两次翻译,先从虚拟机的虚地址转换成虚拟机的物理地址,再转换成实际物理地址,所以虚拟机的内存访问性能要慢于非虚拟机,但这个浪费并不是“很大”,Intel号称虚拟机的内存访问性能比非虚拟化模式慢10%~30%左右,这是过去的数据,不知道现在什么样了,所以算不上“浪费很大”。
实际CPU在翻译段页地址的时候,页面内的地址翻译是有缓存的,比如对于指令来说,只要不踩到页边界,是不会触发新的地址翻译(这里特别说明一下:操作系统从实模式切换到保护模式的时候,也用了这种技巧:不跨页,不触发地址翻译)。而跨页的话,也并非到RAM里拿页表,那样开销太大了,有TLB的存在可以提高地址翻译速度。
BIOS层面上的物理地址到实际物理设备的地址翻译是在内存控制器里做的,这方面可以认为是没有性能损耗的,因为翻译的过程是可以认为是静态的,就算是有开销,也远远低于虚地址的翻译——这个是动态的,因为页表是可调整的。
不管地址翻译的开销有多大,也比不上cache miss,这个会严重影响性能。
有一些特殊的应用场合,会为了保证性能或者实时性,会关掉页表,或者做大页一一映射,这就是为了尽量让地址翻译的影响降到最低。
-------------------------------
再说SSD的问题,SSD是不需要寻道,但SSD也是有cache的,SSD内部有一张表,保存着逻辑扇区到物理扇区的映射,为了保证性能,这个映射表运行时是被SSD放到主控的cache里的,但基于成本的考虑不会是全cache的,那么这里就会有cache miss的可能,cache miss的开销可能是微秒甚至毫秒级,这样延迟就很大了。
随机写就更复杂一点,除了SSD本身的cache miss之外,SSD写操作的最小单元要大于读,SSD读的最小单位一般是一个扇区(512B/4K),擦除的最小单位是一个block,可能是128KB甚至更大,擦除一个block的开销是毫秒级的延迟,如果连续写128KB,可能是只需要擦除一个block,但如果是随机写,那可能是擦除非常多的block,其开销是完全不一样的。
所以即使SSD不需要寻道,其随机读写的性能也慢于连续读写。