这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」
io 的原理
磁盘io
- 磁盘io 通过系统调用read/write实现文件的读写,
- 磁盘设备与内核缓存区之间通过dma直接通信,
- dma完成后通过软中断通过cpu执行特定的中断程序,触发业务读取数据。
网络io
- 网络io 通过系统调用recv/read/send实现socket的读写
- 磁盘设备与socket缓存区之间通过dma直接通信,
- dma完成后通过软中断通过cpu执行特定的中断程序,触发业务读取数据。
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完成大部分读写。