项目完成了登录模块的开发。
【刷题】
剑指 Offer 51 数组中的逆序对
剑指 Offer 52 两个链表的第一个公共节点
剑指 Offer 53 - I 在排序数组中查找数字 I
剑指 Offer 53 - II 0~n-1中缺失的数字
剑指 Offer 54 二叉搜索树的第k大节点

【Java基础】

  • Select/poll/epoll底层原理
  • Linux读写方式(轮询、IO中断、DMA)
  • 传统IO读写(4次拷贝(DMA2,CPU2),4次上下文切换)
  • Linux的零拷贝方式
    • 用户态直接IO(2次切换,2次拷贝)
    • mmap+write(减少一次CPU拷贝)
    • sendfile(2次DMA拷贝,1次CPU内核 ,2次上下文切换(只用于传输,不能修改)

select:两次拷贝,遍历fd_set,poll_wait(回调),mask
poll:类似select,链表fd_set
epoll:一次拷贝(共享内存)epoll_create(红黑树、就绪链表),epoll_ctl(注册回调事件,事件驱动),epoll_wait检查链表

mmap 是 Linux 提供的一种内存映射文件方法,即将一个进程的地址空间中的一段虚拟地址映射到磁盘文件地址(在内核完成映射),使用 mmap 的目的是将内核中读缓冲区(read buffer)的地址与用户空间的缓冲区(user buffer)进行映射,从而实现内核缓冲区与应用程序内存的共享,省去了将数据从内核读缓冲区(read buffer)拷贝到用户缓冲区(user buffer)的过程,然而内核读缓冲区(read buffer)仍需将数据到内核写缓冲区(socket buffer)

通过 sendfile 系统调用,数据可以直接在内核空间内部进行 I/O 传输,从而省去了数据在用户空间和内核空间之间的来回拷贝。与 mmap 内存映射方式不同的是, sendfile 调用中 I/O 数据对用户空间是完全不可见的。也就是说,这是一次完全意义上的数据传输过程。

【IO流】

  • IO流分类/File类
  • 字节流(输入/输出)
    • InputStream/FileInputStream
    • OutputStream/FileOutputStream
    • BufferedInputStream(缓冲流,8KB内存中)
  • 字符流(FIleReader/BufferedReader)
  • SequenceInputStream(把输入字节流逐个执行)
  • 序列化/反序列化(SerialversionUID作用:兼容新版本)
  • Properties(配置文件类)继承自HashMap
  • 打印流PrintStream(system.out中out就是它的缩写)
  • 字节字符转换流(InputStreamReader/OutputStreamWriter)

缓冲流:实质维护了一个8Kb的数组。会一次性向硬盘处理8Kb的数据,然后在处理这8Kb内与内存打交道,比直接与硬盘打交道快

  1. 如果对象需要被写出到文件上,那么对象所属的类必须要实现Serializable接口。
  2. 对象的反序列化创建对象的时候并不会调用到构造方法的。克隆也不会调用构造方法
  3. 如果一个对象某个数据不想被序列化,可以使用关键字transient修饰。

【集合】

  • 单列(Collection-->(List|Set))
  • 双列(Map)
  • 相关源码阅读(TODO)