字节跳动面经整理

1. 操作系统:

进程和线程介绍;

进程或线程死锁介绍;

多进程,多线程的并发执行带来的问题-死锁

死锁是指多个进程(线程)在执行过程中,由于竞争资源或者彼此通信而造成的一种阻塞的现象(互相挂起等待),若无外力他们都将无法推进下去。

银行家算法

了解活锁吗?(没听过)

操作系统中的堆和栈

栈(操作系统):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中栈,栈使用的是 一级缓存,他们通常都是被调用时 处于存储空间中,调用完毕立即释放。

堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。堆则是存放在二级缓存中;生命周期由虚拟机的垃圾回收算法来决定,所以调用这些对象的速度相对来得低一些。

2.

并发:

用过哪些锁,介绍一下读写锁

读写锁分为读锁和写锁,为了解决性能问题

同一时间只允许一个线程加写锁

如果有线程加了读锁,别的线程是可以同时加读锁的

如果一个线程加了读锁,其他线程是不可以加写锁的

3.
 

网络:

三次握手四次挥手,为什么是四次;

三次握手:

  1. 客户端发送syn0给服务器
  2. 服务器收到syn0,回复syn1,ack(syn0+1)
  3. 客户端收到syn1,回复syn1.回复ack(syn+1)

四次挥手(以客户端主动断开为例)

  1. 客户端发送fin
  2. 服务端收到fin,回复ack,然后服务器去处理其他事
  3. 服务器事情处理完,回复fin
  4. 客户端回复ack

TCP和UDP区别;

用户数据报协议UDP是无连接的,尽最大可能交付,没有拥塞控制,面向报文,支持一对一,一对多,多对一和多对多的交互通信

传输控制协议TCP是面向连接的,提供可靠交付 ,有流量控制,拥塞控制,提供全双工通信 ,面向字节流,每条TCP连接只能是点对点(一对一)

TCP和HTTP分别在那一层;

TCP属于传输层,HTTP属于应用层,IP在网络层

TCP如何保证可靠传输;

主要通过:校验和,序列号,确认应答,超时重传,连接管理,流量控制,拥塞控制

TCP拥塞协议中的慢重传算法;

慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小

HTTP介绍一下;

HTTP:超文本传输协议,详细的制定了万维网服务器与客户端间的数据传输的通信规则。

HTTP2.0了解吗?(不大清楚)

是HTTP协议的第二个主要版本,其特点是,不改动HTTP语义,方法,状态码,URI及首部字段的情况下,大幅度提高web性能;主要目标是改进传输性能,实现低延迟和高吞吐量。

HTTP1.1中的参数keepalive作用;

KeepAlive的作用就是在第一次创建连接时,服务器会把这个tcp连接保持一段时间(服务器端会有一个keepaliveTime的最大时间,超过时间就断开连接)。这样就不会频繁的去建立tcp连接,同一次请求中的信息传递都可以使用同一个tcp连接。

数据库:

事务的四大特性,并具体介绍一下;

事务是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。事务是DBMS中最基础的单位,事务不可分割。

事务具有4个基本特征(ACID):原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Duration)

脏读和幻读发生场景与区别;

介绍一下数据库事务;

讲一下B+树,为什么使用B+树;

讲一下主键;

算法:

LeetCode283 移动零:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

给定链表,确定中间数;

 

 

字节抖音后端提前批面经,攒人品

作者:好吃懒做贪玩东
链接:
https://www.nowcoder.com/discuss/447249?type=2&channel=666&source_id=discuss_terminal_discuss_hot
来源:牛客网

一面(50min)

  1. 自我介绍
  2. 数据库隔离级别以及可能出现的问题
  3. MVCC了解过吗

讲了undolog

  1. 数据库常见索引的数据结构
  2. 为什么用B+树而不是B树或者其他
  3. 缓存淘汰算法有哪些?

lru,lfu,随机等等

  1. 让你用redis中的数据结构实现lru,你会选择哪种数据结构?

我刚开始答了map+链表,后来和面试官交流了一番后觉得不妥,然后说了SortedSet,按照缓存最近使用时间排序

  1. 你写了熟悉多线程,讲一下CountDownLatch
  2. 你刚刚讲了AQS,说说原理
  3. 写一个SQL

两张表,一张Score表,有学生id和分数

另一张表,有学生id,学生名字,学生性别

选出所有女生的成绩,降序排列

Select score from table1 inner join table2 on table1.id=table2.id where sex=”女”order by score desc

  1. 你刚刚写SQL用到了join,讲一下inner join,out join,left join,right join的区别
  2. 手撕代码,给出一个包含记录id,登录时间,登出时间点的日志,类似:

{

{0,0,5},

{1,0,6},

{2,1,3}

}

,求出所有时间点的在线人数,要求时间复杂度O(n)

ps 我是把开始时间和结束时间分别排序,然后统计,时间复杂的并没有达到要求,面试官最后说可以用动态规划,自己之后想一下

  1. 你项目里面有一个秒杀项目,分析一下

自我介绍

计算机网络学过吗?

说一下TCP和UDP协议的头部数据

UDP首部字段只有8个字节,包括源端口,目的端口,长度,检验和。12字节的伪首部是为了计算检验和临时添加的

 

HTTP2.0有哪些改动。

keep-alive是1.0还是1.1加进去的

http默认端口号是什么 :80/tcp

说一下https,为什么安全,具体说一下https建立连接的流程

HTTP有以下安全性问题:

使用明文通信,内容可能会被窃听

不验证通信方的身份,通信方的身份有可能遭遇伪装

无法证明报文的完整性,报文有可能遭篡改

HTTPS并不是新协议,而是让HTTP先和SSL通信,再由SSL和TCP通信,也就是说HTTPS使用了隧道进行通信

通过使用SSL,HTTPS具有了加密(防窃听)和认证(防伪装)和完整性保护(防篡改)

redis用过吗

说一下redis五种数据类型,置换算法说一下(FIFO,LRU,LFU)

用redis五种数据类型,手撕一个LRU算法(说了思路,不会。当时说的是用hash做储存,list实现一个双向链表维护)

redis的hashmap和java的hashmap有何异同

数据库学过吗?

说一下建索引用索引的条件,索引的弊端

有没有遇到过建了索引但是没走索引这种情况

给一个Linux 命令说明这命令干什么的   drwxr-xr-x 7 chris staff 224B Mar 4 11:20 go(太菜,不记得了,曾经似乎看到过)

给一个学生表,一个成绩表,查询性别是女的学生的成绩和姓名,按降序排列

说一下左连接和内连接的区别

然后一个动态规划题,给你一个日志文件,上面有每个用户登录登出时刻,求每一时刻同时在线的人数

logs[] = [[1,0,1],[2,2,3],[3,0,5]]

日志格式 是 uid,login_time,logout_time ,要求算法时间复杂度为O(n),只写出O(n^2)

 

 

作者:菜瓜瓜瓜
链接:
https://www.nowcoder.com/discuss/447063?type=all&order=time&pos=&page=1&channel=666&source_id=search_all
来源:牛客网

字节跳动一面凉经

1.四次挥手 (对这个比较熟练

客户端发送一个fin处于finwait1状态,服务器接受后返回ack处于close wait状态,客户端接受到ack后处于finwait2状态,服务器此时还可以发送数据,直到完成数据传输,发送一个fin,处于last ack状态。客户端接受到后发送一个ack,处于timewait状态并且2msl后自动关闭链接。服务器收到ack后关闭连接。

 

2.如果有很多链接同时到达,服务器响应不过来会怎么办?

服务器后面维护了一个队列,把不同状态的链接放到不同的队列里。如果队列满了就扔掉。具体细节有点忘了。

 

3.多态,你认为java的多态和c++的有什么优缺点?

我上次就面了多态,然后看了看,这两天没复习,然后面试时候听到这个问题直接懵逼了。太紧张了,我就随便说了说然后说我太紧张了没仔细了解过(╥ω╥`)

4.消息队列了解吗?

比于 FIFO,消息队列具有以下优点:

  • 消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;
  • 避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;
  • 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。

 

我只知道这个可以用来进程通信,具体不是很了解。

5.场景题,有点忘了之前没看过场景题。

 

当时太紧张了,面试官估计对我的基础知识没兴趣了,直接说来直接coding吧

 

第一题,打印根号x

我说这个我知道牛顿迭代可以更快,不过公式我忘了,写个二分吧

很快就写完了

字节跳动面经整理_第1张图片

字节跳动面经整理_第2张图片

第二题

二叉树最优路径和

很快写出来了

面试官:如果输出路径就更好了

思考了一会:我这个思路复杂度比较大

面试官:没事你写吧

我(太紧张了),coding了一会写出来了

面试官:我看你思路是对的,不过其实这道题你有点理解错了不过不要紧。你试一下第二个样例运行一下吧。

 

作者:不知道我是谁吧~
链接:
https://www.nowcoder.com/discuss/144942?type=all&order=time&pos=&page=1&channel=666&source_id=search_all
来源:牛客网

头条后端开发面经分享

因为每个人的理解不太一样,所以我在这里就不给出所谓的答案了,大家可以根据自己的理解加以描述,我只在一些地方做出一些提示。有的问题已经忘了,大概也就这些了。

一面:

进程和线程以及它们之间的区别(我通过对比多个面经,发现这道是必考题,划重点)

进程间的通信方式和对应的同步方式,你用过吗?具体怎么用?

进程间通信:管道(有名管道和无名管道),消息队列,信号量,共享内存,socket,stream

进程同步的方式:临界区,互斥量,信号量,事件

字节跳动面经整理_第3张图片

TCP和UDP的区别

1)基于连接与无连接(TCP是面向连接的,UDP是无连接的,即发送数据前不需要建立连接)

2)对系统资源的要求(TCP较多,UDP少)

  1. TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证
  2. UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信
  3. 每条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

UDP程序结构较简单

流模式与数据报模式

 

三次握手、四次挥手,为什么?

三次握手:

A向B发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号X

B收到连接请求报文 ,如果同意建立连接,则向A发送连接确认报文,SYN=1,ACK=1,确认号为x+1,同时选择一个初始的序号y

A收到B的连接确认报文后,还要向B发出确认,确认号为y+1,序号为x+1

三次握手原因

第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。

客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端在等待一个超时传重时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会达到服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对 滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。

 

四次挥手:

A发送连接释放报文,FIN=1;

B收到之后发出确认,此时TCP属于半关闭状态,B能向A发送数据但是A不能向B发送数据。

当B不再需要连接时,发送连接释放报文,FIN=1

A收到后发出确认,进入TIME-WAIT状态,等待2MSL(最大报文存活时间)后释放连接。

B收到A的确认后释放连接

四次挥手的原因:

客户端发送了FIN连接释放报文之后,服务器收到了这个报文,就进入了CLOSE-WAIT状态。这个状态是为了让服务器发送还未传送完毕的数据,传送完毕之后,服务器 会发送连接释放报文。

TIME-WAIT

客户端接收到服务器 端的FIN报文后进入此状态,此时并不是直接进入CLOSED状态,还需要等待一个时间计时器设置的时间2MSL。这么做有两个理由:

  1. 确认最后一个报文能到达。如果B没有收到A发送来的确认报文,那么就会重新发送连接释放请求报文,A等待一段时间就是为了处理这种情况的发生。
  2. 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络上消失,使得下一个新的连接不会出现旧的连接请求报文。

TCP如何保证传输的可靠性?

TCP的拥塞控制,具体过程是怎么样的?UDP有拥塞控制吗?如何解决?

算法题:

一个链表,假设第一个节点我们定为下标为1,第二个为2,那么下标为奇数的结点是升序排序,偶数的结点是降序排序,如何让整个链表有序?(分离链表,合并两个有序链表)

假设我们有一个队列,可能存放几千万上亿的数据,我们应该如何设计这个队列?写出来看看?(提问:这个队列是只需要在头尾添加和删除吗?双向队列?答:是的)

一个二维矩阵,从左到右是升序,从上到下是降序,找一个数是否存在于矩阵中(类似于二叉查找树)

二面:

前面面试官已经问了你三道算法了,那我就随便问一道吧:翻转链表(面试官:能不能用c写)....(然后让我一边写一边跟他讲redis)

redis

你知道redis有哪几种数据类型吗?你比较熟悉哪几种?为什么?

讲讲redis里面的哈希表吧

一个URL从浏览器输入到响应页面,整个过程是怎么样的,能讲得多详细就讲多详细。

你说HTTP可以进行多路复用,具体是怎么复用?如果服务器挂掉或者客户端挂掉,会怎么样?

HTTP的各种头你了解吗?每种头具体是什么作用?说一下

你说arp会进行广播,会造成网络风暴,那应该怎么解决?

你知道CDN吗?说一下

BIO NIO AIO说一下?epoll了解吗?用过吗?具体调用OS什么方法?webSocket呢?

创建进程调用的是OS哪些方法?具体说说

我们聊聊JAVA吧,你了解JVM吗?给我讲讲

JVM具体会在什么时候进行垃圾回收?JMM具体说说?

垃圾回收算法具体说说?各种垃圾回收器了解吗?什么时候执行STOP THE WORLD?

 

作者:特立独行MVP
链接:
https://www.nowcoder.com/discuss/384433
来源:牛客网

如果是面对秋招,我总结下来以下这些关键知识点是需要理解的:

  1. 进程和线程之间的区别
  2. 操作系统的调度算法
  3. 进程间通信的方式和区别
  4. 虚拟内存机制的作用
  5. 缓存的作用以及缓存替换算法
  6. 线程的实现方式
  7. 虚拟文件系统

 

 

作者:特立独行MVP
链接:
https://www.nowcoder.com/discuss/384433
来源:牛客网

计算机网络主要的常考知识点如下:

TCP/IP

1.分层模型

2.三次握手、四次挥手原理

3.拥塞控制

4.流量控制与滑动窗口

5.TCP与UDP比较

6.DDos攻击

7.close_wait,time_wait状态原因

HTTP

1.http/https 1.0、1.1、2.0

2.get/post 以及幂等性

3.http 协议头相关

4.Cookie Session 的比较

5.长连接与短连接,websocket的对比

Socket

1.IO模型

2.select ,poll,epoll原理和对比

 

 

作者:特立独行MVP
链接:
https://www.nowcoder.com/discuss/384433
来源:牛客网

数据库常考知识点:

MySQL相关

1.索引:B树、B+树底层结构,索引失效条件

2.sql语法

3.关系型数据库三范式

4.存储引擎:InnoDB和MyISAM对比

5.数据库的锁:行锁,表锁,页级锁,意向锁,读锁,写锁,悲观锁,乐观锁等等

6.数据库隔离级别:脏读、不可重复读、幻读

7.事务的ACID理论

8.查询优化:explain,慢查询,show profile

9.分布式:分库分表,读写分离

Redis相关

1.Redis 特点

2.Redis 底层数据结构:跳表,字典

3.数据淘汰策略

4.持久化方式:AOF,RDB

5.哨兵模式

6.集群同步方式

 

 

 

你可能感兴趣的:(字节跳动面经整理)