秋招学习笔记 day48

1.线程池介绍一下

线程池是提前创建的一组线程,处理工作队列中的任务,用于短任务处理和高并发的场景,比如日志打印,数据库查询异步处理等操作,线程池避免了频繁创建销毁线程带来的开销,不过也不能过多因为线程切换也会带来开销。

线程池满怎么处理

线程池中的任务积压在任务队列中,如果任务队列满,可以直接拒绝服务,可以要求提交任务队列的线程完成任务,可以按照优先级给任务分类,然后把低优先级的任务丢弃,如果频繁的出现工作队列满要考虑增加工作队列大小,增加线程池中线程数目或者横向扩展。

2.线程切换的开销有什么

线程切换就是保存和恢复运行状态,包括程序计数器,寄存器,栈指针,如果是不同进程的线程还需要进行地址切换,保存和切换页表寄存器内容,切换页表内容,而且线程切换会导致 cpu cache 命中率下降,tlb 命中下降。

用户态和内核态切换开销

用户态和内核态的切换是同一个进程的切换不会导致地址切换,只切换程序计数器,寄存器和栈指针,切换 cpu 特权级别,执行系统调用,在执行完成之后要恢复用户态上下文。

3.一次 RPC 框架请求的完整过程是什么

首先把客户端的请求序列化,按照调用名和参数封装,然后由 TCP 把字节流封装成段增加 TCP 头包括序号和确认,之后把数据通过服务发现和负载均衡发送给服务端,服务端使用反序列化把数据调用到具体的业务服务,业务服务的结果序列化返回给客户端,然后客户端对数据反序列化得到结果。

RPC 请求从应用层到网络传输的过程是什么

首先是对数据序列化,然后通过 send 或 write 传输到 socket 的发送缓冲区,在缓冲区的数据由 TCP 封装成段,之后由 ip 协议进行路由发现,在此之后由数据链路层封装成帧,并由驱动网卡异步发送。

4.CPU 占用排查

首先通过 top ps 定位进程,然后定位到具体线程之后使用 gdb 调试和性能分析工具查看堆栈等信息,可能的导致 cpu 高占用的比如死循环,锁竞争,要根据堆栈信息和日志定位问题。

相关推荐
蒸蒸yyyyzwd6 天前
八股学习笔记 day42
c++·八股
蒸蒸yyyyzwd8 天前
cpp 选手秋招学习笔记 day40
笔记·八股
蒸蒸yyyyzwd9 天前
八股学习 MVCC 慢查询优化和 read 过程
c++·八股
蒸蒸yyyyzwd10 天前
算子开发面经学习笔记 day1
八股
蒸蒸yyyyzwd10 天前
cpp 选手秋招学习笔记 day38
笔记·八股
蒸蒸yyyyzwd11 天前
cpp 选手秋招学习笔记 day37 面经学习
c++·八股
蒸蒸yyyyzwd14 天前
cpp 选手秋招学习笔记 day34
c++·八股
蒸蒸yyyyzwd17 天前
与Redis和MySQL有关的知识
c++·求职招聘·八股
蒸蒸yyyyzwd18 天前
面经学习笔记
c++·面试·八股