背景:我之前在B站和字节实习过,两份实习用的都是Golang,滴滴这边用的也是Golang
上来简单做了个自我介绍,然后直接开始问问题,全程没有问实习相关和项目相关,问题基本集中在操作系统、计算机网络、数据库和Golang本身,我感觉是因为不同的部门有不同的考察侧重点,可以理解
全程面试官都是以一种和我探讨问题的姿态和我聊天,遇到不会的也会告诉我答案和相关技术,面试体验相当好~
操作系统:
1. 用户态和内核态
2. 零拷贝相关,mmap
- 当时mmap忘了,只说了mmap可以省去一次拷贝orz
3. 页面逐出算法
- LRU & LFU
- LRU的具体实现,LRU的缺点
4. 知道负载均衡吗?如何实现?
- 轮询 / 简单哈希 / 一致性哈希
- 讲了讲一致性哈希
5. 你从哪知道一致性哈希的?
- System Design Interview
计算机网络:
6. TCP三次握手的详细过程,可不可以只握两次手?
- SYN flooding
7. 提到了SYN泛洪攻击,如何防范?
- 没答出来,只记得可以通过SYN cookie来防范
数据库:
8. char和varchar
- 底层行格式的区别
- 取舍:内存碎片 + 查询效率 / 内存紧凑 + 频繁的系统调用?
- 面试官说如果是char可以把索引当数组用,但实际业务一般还是用varchar
9. int(5)这个5代表什么?
- 答案是显示宽度,当时蒙错咯
10. 乐观锁和悲观锁的实现
貌似数据库就问了这么点?我准备半天的MVCC事务锁啥的全都没问
Golang:
11. 先做了两个代码阅读的题,一个是defer相关的,一个是结构体相关的,不太好描述,就不放上来了
12. Go如何限制运行Go代码的核心数?
- 设置GOMAXPROCS全局变量,使其等于自己机器的最大线程数
13. 如果我有一台64核心的机器,但是设置GOMAXPROCS为8,那么是会只用到这八个核心吗,还是会有多个活跃的核心
- GMP相关的内容,执行Go代码的核心不固定,同时会出现大于8个核心执行代码的情况出现,因为可能有的线程陷入了系统调用
14. Go的int是多少位的
- u1s1,我真忘了...基础还是要补一补哈
- 答案是根据机器的位长决定,64位机器的话长度就是64bits
15. Go对于int32和int64的读写操作是原子的吗?
- 当时答错了,应该都不是原子的
16. 如果想要实现原子操作应该怎么做?
- Go提供了Atomic包,这个包实现了这些数据类型的原子操作
- 底层是用CAS完成的,利用了机器级指令,涉及到缓存一致性问题,当时忘了细说
17. 那么Go的Map是线程安全的吗?
- 不是
18. 如何实现一个线程安全的Map?
- 先说了一下github上存在的开源实现,这个实现参考了JDK1.7,用的是分段锁
- 然后又说了下sync.Map,这里说的特别详细,把Go开发者大会上讲的东西详细的说了说,具体适用场景和实现也讲了下,这个sync.Map有点像redis里面用dict用的双map,但又不完全一样
19. 基本上问完了,做个代码题吧。题目:数字翻转,输入123,输出321,输入-123,输出-321
- 比较简单,唯一的难点在于判断溢出
- 我跟面试官分享了一个我的方法,他表示很巧妙,没见过;他也和我分享了一个他的方法,我也没想到hhh,总之交流起来还是很快乐的
20. 突然表示忘了问redis,布隆过滤器了解吗
- 说了说是啥
一次愉快的面试就这么结束了~发现自己的基础还是有不足的东西,很多组件都太过专注于高阶的实现和设计思想,反而忽略了最基础的使用层面上的东西,回去需要打打基础了QAQ
全部评论
(7) 回帖