1.首先介绍一下自己
2. Socket的通信流程
Linux C网络编程基础
3.手撕快排
手写快排代码
4.说说DNS的具体流程
第一步、 Chrome浏览器 会首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存)
(注:chrome://net-internals/#dns 来进行查看Chrome自身的缓存)
第二步、 如果浏览器自身的缓存里面没有找到对应的条目,那么Chrome会搜索操作系统自身的DNS缓存,
如果找到且没有过期可以在命令行下使用 ipconfig /displaydns 来进行查看 )
第三步、 如果在Windows系统的DNS缓存也没有找到,那么尝试读取hosts文件
(位于C:\Windows\System32\drivers\etc),看看这里面有没有该域名对应的IP地址,如果有则解析成功。
第四步、 如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,发起域名解析请求
(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必
须得提供给我们该域名的IP地址)运营商又会从自身的一级一级缓存中查找,最后从服务器数据库中
找到对应的ip地址返回来。
【当然dns服务器有好多级,什么com cn 很多,从根服务器又一层层分了好多。一般用户是就近访问。】
5.如果让你来设计一个定时器,你怎么设计?
C++ 实现定时器
6.堆知道么?最大堆和最小堆说下
堆的实现
7.说几种你常用的设计模式
8.大端和小端了解么?
大端:高字节存放在低地址
小端:高字节存放在高地址
9.select,pool,epoll的优缺点和应用场景。
IO多路端口复用
10.问了项目中的线程池原理,怎么实现,什么时候初始化,什么时候激发
线程池
11.七层网络模型说下,和每层对应哪些协议
12.粘包问题怎么解决,我答包头加包体,包头里面的成员都有哪些?
应用层粘包问题的解决。
技术面
1.进程间通信(管道,共享内存,消息队列等)以及各自的应用场景
管道(pipe)用于父子进程之间通信,共享内存,消息队列用于
2.TCP和UDP的区别以及他们的应用场景
TCP可靠的面向连接字节流
3.Socket的通信流程
4.STL标准库里的vector和map的底层实现,以及应用场景
5.问了我的毕业课题
6.我的项目是 高并发多线程服务器程序,问我最大支持多少并发,做没做过压力测试?
7.linux下默认可以使用最大的端口数目,范围是多少。我答最大65535?最小呢,1000?不知道对不对
8.nginx 知道么?说一下你的理解
ngix是一个高性能Web服务器,最大的特点是负载均衡和反向代理。
介绍做过的最有成就感的项目
画项目的架构、模块、技术图
RPC的原理
项目中的socket怎么用,什么原理
es底层实现原理
什么是倒排索引
介绍服务降级
介绍分布式锁
介绍分布式事务
java怎么保证可见性
java怎么保证串行
介绍synchronized
Redis为什么快
介绍Redis的IO多路复用
IO多路复用使用什么数据结构
epoll 红黑树
Redis集群通信原理
即时通讯的消息怎么存储,怎么保证数据不丢失
Redis怎么保证集群间同步
MySQL分库分表原理
MySQL主从怎么保证数据一致性,有哪些同步机制
数据推荐服务算法
题目
百度-两面
一面(1小时)
常规:
- 自我介绍
- 介绍项目、学习的技术、遇到的问题
- 介绍实习公司做的业务
技术:
https会影响http性能
- composer fabric基础架构
- 介绍共识算法
- http和https区别,建立连接后哪个性能低,为什么
- http和https的端口固定么
可以改
- 长链接和短链接区别
HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
- Linux文件描述符作用
一个文件描述符,对应一个文件
- Linux怎么查看网络端口占用
netstat -ntlp
- Linux怎么查看CPU占用
top
- 为什么有时中CPU占用会过高,怎么解决
- 匿名内部类中能否访问外部局部变量(final),为什么要加final
- java注解底层实现原理
- 什么是事务
- postman怎么根据上一个接口返回值动态设置请求参数
- mysql怎么存ip地址,怎么实现
- 用过哪些数据访问框架
- 怎么实现分布式调用链路追踪
- 分布式锁是为了解决什么问题
- 后端开发一般注意哪些问题
- 手写Java单例模式
业务:
- 一般怎么用户鉴权
算法:
- 判断镜像二叉树(go)递归
提问:
- 能从事哪个方向的工作
二面(1小时)
常规:
- 自我介绍
- 介绍实习公司的项目
- 介绍你认为最有难点的项目
技术:
- 画出实习公司的项目结构,介绍调用关系,异常处理等
- 指出top命令各参数的含义(load balance)
- cpu数值表示什么(比例)
cpu的占用率
- 为什么有的进程cpu占用显示超过100%
- 进程sleep时处于什么状态
中断挂起状态
- 如何编程实现对CPU占用率的控制
编程之美原题
- 区块链和数据库有什么不同,区块链有哪些优势
- 区块链为什么有这些优势
- 介绍TCP滑动窗口
- 介绍TCP三次握手和四次挥手,为什么要四次挥手
- 什么是vlan
- 什么是vxlan
算法:
- 两栈实现队列
- 两队列实现栈
- 输出二叉树左侧视图
提问:
- 哥你多大?(为什么提这个问题呢,我觉得面试官说话很幽默,而且长的很年轻)
美团-三面
一面(1小时)
常规:
- 自我介绍
技术:
- 详细讲解区块链
- 对称加密和非对称区别,哪个更快,为什么
对称加密就是公钥加密,公钥解密,非对称加密就是公钥加密,私钥解密。
- https流程
- 什么是MySQL聚合索引,判断是否能触发索引(最左原则)
- 为什么MySQL索引有最左原则(b树)
- B树,B+树,全文索引的区别
- Redis怎么保证高可用
算法:
- 一颗四叉树,度数为4的节点有6个,度数为3的节点有10个,度数为2的节点有5个,求叶子结点个数
- 数组区间求和
- 数组分界为左右两部分,求这两部分最小差的分界位置
- 数1可以乘2或加1,求最少操作多少次能到2019
二面(1.5小时)
常规:
- 自我介绍
技术:
- volatile怎么保证可见性
- 线程有几种状态,状态怎么切换
- java怎么中断线程
- ThreadLocal是什么
- 怎么让一个线程等前三个线程任务执行后再执行
- 线程池有什么优点
线程使应用能够更加充分合理的协调利用cpu 、内存、网络、i/o等系统资源。
线程的创建需要开辟虚拟机栈,本地方法栈、程序计数器等线程私有的内存空间。
在线程的销毁时需要回收这些系统资源。频繁的创建和销毁线程会浪费大量的系统资源,增加并发编程的风险。
- 线程池有哪些参数,怎么设置比较好
工作的线程数,最大的线程数,上水位和下水位
- 怎么定位哪个程序的哪个方法占用CPU
- IO和NIO区别
- 数据是怎么加载到内存中的(磁盘读写原理)
- 用过哪些数据库
- Redis单线程为什么快
- Redis使用场景
- Redis单线程为什么快
- Redis怎么保证高可用
- Redis怎么保证数据不丢失
- 什么是一致性Hash
- 分布式场景怎么生成全局唯一ID
- MySQL底层索引怎么实现
业务:
- 有用Redis设计过哪些场景
- 设计一个分布式累加器
- 通常按照什么依据分库分表
- 怎么提高项目的可扩展性
- 怎么优化以前的项目
算法:
- 给六个数,求出所有左边三个数和小于右边三个数和且有两个特定数不能相邻的所有排列
提问:
- 职业发展
三面(20分钟)
常规:
- 为什么选择直接工作(我甚至以为是HR面?)
技术:
- 讲一下Java类加载器
- 使用过哪些设计模式
- 工厂模式和模板方法模式的区别
业务:
- 给一个推荐服务,怎么计算其qps
连续触发推荐条件
单个进程每秒请求服务器的成功次数
算法:
- 两个有序数组,求两个数组中各取一个元素的最小差值
字节跳动-三面
一面(40分钟)
常规:
- 没有自我介绍
- 介绍项目
- 介绍实习业务
技术:
- 是否使用过多线程,一般怎么使用(线程池)
用线程池
- 详系介绍线程池的原理和参数设置
线程池参数
- 介绍线程的状态机
- 进程和线程的区别
- CPU执行的是进程还是线程
线程
- CPU的几种调度算法
- tcp和udp有什么区别
- 什么情况下用tcp和udp
- tcp滑动窗口机制的作用
- 四层负载均衡和七层负载均衡的区别
- 怎么实现四层负载均衡
算法:
- 给出二叉树右侧视图列表
层序遍历
- 股票问题,同时买卖一支股票和多支股票的情况下求赚钱的最大值
二面(1小时)
常规:
- 自我介绍
- 介绍项目
- 介绍实习业务
技术:
- tcp和udp的区别
- 你编程时什么时候会使用udp
UDP可以通过应用层实现可靠。
- MySQL的底层实现,为什么用这种实现
- Redis数据过期策略
业务:
- 设计一个用户鉴权机制
智力:
- 给你三个硬币,抛正反概率均为50%,让你通过抛硬币从桌上的三支笔中等概率选一支
算法:
- 给定一个集合,输出其所有子集
回溯, 每一个元素选或者不选
- 怎么集合去重(判断两个集合是否一致)
三面(1小时)
常规:
- 自我介绍
- 介绍自己做过的项目
- 重点介绍一个最让你成长的项目,有哪些成长
- 介绍实习业务
技术:
- 区块链怎么保护电子合同的内容隐私
- 为什么要用多线程
- 怎么实现Socket通信
业务:
- 设计一个地铁路线查询系统,包括地铁、站台、换乘信息等,设计数据库和索引
数据库设计
算法:
- 求一个起始站和终点站之间的最短距离,边权均为1,要求输出最短路径
BFS算法,无权图的最短路径