2021/3 暑期实习
- 上来抛了道js,问我输出
const a = (
i : 0,
toString(){
return i++
}
)
print(a == 0 && a==1 && a==2)
- 答案是false,没答出来,我当时主要纠结于为什么会调用toString呢
- 问了下闭包,以及和方法引用对象变量的区别
- union结构体,柔性数组
- 讲讲TCP三次握手,序数是从0开始吗
- 不是
- 讲讲数据包从本机到公网的历程
- 讲了arp,交换机,路由器这些
- 讲讲物理层的冲突
- 载波侦听多路访问
- 交换机和路由器的区别
- 交换机的端口分向内向外吗
- 不分,一个广播域,一个子网
- 了解tcmalloc吗
- 不懂,查了下,是thread cache malloc,一种内存管理中的内存分配方法
- 介绍自己的项目,聊到多态哈希,问我的并发控制是怎么做的
- 读写锁,map分片
- 哈希怎么做的内存管理
- 用bitmap,不是像slab用链表
- 等等,多数忘了
今天早上过了tx的二面,感觉面的很简单
- 讨论项目
- 问我了不了解第三方登陆接口
- 不了解,查了下,和OAuth有关
- 做题
- 用三种方法,计算一个数字转化为二进制后有多少个1
- for{b = a&1,a = a>>1,.....}
- 经典leetcode,找到数组第k大数
- 快排/优先队列
- 问了下算法复杂度
- 12个鸡蛋,一个天平,怎样快速识别出来唯一的坏鸡蛋
- 忘了
- 用三种方法,计算一个数字转化为二进制后有多少个1
- 接雨水,本菜鸡没写出来
- TCP三次握手,四次挥手
- 额外讲了个两个positive socket之间的主动连接
- 四次挥手可以是3次吗
- 回答可以,关闭连接的本质在于自己不再写socket,所以只要收到对方的fin,并且自己不再需要写,便可以返回fin+ack,没必要分开发
- SYN半连接攻击
- 导致SYN队列满
- 额外讲了个TCP cookie,用来解决SYN队列满的问题
- go GC
- 标记清扫法,三色标记法,混合写屏障
- 数据库事务的特性
- ACID
- 原子性:要么发生要么不发生
- 一致性:相容性,互相不矛盾
- 隔离性:四个隔离级别
- 持久性: 刷回硬盘,分数据和日志
- 讲讲隔离性中的幻读
- 即读出了其他事务插入的行,本质是只锁了行,可以通过gap锁来锁区间
- innoDB的索引
- B+树
- B+树的特点
- 叶子节点存数据,且链起来,方便顺序遍历
- B+树的优点
- 有序性:区间查找快,相较于B树的中序遍历,和hash的无序性
- 快速性: B+树更矮胖,查找的层级会更少,3层B+树可以容纳2kw个数据
- 稳定性: 因为数据都在叶子节点,所以搜索数据都必须搜到最底层
- 稳定性的好处,其实在于其非叶子节点容纳了更多的指向下一层的指针,这导致io次数急剧下降,所以应该说,不是稳定性的好处,而是B+树非叶子节点不存数据的好处(这导致了稳定性),想象一下.任意2kw数据,都可以只通过3次io就查出来,快到极致,反观B树,一层最多16个指针,16^6=1.6kw
- 可惜,当时我不会
- 结束
可以看出字节会偏向八股文一点,但是我个人觉得这是有必要的,因为虽然都是些基础概念,但每个人都会有自己的理解,而且都是比较简单的吧,如果不会,一是基础问题,二是态度问题.
并且字节问了我go的GC,这是我比较感动的,毕竟我简历上写着目标岗位是go后端开发:)