腾讯Golang后台实习开发面经
第一次体验到绝望的面试,太难了。
- tcp三次握手
- 每一次发送了什么
- tcp4次挥手
- timewait干嘛的
- 2MSL干嘛的
- timewait过多怎么解决
- 客户端服务器同时请求断开连接怎么办(不知道)
- tcp滑动窗口干嘛的
- 数据包到了网卡缓冲区,如何到的应用进程,说一下(我说帧一层层解包,他说更底层,还没到操作系统,那我就不知道了)
- tcp双方建立连接的api是什么,都做了什么
- tcp四次挥手可以变成三次吗
- linux查看多少个连接是已建立的(natstat -napt | grep "ESTABLISHED" | wc -l)
- 字节序
- 网络序和主机序了解过吗(不知道)
- 我发送一个数据包出去,我的二进制数据包子节序怎么转换的,对方接收到之后如何转化的(不知道)
- epoll的接口,与实现
- 网卡接收到一个数据包,怎么判断是否是自己的呢?(我说mac,他说这还是到了内核,在底层一些,不知道)
- 调用一个函数,说出调用函数的具体过程。(模棱两可ababa)
- 栈里面除了局部变量,函数参数 返回值,还有啥(不知道了)
- 创建一个协程的流程?(不知道,就说了下从哪里创建的,存放了什么)
- 协程调用,什么时候一定会发生线程上下文切换?(系统调用,那还有呢?)
- x86系统有哪些寄存器(全靠已知领域的记忆说了个说了基址寄存器,界限寄存器,还有golang闭包时候存储funcval的DX寄存器,也不知道对不对)
- 10^9个数据,找出前100个。(说了mapreduce思想分治,大顶堆,但是说不是最优解,不会放弃了)
- 我要设计一个流程图,怎么判断流程图里面是否是由循环引用
- 问我如何设计数据结构?
- 我先说因为有依赖,所以链表,可以快慢指针判断是否有环
- 然后,在复杂一点的呢?
- 想了两分钟,说树,他说树本来就没有循环,再想想
- 想了一分钟,有序图。
- 怎么判断是否有循环引用呢?
- 想了五分钟,不会。
- 算法(共享屏幕)
- 给你一个字符串,"43242"和一个divisor整数,算出来字符串除以这个dividor的结果,保留两位小数。字符串会越界uint64,最终的答案也会越界,怎么处理。
- 想了两分钟给了思路,代码只给了十分钟,没有AC。
真正的绝望开始
- 如果要你设计一个游戏服务器,比如在linux上用c++写了一个服务器,怎么判断性能指标呢?
- 你说natstat,这个能看连接情况吗?还有什么方法吗?
- 比如你golang写了个服务器,内存,性能,服务器都没问题,qps就是上不去,怎么解决?
- 你说可能是golang协程被限制了,怎么知道当前有多少的协程正在运行?
- 你刚才说可能是网络拥塞了,你怎么判断是否是网络拥塞了?
- 客户端https的时候,怎么验证的服务器证书安全的?(CA,验签,ababa。。)
- 你说服务器提前会向CA机构申请获取数字证书,那我要是云原生,起了很多pod,那我岂不是会同时有一万个服务器向CA机构发起认证?
- http的结构,如何编码的(请求行,头,体都是什么ababa。。)
- http怎么知道自己是什么类型的请求(请求行第一个)
- http怎么知道请求体的长度(content-length)
- 有些http协议是没有content-length,那怎么知道请求体的长度的呢
- 那你知道我们通过一个http url下载一个视频,实现方式或者原理是什么吗?
- 为什么平时SSL之后我们用对称加密加密,不用非对称加密呢?(说了因为算法实现难度的原因,导致非对称更慢,加密后的数据更大,不利于传输)
- 你说非对称加密更慢,慢多少指数级呢?非对称加密怎么实现的呢?(。。。)
- 要你设计一个游戏的uid,怎么设计?(时间戳-机器id-分库分表id-随机数)
- 你说用到了分库分表?具体怎么分?
- 存在数据库吗?数据库宕机了呢?
- 哪里生成id?你是指服务端生成id,存在数据库吗?那服务器宕机了,整个服务就没了?
- 你说mysql集群,那我们怎么部署mysql集群呢?
- 你说负载均衡,那每个服务器生成的id会重复怎么办
- 你说通过模拟雪花算法,弄几个比特位为机器ID,那要是100个服务器,不是得8比特?
- 你说一致性哈希,那要是节点变化了怎么办
- (现在想想可能可以是redis计数器来生成id,但是只是一个猜想罢了,毕竟这样uid按照顺序不安全。我觉得还是按照具体的业务的设计来看吧,如果原神这种uid,其实知道了对方的uid也无所谓,也造成不了什么影响。如果其他比较重要的,就需要考虑离散的了)
面麻了,昨天面完字节以为自己还行,一下子打回地底。
绝望。
#golang##golang实习##腾讯##后端#