有个热爱的东西不容易
以下只针对Java岗。408即是考研常说的数据结构,计算机网络,计算机组成原理和操作系统。来源主要是牛客的Java实习面经。下面的回答直接背就可以,需要一定的计算机基础,适合春招实习的同学,但是我会在每个问题下把有助于理解的博客贴出来。如果发现有问题欢迎私聊我或留言我会在下面更新
字节跳动19年秋招本科,三七互娱19年春招,小米19年秋招本科,贝壳找房19年秋招本科
七层模式分为:物理层,数据链路层,网络层(IP,ICMP),传输层(TCP,UDP),会话层,表示层,应用层( HTTP,HTTPS,FTP,POP3、SMTP )
五层模型有了解吗
三七互娱19年春招
五层模型分为:物理层,数据链路层,网络层,传输层,应用层时
百度19年秋招
IGP是在AS内部使用的协议,代表是RIP和OSPF
RIP基于UDP,按固定时间间隔和相邻路由交换当前知道的所有信息。好消息传的快,坏消息传的慢
OSPF基于IP,当链路改变的时候会使用洪泛法向所有路由器发送副本消息(与本路由器相邻所有路由器的链接状态)
EGP是AS外部使用的协议,代表是BGP。每个AS选择一个发言人,刚开始时交换相邻AS的整个路由表,但是以后只需要交换变化的路由表
计算机网络网络层
猪场19年实习
经常使用ping命令来查看对方的网络情况,ping命令基于网络层的ICMP协议。ICMP是为了更有效转发IP数据包和提高成功交付的机会
滴滴19年秋招
对于TCP来说,它属于运输层,会涉及到三次握手,四次挥手,拥塞控制,流量控制这些层面上来
TCP是面向连接的,是1对1的全双工可靠交付,socket即基于TCP
可靠传输的原理
可靠传输通过ARQ协议,即每发送完一个分组就停止发送,收到确认后再发送下一个 。超时之后重新发送
TCP的流量控制和拥塞控制
流量控制:接收方通过动态变化的rwnd数值说明可接受的字节数
拥塞控制:采用慢开始,拥塞避免和快重传,快恢复来实现拥塞控制
对于IP层来说,它属于网络层。 提供的是无连接,尽最大努力交付的数据报服务,面向连接由运输层提供
IP地址有32位,IPv6有64位,ip报文最少20B
计算机网络传输层
字节跳动19年秋招/本科,pdd19年实习/本科,阿里19年秋招/本科,头条19年实习,小米19年秋招本科,19年bigo秋招本科,百度19年秋招
三次握手
四次挥手
为啥三次握手
三次握手验证了client和server的收发能力。如果四次握手比较多余,如果是两次握手的话:
client向server发送syn之后,此时消息阻塞到链路中某一节点上,client认为其失效,重新向server发送syn。但是之前阻塞的syn最后到达server,server会向client发出ack对已经失效的syn进行确认,但是client并不会应答。导致了浪费server的时间
为啥四次挥手
第二次挥手是必要的:主要是因为当server接受到ack之后不会立刻关闭,因为server需要等到消息发送完会后再关闭
第四次挥手也是必要的:如果TIME_WAIT状态的client不向server发送ack,那么server就不知道Client是否还在等待server的接收,极有可能server的fin失效,那么client就会一直等下去
19年bigo秋招本科,字节跳动19年秋招本科
TIME_WAIT是client向server的最后一次握手后的client状态。之所以要保证2MSL主要是因为防止自己的ack没有到达server,这样server可以在2MSL期间再次发送ack进行确认
但是TIME_WAIT在高并发短连接的状态不是太友好,在linux上可以通过SO_REUSEADDR
套接字来改 变状态,即当端口忙但是出于TIME_WAIT状态时可以重用端口
字节跳动19年秋招,滴滴19年秋招,猪场19年实习
流量控制协议
流量控制表明接收端可以接受多少字段,然后告诉发送方发送多少字段。整体是通过滑动窗口来实现的。
解决死锁的方式是当出现rwnd=0后,通过client定时向server询问
拥塞控制算法
拥塞控制表明发送端可以发送多少字段。主要是用来防止网络链路中的动态拥塞。主要实现方式有慢开始和拥塞避免,快恢复和快重传
对于慢开始来说,TCP最多会发送1个MSS,之后每次增加不超过1个MSS,
当拥塞窗口超过阈值,采用拥塞避免算法,拥塞窗口每个RTT只增加1。当网络发生拥塞,时,阈值变为1/2,拥塞窗口重新变为1个MSS
对于快重传来说,sender要求接收方在收到一个失序的报文段后就立即发出重复确认,如果发送三次ack后,就迅速重传,而不要等到自己的计时器(ARQ协议)到期后再重新发送
执行快恢复时,阈值变为1/2,拥塞窗口=阈值
阿里19年秋招,百度19年秋招,腾讯19年秋招
阿里19年秋招本科
按理来说TCP是属于套接字连接,所以会有端口号65535-1024个连接
但是对于linux单机来说,由于套接字是需要占用空间的,linux默认的文件描述符为1024,需要修改
百度19年秋招
pdd19年实习,阿里19年秋招本科,19年科大讯飞本科秋招,百度19年秋招
UDP和TCP都是运输层的协议
UDP不可靠会丢包,它有什么应用
UDP常用来视频的传输,即使丢掉少量的包,也可以接收
怎么解决UDP不可靠
UDP本身的不可靠传输是不能解决的,由于UDP是在运输层,我们只能通过应用层来解决UDP的不可靠问题。重点让应用层的协议实现AQR即可,即当sender接收到receiver的ack才确定接收成功。同时需要超时重传
udp 传送的一组数据中丢了一个咋办
通过AQR的超时重传
阿里19年秋招本科
tcp是基于流传输的,容易出现一个流中有多个包的现象,这就是沾包
udp是基于保护消息边界使得每一个消息都是独立的,出现消息报文传播
字节跳动19年秋招,瓜子二手车19年秋招,淘宝20年实习,百度19年秋招
Https
为什么是安全的
小米19年秋招本科
HTTPS通过CA进行客户端公钥证书的认证,采用非对称加密来获得秘钥,对称加密传输数据。理论上不可破解
和Http的区别
HTTP是80,HTTPS是443
HTTP会比HTTPS效率更高,HTTPS加密会浪费时间并且增加了秘钥交换即网络开销
但是HTTPS更安全
阿里19年秋招
可能会出现CA伪装攻击,即第三方通过ARP或者DNS欺骗获得客户流量称为客户端和服务端的中间人。在客户端看来,中间人即是服务器,此时第三方伪装服务端的CA证书来实现中间人攻击,伪装的证书要自己生成密钥,并使用该密钥进行签名,客户端访问浏览器时因为找不到证书发行者的公钥,无法验证,浏览器会有警告,此时选择不信任即可
CA中间人攻击
腾讯19年秋招
request主要分为请求行*(请求方法,url,协议版本),请求头,请求体;response主要分为状态行(协议版本,状态码)*,消息报头,响应正文
常见的header有:content-type
,user-agent
,accept-language
,connection
,cookie
小米19年秋招本科
Http短连接是1.0,长连接是1.1。长连接在我项目里有用,减少了每次三次握手的时间消耗,但是可能会增加不必要的连接时间s
和Http2的关系
淘宝20年实习
HTTP 性能的关键在于低延迟而不是高带宽,大多数 HTTP 连接的时间都很短,而且是突发性的,但 TCP 只在长时间连接传输大块数据时效率才最高。HTTP 2.0 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升
Http2具有一个显著的特点就是多路复用,相对于Http1来说,增加了非阻塞这一特点
淘宝20年实习,贝壳找房19年秋招本科
2xx:请求成功,
3xx:重定向
4xx:客户端请求错误。401:请求验证身份;403:服务器拒绝执行;404:路径请求错误,服务器没有合适资源
5xx:服务器错误。500:服务器乱码;503:服务器过载
瓜子二手车19年秋招,淘宝19年秋招,淘宝20年实习,腾讯19年秋招
get是幂等,post是非幂等
get通过url,post通过请求体
get长度由browser限制,post的长度由服务器限制
阿里19年秋招,淘宝20年实习
浏览器做了什么
访问过程
腾讯19年实习,pdd19年秋招本科,滴滴19年秋招
cd,grep,pwd,mv,cp,ps,top,nestat,vim,cat,mkdir,touch
有在上面编程吗
移动文件的shell脚本
echo "input the target dir :"
read dir
if [ ! -d $dir ]; then
mkdir $dir
fi
mv '20170690518' $dir
echo "remove successfully!"
淘宝20年实习,pdd19年秋招本科
ps -aux 查看mem查用情况,同时还有pid,user
top -H 动态查看CPU占用情况
top命令
猪场19年实习
netstat -an
看日志用什么
可以用head readme.md -n 2
头两行
tail readme.md -n 2
尾两行
cat readme.md
百度19年秋招
df -lh
以容易阅读的单位显示出磁盘分区的使用情况
top中的主要关注信息有哪些
猪场19年实习
?
滴滴19年秋招
滴滴19年秋招
信号:进程通过软中断方式通知另一个进程
管道:进程把数据放到FIFO的管道中
共享内存:类似于Java的堆
信箱:如果信箱为空,阻塞接受者;如果信箱为满,阻塞发送者
socket,管道,信箱,共享内存
并发编程的同步和死锁
头条19年实习,百度19年秋招,滴滴19年秋招
作业响应时间/作业处理时间
百度19年秋招
进程是资源分配的基本单位C;
线程是资源调度的基本单位Java;
协程依托于线程,比线程更轻量级。OS对协程一无所知,没有CPU开销Nginx lua;
协程是Linux的概念,windows的协程叫纤程
协程和线程对比,能解决什么问题
猪场19年实习
协程依托于线程,比线程更轻量级。协程的切换没有CPU开销,协程属于一种用户态线程。
协程相对于线程来说,线程的应用程序中没有设计好导致大量的锁、切换、等待,这些很多都是应用层的问题。而协程因为是非抢占式,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力
协程
协程原理
蚂蚁金服
分页是针对物理实存来说,不容易产生内存碎片,但是分段是一种虚存管理,有利于编程,容易产生内存碎片
段页式管理则是通过分段方法来分配和管理虚拟存储器,通过分页来管理实存
分页分段段页式
滴滴19年秋招
item B[k]; // 缓冲池,共有k个缓冲区,临界资源
semaphore empty = k; //空缓冲区个数
semaphore full = 0; // 满缓冲区个数
semaphore mutex = 1; // 保证访问缓冲池的原子性
int in = 0, out = 0; // 读写指针
cobegin
process producer() {
while(1) {
P(empty);
P(mutex);
increase(B[in]);
in = (in + 1) % k;
V(mutex);
V(full);
}
}
process consumer() {
while(1) {
P(full);
P(mutex);
decrease(B[in]);
out = (out + 1) % k;
V(mutex);
V(empty);
}
}
滴滴19年秋招
滴滴19年秋招
int CHAIRS = N; // 椅子数
int waiting = 0; // 等待的顾客
semaphore customers = 0;
semaphore barbers = 0;
semaphore mutex = 1;
cobegin
process barber() {
while(1) {
P(customers);
P(mutex);
waiting --;
V(barbers);
V(mutex);
cut_hair();
}
}
process customer() {
P(mutex);
if(waiting < CHAIRS) {
waiting ++;
V(customers);
V(mutex);
P(barbers);
get_hair_cut();
} else {
V(mutex);
}
}
coend
百度19年秋招
银行家算法是避免死锁的一种重要方法。 操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配
OS常见算法
滴滴出行19年秋招
快慢双指针,如果快指针追上慢指针,则有环
用一个指针怎么实现
增加一个hash表用来存放遍历过的节点
腾讯19年秋招
快慢指针,2倍速
滴滴出行19年秋招
LeetCode5
树对应着stack和queue的dfs和bfs
滴滴出行19年秋招
可以定义一个bool类型的visit,遍历过为1,未遍历为0,
阿里19年秋招
树可以(中间节点的)前序,中序,后序和层次遍历
除了前序和后序遍历不能确定结构,别的遍历都能确定结构,如前序AB,后序BA
阿里19年秋招
主要是用于哈夫曼编码。依次将最小的两个元素形成子节点,然后父节点为其和。依次形成一个树,即为哈夫曼树。然后根据他们每个元素的权重可以形成编码
阿里19年秋招
红黑树和B树都是AVL树的变种
红黑树
B树:变种b+树广泛应用于文件搜索
10大排序
冒泡排序,arr[i]一次和后面每个元素比较,如果大于则移到后面,时间为o(n^2),空间为o(1),稳定;
选择排序,每次遍历找到最大值或者最小值,放到前面或者后面,时间为o(n^2),空间为o(1),不稳定;优化为堆排
插入排序,从第二个元素开始,从后往前扫描,如果大于前面且小于后面则插入,时间为o(n^2),稳定;优化为希尔排序
七牛云19年秋招本科,阿里19年秋招
对于快排来说,先找到一个基准元素,然后将基准元素移到中间,两边使用分治
时间为o(nlog2n),空间为o(nlog2n)。
和归并相比,哪个比较好一点,稳定一点
归并排序是由内到外的逐步排序,时间为o(nlog2n),空间为o(n)。快排不够稳定,但是归并是稳定的
阿里19年秋招
堆排序是先将元素构造成一个大顶堆,然后将第一个值与第二个值互换。之后对前n-1个数重复操作。时间为o(nlog2n)
滴滴出行19年秋招,字节跳动19年秋招本科
public class LruCache<K, V> extends LinkedHashMap<K, V> {
public static final int MAX_NODE_NUM = 5;
public LruCache() {
this(MAX_NODE_NUM);
}
public LruCache(int limit) {
// 基于访问顺序
super(limit, 0.75f, true);
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > MAX_NODE_NUM;
}
}
滴滴出行19年秋招
通过递归和栈均可实现,对于栈来说,设置两个栈,一个是数字栈,一个是符号栈。数字入栈,然年符号按照优先级进行比较,如果成功则出栈对数字栈中的数字进行运算
用栈实现四则运算
网易19年秋招本科
一种是分治法,把大量的数据通过hash分片到每个文件中,分片装载内存进行判断
一种是位图法,即布隆过滤器。它不是一种精准过滤器。主要是通过一个位数组来记录每一个进入的元素的hash码(过滤器自定义hash码的个数)。当取出时,同样查看当时的位置是不是为1,如果全为1,则可能有,如果不全为1,则一定没有
阿里19年秋招
动态规划是指利用申请的空间缓存之前的结果,是一种空间换时间的算法
常见的题目有,字符串包含,爬楼梯,最小路径