白话okio

150 阅读2分钟

这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

io 的原理

磁盘io

  • 磁盘io 通过系统调用read/write实现文件的读写,
  • 磁盘设备与内核缓存区之间通过dma直接通信,
  • dma完成后通过软中断通过cpu执行特定的中断程序,触发业务读取数据。 image

网络io

  • 网络io 通过系统调用recv/read/send实现socket的读写
  • 磁盘设备与socket缓存区之间通过dma直接通信,
  • dma完成后通过软中断通过cpu执行特定的中断程序,触发业务读取数据。 image

javaIO

  • io都基于inputStream和outputStream两个基础类,底层通过read/write实现数据读写。
  • 字节流采用inputStream/outputStream,字符流采用Reader和Writer
  • BufferedInputStream采用8k的数组来缓存从内核缓冲区过来的数据,减少系统调用的次数。

javaNIO

相比于java传统io,nio

  • 采用mmap解决多次拷贝问题
  • 采用select/epoll解决线程阻塞问题

okio

  • 链式调用 sink与source通过工厂方法可以孵化出很多种
  • Buffer缓存机制8k*8,循环双向链表管理segment,避免gc和内存抖动
  • timeout机制,watchdog线程检测读取是否超时。
  • ByteString工具类,同时存放了string与对应的字节流data[],一些时候不需要通过decode方式就可以获得string。
  • 多个segment会检测大小进行合并和拆分

okio优势总结

  • 空间换时间,采用8k*8的buffer和ByteString中对于string,data[]同步存储。
  • 采用循环双向链表,复用segment方式减少内存分配,回收引起的gc抖动。
  • 简化使用,采用BufferedSource,BufferedSink完成大部分读写。

image