后端面试问题收集以及答案精简版
语言层面
go
Go并发原语 groutine select channel sync包
有没有了解channel的底层结构体。
使用channel时需要注意哪些事项,以及哪些场景下会panic。
map扩容:map什么时候触发扩容,哈希冲突的解决方案是什么
go内存分配的实现原理是什么
怎么在go中并发编程下等待多个协程的结束,Add()是什么意思。
go的slice不断append时是如何分配内存的,扩容规则是什么。
defer是用来做什么的,应用场景有哪些。
多个defer执行顺序:多个defer的执行顺序是怎样的。
map和slice哪个是线程安全的,map手动加锁和sync.Map的区别是什么。
如何控制 goroutine 的生命周期(channel 的作用,context 的作用)
GC
GC 三色标记
go内存逃逸
面试应该从以下角度回答
- 什么是逃逸?
- 导致内存逃逸的原因是什么
- 常见的发生逃逸的情况与逃逸分析
- 如何避免
Go程序启动时发生什么
Golang 程序的运行入口是 runtime 定义的一个汇编函数。这个函数核心有三个逻辑:
第一、通过 runtime 中的 osinit、schedinit 等函数对 golang 运行时进行关键的初始化。在这里我们将看到 GMP 的初始化,与调度逻辑。
第二、创建一个主协程,并指明 runtime.main 函数是其入口函数。因为操作系统加载的时候只创建好了主线程,协程这种东西还是得用户态的 golang 自己来管理。golang 在这里创建出了自己的第一个协程。
第三、调用 runtime·mstart 真正开启调度器进行运行。
当调度器开始执行后,其中主协程会进入 runtime.main 函数中运行。在这个函数中进行几件初始化后,最后后真正进入用户的 main 中运行。
第一、新建一个线程来执行 sysmon。sysmon的工作是系统后台监控(定期垃圾回收和调度抢占)。
第二、启动 gc 清扫的 goroutine。
第三、执行 runtime init,用户 init。
第四、执行用户 main 函数。
本题:感觉只要答出来M0的创建和M0的G0是怎么初始化 runtime 环境、goroutine的生命周期的就好,再往深的地方走面试就不用面了,时间能都砸这个上面
GMP
P的数量怎么设置:在程序中通过runtime.GOMAXPROCS() 来设置
M的数量怎么设置:runtime/debug包中的SetMaxThreads函数来设置
最高能有多少个P:应该是内核数量
最高多少M:最⼤量一般默认是10000 但是内核很难支持这么多的线程数
GMP模型中协程的最长运行时间是多久:10ms
Work Stealing偷多少:
M 优先执行其所绑定的 P 的本地运行队列中的 G,如果本地队列没有 G,则会从全局队列获取,为了提高效率和负载均衡,会从全局队列获取多个 G,而不是只取一个,个数是自己应该从全局队列中承担的,globrunqsize / nprocs + 1;同样,当全局队列没有时,会从其他 M 的 P 上偷取 G 来运行,偷取的个数通常是其他 P 运行队列的一半;
groutine生命周期
其实就是回答gmp模型
计算机网络
tcp和udp区别
tcp的可靠传输
数据库
隔离级别有几种,分别会产生什么样的问题
mysql
慢查询优化
MySQL数据是怎么写的,写入的底层原理是什么,涉及到哪些主键的交互,比如innodb写入时是先写入buffer pool。
binlog同步:MySQL主节点的binlog是同步的还是异步的。
主节点崩溃:如果MySQL主节点崩溃了,数据会不会丢失。
从节点写入:主节点挂了但向客户端返回成功,怎么保证从节点数据写入进去。
innodb索引:为什么innodb索引使用B+树。
数据量很大:数据量很大达到内存放不下时怎么解决。
1、索引(为何使用 b+树而不是使用别的数据结构? 索引下推?倒排索引?)
2、事务(ACID 隔离级别 幻读如何出现的 又是如何解决?)
3、锁(给一个 sql 问这条 sql 在不同隔离级别下是如何加锁的?)
4、mvcc 机制(实现原理以及 rr 和 rc 隔离级别下实现的区别?)
5、redolog undolog binlog(会问分别是用来做什么的 有什么共同点 区别?)
6、sql 优化(选择一个适合自己业务的 sql 场景 描述清楚自己如何通过 explain 命令来分析和优化的?)
redis
redis缓存:对redis作为缓存的理解是什么,用redis缓存和本地缓存,可以用本地缓存么(答了可以但不建议,然后面试官反问维护redis的成本呢)。
redis使用场景:redis的set和list的使用场景是什么。
redis set原理:redis set的原理是什么。
4、工作中,你们的ES和Mysql之间是怎么用的;
消息队列
2、项目里用了Kafka,那聊一下RocketMQ和Kafka的区别;
3、介绍一下Kafka集群、副本、选举;
项目
项目困难:在项目中遇到哪些困难的问题,项目的难点是什么。
迭代器 生成器