小红书,字节,腾讯,百度日常实习面经记录
因为没录音,好多问题不记得了,凭记忆写的
小红书:
一面:
1.给你一张表以及它的备份表,请用SQL命令判断这两张表的数据是否一样?
答:SELECT全表查询这两张表,并在内存中使用双指针判断是否一样 被说方案不好,全表查询是长链接,容易导致数据库炸了以及死锁问题
正确答案:回答使用hashcode这样的函数方法将其转换成为int,然后对某个质数做gorup by操作,判断每一组的数据量是否相等。 虽然可能会有特殊情况,但是概率极小
二面:
1.你b站做的工作是一个与下游高度耦合的工作,那么某个下游业务如果长时间不返回的话这不就会造成整个业务的阻塞?那么你应该怎么处理呢?(问的实习)
答:B站对于物料获取采用的是异步方式+责任链模式。如我们的DAG架构所示,没有依赖关系的物料之间是异步加载的,所以会减少对应的阻塞概率。并且B站采用了责任链模式来处理物料获取。当我们的某个物料获取超时时我们会根据该DAG节点的依赖强弱做对应的处理。比如页面降级等。
2.excutor有哪些参数?一般怎么配置?
答:配置线程池大小(最大线程数),即不能太大,不然会很费资源。配置核心线程数,指定线程池中保持活动状态的最小线程数。配置执行超时时间,指定任务的最大执行时间。如果任务在指定时间内没有完成,可以取消任务并执行拒绝策略。配置拒绝策略,指当任务被拒绝执行时采取的策略。常见的策略包括抛出异常、直接丢弃任务、丢弃最旧的任务、自定义处理等。
3.描述下Netty,Nio,以及epoll epoll只说了用户态注册channel到epoll,其他的没答出来
4.介绍下你理解的MySQL两阶段提交 这个答得比较好,追问也都说出来了
5.秒杀架构中怎么设计高并发的?
回答redis+lua脚本原子处理+异步消费更改MySQL。 追问:lua脚本的处理流程 答:判断库存,判断用户是否下单,扣减库存。 追问:你觉得这样的架构需要怎么改进呢? 答:redis改为集群(面试官不满意,似乎意思是替换掉redis,不会了)
补充(忘记是一面还是二面问题了):
1.redis数据结构的实现:如果有三种string类型的数据,<1,A><2,A><3,A>,问这三个A是指向同一个A还是分开指向不同的A? 答:不同
2.zset数据结构的实现 答:跳表 追问:跳表有几层? 答:不知道
3.redis为啥设计为了单线程结构? 答:1.防止线程切换导致的时间浪费,2.线程之间的安全问题(标准答案:多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗)
4.linux中的用户线程和内核线程之间的对应关系是怎么样的? 答:多对一 正确答案:多对多,多个用户线程可以映射到多个内核线程,以实现更好的并发性和资源利用。
5.用户线程与内核线程的区别? 答:用户线程由JVM创建与管理,内核线程由操作系统创建与管理。用户态线程由于上下文切换是由线程库函数来完成的,不涉及用户态与内核态的切换,所以速度特别快。内核态线程由于由操作系统直接管理,线程的创建、终止和切换都是通过系统调用的方式来进行,因此对于系统来说,系统开销比较大。 追问:我们怎么样才能调用内核线程呢? 答:jvm调用的,我自己没调过 正确答案:通常情况下,应用程序不会直接调用内核线程,而是使用线程库来创建和管理用户线程,线程库会处理与内核线程的交互和调度。这样可以更轻松地编写多线程应用程序,而不必担心内核线程的底层细节。
6.B站DAG架构的线程池中,怎么避免某个请求占用大量线程导致其余请求被迫等待的情况?(实习问题) 答:我们参考java中的excutor线程池的架构,通过一个pending list来让每个请求的线程池的请求都先进行排队。然后通过设计一个阈值来控制每个请求最多能获取多少线程,当超过阈值后,这个请求在队列中的优先级会降低,导致更难获取到线程(优先级调度算法)。 7.说下线程与携程之间的区别 答:go八股没背(笑) 正确答案:携程有点类似于JVM创建的用户态线程,他们都有自己的调度器与调度方案(非OS调用)。但是相比于java中的用户态线程,携程更加轻量级,创建和切换开销较低。 并且携程有着独特的GMP调度机制。
字节:
一面:
1.键入网址到网页显示,期间发生了什么? 经典八股,但没准备,就答了个解析url,请求DNS
2.手撕快排 秒了
二面:
1.面的很好还是挂了,感觉是KPI。问了MQ,机网,OS,rpc之类的比较深的八股,答得还行,没啥印象了。
2.手撕链表倒数第K个值 秒了
腾讯:
一面(面试官摄像头没开,完全没看我的简历瞎问,鉴定为KPI):
1.计网相关八股
1.1 TCP四元组是什么? 答:源地址,源端口,目标地址,目标端口,其中地址部分属于IP层,端口部分属于TCP层
1.2 三次握手能携带数据吗?四次挥手呢? 答:三次握手中第三次握手是可以携带数据的,因为前两次握手已经证明网络是可以正常通讯的。至于四次挥手,在第二次和第三次之间是可以传输数据的,因为这时服务器传回ACK后,是可以继续向客户端发送数据的,直到服务端发起FIN请求。
1.3介绍下TCP的流量控制与拥塞控制 我这里把这两个答反了
2.分库分表中间件怎么做到查询id位于哪张表与哪个库? 答:hash方法(面试官看上去不太满意)
3.手撕:力扣2370. 最长理想子序列
百度:
一面:
1.二叉树后序遍历转循环怎么做?
2.进程上下文,线程上下文
二面:
1.MySQL为啥使用B+树? 追问:MySQL中的B+树结构 这个回答时误把中间节点存索引说成了存头结点,寄
2.K8S+docker相关 我简历压根没提,也没准备,凭在B站实习的记忆答了个大概
3.go的八股
4.gc垃圾回收机制 答了JVM中的垃圾回收机制包括可达性分析+垃圾回收算法
5.手撕:走迷宫+最短权重 二维dp 秒了
总结:
还是准备不够充分,好多八股没看都直接冲了。以为日常实习水水就过去了,谁知道九月日常实习卧虎藏龙。我简历明明写的是对计网和OS只是了解,结果几乎所有的大厂都狂问这两个,让我再次认识到了基础的重要性。写个面经,祈求好运