字节后端实习一二面
感谢牛客网上很多同学提供的面经和经验,写一下自己的面经做一个回馈
1. 直接先讲讲ASCII, Unicode, utf-8的区别,真背过,真忘了,这是最难受的
2. 进程线程区别
3. 进程调度算法
4. 线程通信:后来我在网上查线程通信就是线程同步(信号,信号量,锁机制,条件变量),但面试时真不知道,转码选手真的是只背八股文的,没理解好。。。一懵逼讲成了进程通信(管道、共享内存,消息队列,信号,信号量,套接字),面试官中途打断说问的是线程,就直接说不知道了
5. 快表作用,逻辑地址物理地址转换
6. 虚拟内存
7. 计网:TCP四次挥手,主动说了2MSL
8. 有大量的time wait是为什么,蒙蔽了想成了大量的服务器的close wait,答了个:可能有bug(哈哈哈),服务器有过多数据依旧在发送。后来一想,啊应该回答等待时间可能大于2MSL的,导致大量客户端的TCP处于等待状态。
9. 数据库:事务特性
10. 原子性通过什么实现的(undo log),持久化呢(redo log)
11. 了解数据库的集群吗?弱智的说我不知道,但我知道redis的集群(主从,哨兵,cluster),主从如何同步,当时不会,后来学了是通过binlog以及比较复杂的一些IO机制实现的
12. 算法:单词搜索(leetcode 79),秒了,结果dfs里面一个or写成and了,找了好久
13. 问答,总共50min
二面:
1. Redis的5种数据结构是啥:string, hash, list, set, ordered set
2. String的特点,与C/C++有什么不同:二进制字符串,所以不能以\0结尾,需要规定长度
3. 讲讲hash:hash function:murmurHashing,解决哈希冲突:separate chaining。与你学到的其他语言的hash有什么不同:python dictionary hash: random hashing, 解决哈希冲突的方式是open address,因为源码里作者说separate chaining要维护的索引太多,不过缺点是扩容需求更大。
4. 讲讲跳跃表,跳跃表的指针层级是什么因素决定的(突然忘记那个公式了,按照理解胡编起来),跳跃表CRUD时指针的维护,讲到后面我自己绕进去了,面试官也绕进去了哈哈哈,就过了
5. 问了个啥,完全没听过,现在怎么也想不起来了,难受
6. 线程安全:不会,但感觉要是再说不会,我人就无了,主动说我猜线程安全可能与线程同步有关,我可以讲讲我对线程同步的了解吗?强行扭转话题
7. 在讲到线程锁后,既然讲到了锁,那你说说乐观锁和悲观锁吧
8. 我在OS里没有学到这两种,在SQL里学到了,所以话题来到了SQL,悲观锁讲了读写锁,乐观锁讲了一下基本概念,讲了一下自己的理解,顺便提到MVCC,讲了一下两者得相似点和区别(MVCC读-写无锁,写-写有锁,乐观锁均不加锁,扯到了点时间戳/版本号的更新方式,糊弄过去了)。
9. MVCC的概念,实现了哪种隔离级别:提交读和可重复读。为什么能实现这两种:脏读和不可重复读的本质是未提交,所以读写互斥。MVCC通过多版本快照防止读写互斥
10. 还知道MVCC哪些知识吗:undo log, 简单讲了快照读和当前读
11. Undo log是在什么时候执行的:不知道,猜测undo log的本质是为了提交前的回滚,所以在commit之前undo log会记录数据,commit后就清除词条数据。面试官点了点头过了,但也不确定对不对
12. 计网:讲讲DNS,先将DNS的端口号,然后讲DNS的目的,然后回答输入url的经典问题
13. 算法题:面试官现场编写题目。给定任意数组(元素均为整数),输出所有满足A[0 ~ i) < A[i] < A[i + 1:]的A[i],也就是说,如果元素大于它左边所有数,小于它右边所有的数,就把它append到result list中将其输出。脑子完全是蒙的,面试官说要不换一题,他已经开始写第二题题目了,突然想到了接雨水(leetcode 42),从左到右遍历一次,再从右到左遍历一次。我记得另外分发糖果(leetcode 135)也是这个解法,然后秒了。
14. 问答
15. 面试总时间75min,感觉这算法题也算是标准hard了,八股能答得都答了,希望能有好结果