秋招学习笔记 day48
1.线程池介绍一下线程池是提前创建的一组线程处理工作队列中的任务用于短任务处理和高并发的场景比如日志打印数据库查询异步处理等操作线程池避免了频繁创建销毁线程带来的开销不过也不能过多因为线程切换也会带来开销。线程池满怎么处理线程池中的任务积压在任务队列中如果任务队列满可以直接拒绝服务可以要求提交任务队列的线程完成任务可以按照优先级给任务分类然后把低优先级的任务丢弃如果频繁的出现工作队列满要考虑增加工作队列大小增加线程池中线程数目或者横向扩展。2.线程切换的开销有什么线程切换就是保存和恢复运行状态包括程序计数器寄存器栈指针如果是不同进程的线程还需要进行地址切换保存和切换页表寄存器内容切换页表内容而且线程切换会导致 cpu cache 命中率下降tlb 命中下降。用户态和内核态切换开销用户态和内核态的切换是同一个进程的切换不会导致地址切换只切换程序计数器寄存器和栈指针切换 cpu 特权级别执行系统调用在执行完成之后要恢复用户态上下文。3.一次 RPC 框架请求的完整过程是什么首先把客户端的请求序列化按照调用名和参数封装然后由 TCP 把字节流封装成段增加 TCP 头包括序号和确认之后把数据通过服务发现和负载均衡发送给服务端服务端使用反序列化把数据调用到具体的业务服务业务服务的结果序列化返回给客户端然后客户端对数据反序列化得到结果。RPC 请求从应用层到网络传输的过程是什么首先是对数据序列化然后通过 send 或 write 传输到 socket 的发送缓冲区在缓冲区的数据由 TCP 封装成段之后由 ip 协议进行路由发现在此之后由数据链路层封装成帧并由驱动网卡异步发送。4.CPU 占用排查首先通过 top ps 定位进程然后定位到具体线程之后使用 gdb 调试和性能分析工具查看堆栈等信息可能的导致 cpu 高占用的比如死循环锁竞争要根据堆栈信息和日志定位问题。