当前位置: 首页 > 面试经验 >

万声音乐golang面筋

优质
小牛编辑
98浏览
2024-03-17

万声音乐golang面筋

目前oc率100%,继续保持。

因为自身在绿盟实习,这里纯玩啥也不用干,问了下学长的意见就不去了,打算狠狠带薪沉淀了,过俩月all in大厂。

-----我是一条分割线------

一面:

》自我介绍

说了下自己的学校,专业,年级,工作室负责的事,最近在学的东西,微服务,cs课程比如raft。

》展示下自己最值的一提的项目

我选的是一个raft相关的项目,把6.824移植出来弄了个高可用的kv,开屏幕共享展示了下容错表现,以及状态机实现思路,亮点是基于消息/事件,事件循环。

》你对于raft的理解,你认为raft是一个强一致性还是最终一致性的?

准确的说叫线性一致性,但是对程序来说可以看成强一致性的。这里我说了下我对raft的理解就是多个节点绑定成为一个不可宕机/或宕机机率非常小的单机节点,而单机节点就可以理解为一般意义上的强一致性了。

》你说下redis集群的一致性?最终一致性或强一致性?

redis主节点负责拿写入操作,从节点重放,其实会发生丢数据的情况,可以认为它是最终一致性,且会丢数据,根本不是强一致的。

》CAP理论了解吗?

说下AP系统或CP系统,trade off说下,常见场景说下就OK。

》有没有使用过redis,说下自己做了什么功能?

可以说zset实现排行榜,聊下跳表,红黑树,时间复杂度。可以说缓存。可以说stream实现消息队列。set实现共同关注。

》说下B+树和跳表有什么优劣?

先说下它们最底下一层都是链的数据,范围查询都很方便。此时可以说一下红黑树范围查询实现很难受,要返回父节点,来回捣腾。可以说B+树实现困难,跳表实现简单。可以说B+树存放2kw数据就只需要三层,IO少,查询快。那么为什么使用跳表? 可以说内存数据库不存在磁盘IO,此时只需要插入的快就不错了,B+树为了平衡会做额外的算法,较慢。

》为什么四次挥手?

从半关角度的方向说,说一下FIN包过程状态。扯一下muduo那本书的设计。

》进程线程协程?

写过简单的时间片调度器,简单聊聊设计就行。

》协程在操作系统层面是可见的吗?

协程是程序调度器自己切换的,寄存器信息都放内存里的,操作系统不知道这块内存干啥的。

》go的map并法安全要求

简单八股,说下write的标志导致panic就行。此时可以扯一下sync.Map的设计。

》说下gc过程

白给了,没背,直接说暂未了解。回头看刘丹冰的视频吟唱八股。

》mq你用过吗? 如果用redis实现延时队列

我说的轮询+list。面试官觉得不好,我从定时器设计角度说了下堆排,感觉差不多。其实我没有怎么了解这个,说的有漏洞,其实真的答案是zset,score存时间戳,排进去就立马把时间戳小的挤前面了。

》如何实现限流

说漏桶,令牌桶,滑动窗口。之前没了解这方面,只说了漏桶的思路,面试官好像不满意,他应该想听滑动窗口。

》写道简单题,acm模式,输出最长连续递增子序列的长度,1 2 3 4 1 1 1 7 8 9 10,输出5

简单dp,3min秒了。

》反问

反问1,业务用的什么框架? 说golang的gin,提供http服务。

反问2,对我有什么建议/评价?面试官的大概意思是让我多了解点常见的问题,比如常见八股,限流,gc,redis实现延时队列,实现mq诸如此类。

反问3,如果有下次面试,是什么时候?他说之后流程不是自己负责了。

面试官人很好,一直鼓励我,说话很委婉,爱了!

二面:

最汗流浃背的一集,感觉是个大佬,简单问题没答好。

》问下redis,说下基础数据结构

草了,脑子抽了压根没背,纯乱说,真实个煞笔,真想给自己两耳屎,听录音真尴尬啊!

》说下zadd, zcard, zrange的时间复杂度

简单。

》说下golang基础,下面输出是什么

简单,考察defer先进后出。

》golang基础,说下下面能通过编译吗

草了,这个脑抽忘了,我说第二句会不通过编译,他说错了。汗流浃背了。

》说下下面语句后的len和cap

简单,这个是切片的扩容策略,扯一下之后版本的优化,在达到一定的大小后不再2倍扩容。

然后又问了,a的地址发生改变了吗?这个问题要分两段答,本身没有改变,但是底下的pointer指向了新的地址。

又问如果a再次append一次呢? 两倍扩容。

》说下下面的输出

简单,这就是个闭包。输出1,2

》谈谈下面的代码。

我说会panic。

》说下预期输出结果

我坚持认为结果是未定义的,abc,abb,acc,ccc都可能。但是面试官坚持说ccc。无语了啊!!这里我说了go1.22的改进,以及v其实是同一个变量。

》goroutine什么时候会让出时间分片?

领域展开,可以说大栈消耗的函数调用,可以说信号抢占,直接说自己实现过信号抢占的调度器。可以说sleep这些api,read底下的wait会等待fd readable,此时被挂起。还可以说golang比较重要的信号量,好多sync的实现都依赖于它。还可以说系统调用会开新的线程,此时也会发生调度。我还说了调用c语言,但是我不确定,这点需要研究下。

》读写锁原理?

不知道,我说了C语言的锁实现原理。CAS,Fetch And Add,然后futex系统调用。这个真得去研究下代码了。

》写sql,说下获得某一天得所有data

简单,create_time限制一下范围。

又问,再考虑一下分页问题,用limit, offset就行。

》网络方面,说下拥塞控制

草了,没背!!!胡言乱语,汗流浃背了!!!

》http1.1和2的重要升级,3和2的区别

啊!!没背,只说到了队头阻塞。真得好好背了!3和2区别说了quic,我说了udp,不可靠得udp上面重新发明tcp。

》10TB url,50M内存,说下如何判断path出现得种类数。

这个很简单,把同样的url hash到同一个文件中,可以扯下mapreduce思想。

》反问:

  1. 怎么提升自己?golang基础还差点,有俩基础问题没答上来。多了解下redis的基础数据类型等基础八股。
  2. 业务做什么?省略了...

总结:去看看小林coding的mysql,redis,网络,狠狠准备八股。去看刘丹冰/小徐同学的gc,内存管理,以及一些sync的实现原理,比如mutex和rwmutex, waitgroup, cond,context,channel。去研究下golang调用c语言的原理。

 类似资料: