开发面试常见问题和知识点

Knowledge

Java

JVM

JUC

MySQL

Redis

消息队列

OS

进程线程

零拷贝

【传统文件传输】磁盘缓冲区 => 内核缓冲区 => 用户缓冲区 => Socket 缓冲区 => 网卡缓冲区,所有都由 CPU 控制;

【DMA 拷贝】 基于 DMA 控制器而不是 CPU 实现 “将数据从磁盘控制器缓冲区转移至内核缓冲区中”,与硬件设备之间的数据搬运工作从 CPU 转交给 DMA 控制器;

【零拷贝】mmap + write 用户态直接共享内核的缓冲区,不需要再存入用户缓冲区,减少一次数据拷贝的消耗;sendfile 调用一次内核命令,数据直接从内核缓冲区复制到 Socket 缓冲区,而不经过用户区,减少一次数据拷贝和两次上下文切换的消耗;Zero-copy 网卡控制器直接读取内核缓冲区中的数据,实现最高效的传输,应用于 Nginx 和 Kafka;

【PageCache】内核缓冲区,缓存和预读磁盘数据,以提升磁盘读取速度;大文件传输不应采用 PageCache,而是基于异步和直接 IO;

网络模型

【优化路线】子进程 => 子线程 => 线程池 => IO多路复用

【select/poll】采用 BitsMap 或链表的形式储存所有 Socket 集合,每次检查都需要在内核态遍历文件描述符集合,以找到可读或可写的 Socket;在用户态和内核态之间拷贝整一个集合,在用户态处理应用任务,在内核态检查是否有事件产生;

【epoll】在内核中使用红黑树跟踪所有待检测的文件描述符,避免每次都要遍历所有 Socket 集合;基于事件驱动,采用回调函数,每次都只需要从就绪任务链表中取已准备好的 Socket;

网络

【TCP 四次握手三次挥手】

Questions

Java

JVM

  1. 了解垃圾回收机制吗?新生代和老年代的垃圾回收是怎么样的

JUC

  1. 简要描述线程与进程的关系,区别及优缺点?
  2. 线程之间哪些资源是共享的,哪些资源是私有的,为什么?
  3. 说一下你对于 AQS 原理的理解。
  4. 如何实现线程安全?

MySQL

Redis

消息队列

  1. 了解过消息中间件吗?说一下使用场景

OS

进程线程+零拷贝+网络模型

网络

Answer