面经 自我介绍一些课程安排(主要是听到我学校的课程里没有计网, 这估计也是没有问我计网的主要原因)操作系统内核态和用户态- 从概念扯到了在Linux中的实现, 内核态本质上是内核空间和权限的集合, 说了下进入到内核态怎么发生的用户栈切换到内核栈哪些操作是内核态的操作- 中断, 异常, I/O等用户进程怎么进入到内核态- 用户进程主动发起的系统调用, 以及中断(缺页中断), 异常系统调用和普通函数之间的区别- 普通函数是用户创建存在elf文件的text区域里面, 系统调用是写入系统内核源码的, 通过make来完整编译出来- 执行普通函数在用户的栈区里, 执行系统调用在这个进程的内核栈里执行上, 普通函数和系统调用之间区别- 系统调用会走内核栈, 申请内存也是通过伙伴系统分配物理内存, 通过slab内存管理器来分配内核对象Linux查看和CPU相关的参数, 使用什么命令查看- Top查看动态的排行- ps获取快照- perf查看某个进程的调用栈中每个函数的CPU占用比例怎么看一个系统在内核态占用的CPU的使用率- 当时忘记了, 和面试官说了下不记得了, 只记得怎么看内核对象的内存占用率了(slabtop), 实际上是pidstatCPU的IO_WAIT数量是怎么统计出来的- 大概说了IO_WAIT指的是因为IO操作被阻塞了IO_WAIT状态的时候, CPU是忙碌的吗- 现代IO设备里面都有DMA设施, 搬运数据的操作是交给DMA来做的, 不会阻塞CPU什么是零拷贝- 只有一次系统调用, 并且开启了某个内核参数以后, 能实现在内核空间不会有冗余拷贝- 在用户态是通过mmap直接将内核缓冲区映射到用户的虚拟地址空间上的什么是虚拟内存- 提供完全隔离的运行地址空间, 屏蔽了操作物理内存的问题- swap机制(也会导致程序抖动)- 内核里一段虚拟内存对应一个vma- 通过mm_struct管理vma什么时候开始分配物理内存- 触发缺页中断的时候会从伙伴系统里分配对应数量的页出来数据库什么是聚簇索引- 从聚簇到非聚簇, 再到非聚簇存在回表聚簇索引B+树的非叶子节点存储的是什么- 我说的索引, 但是面试官想让我回答的是id, 两个人因为这个问题都笑出来了主键是什么字段- 64位的int, 为什么是64位的int. 不使用32位- 32位太小了, 现在单张表很容易超主键一般有什么修饰- prime key- Unique- Autoincreament为什么是单增的- 能避免B+树出现页分裂什么是联合索引- 形式到最左前缀匹配规则到常见的用途, 索引下推和索引覆盖优化查询MySQL的一个查询最多可以用几个索引- 是一个trick向的问题(笑哭), 就是一个非主键索引加上回表的时候的主键索引, 两个索引, 也是说完两个人都笑了下Java线程的状态- CREATE, INTERRUPTABLE, BLOCK, RUNNING, STOP, TERMINATEDINTERRUPTABLE和BLOCK之间的区别- 说了下什么时候会分别出来这两种状态, BLOCK说了IO阻塞, 让我下去重新看下项目我自己说项目问为什么使用的rabbitmq- 我回答的是调研的结果是这个mq最简单易用, 但是被问到的为什么别的更复杂, 回答的只有简单的了解rabbitmq是保序的吗- 我说的是, 然后扯了些可靠性保证的一些内容rabbitmq是怎么做高可用的- 我回答的是不清楚, 但是为了避免mq成为单点问题, 是肯定有成熟的解决方案的, 不是很难的问题, 能很容易搜到解决方案场景题目超大文件排序- 两个人交流着写完了, 中间给了我一些提示算法原地操作的合并数组(第一个数组大小是m+n)反问对我的评价我的优缺点(没问业务是上一个面试官那问得挺清楚的)面试总结总体上看发挥还好, 就是Java上有点薄弱, 对于技术选型的考量上也太简单了.