开发面试常见问题和知识点
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
- 了解垃圾回收机制吗?新生代和老年代的垃圾回收是怎么样的
JUC
- 简要描述线程与进程的关系,区别及优缺点?
- 线程之间哪些资源是共享的,哪些资源是私有的,为什么?
- 说一下你对于 AQS 原理的理解。
- 如何实现线程安全?
MySQL
Redis
消息队列
- 了解过消息中间件吗?说一下使用场景
OS
进程线程+零拷贝+网络模型