【Java岗春秋招】408常见面试题

有个热爱的东西不容易

以下只针对Java岗。408即是考研常说的数据结构,计算机网络,计算机组成原理和操作系统。来源主要是牛客的Java实习面经。下面的回答直接背就可以,需要一定的计算机基础,适合春招实习的同学,但是我会在每个问题下把有助于理解的博客贴出来。如果发现有问题欢迎私聊我或留言我会在下面更新

计算机网络

模型

1. OSI七层模型

字节跳动19年秋招本科,三七互娱19年春招,小米19年秋招本科,贝壳找房19年秋招本科

七层模式分为:物理层,数据链路层,网络层(IP,ICMP),传输层(TCP,UDP),会话层,表示层,应用层( HTTP,HTTPS,FTP,POP3、SMTP )

五层模型有了解吗

三七互娱19年春招

五层模型分为:物理层,数据链路层,网络层,传输层,应用层时

网络层

2. 常见路由选择协议

百度19年秋招

IGP是在AS内部使用的协议,代表是RIP和OSPF

RIP基于UDP,按固定时间间隔和相邻路由交换当前知道的所有信息。好消息传的快,坏消息传的慢

OSPF基于IP,当链路改变的时候会使用洪泛法向所有路由器发送副本消息(与本路由器相邻所有路由器的链接状态)

EGP是AS外部使用的协议,代表是BGP。每个AS选择一个发言人,刚开始时交换相邻AS的整个路由表,但是以后只需要交换变化的路由表

计算机网络网络层

3. ping命令做了什么

猪场19年实习

经常使用ping命令来查看对方的网络情况,ping命令基于网络层的ICMP协议。ICMP是为了更有效转发IP数据包和提高成功交付的机会

TCP

4. TCP层和IP层讲一下区别

滴滴19年秋招

  • 对于TCP来说,它属于运输层,会涉及到三次握手,四次挥手,拥塞控制,流量控制这些层面上来

    TCP是面向连接的,是1对1的全双工可靠交付,socket即基于TCP

    可靠传输的原理

    可靠传输通过ARQ协议,即每发送完一个分组就停止发送,收到确认后再发送下一个 。超时之后重新发送

    TCP的流量控制和拥塞控制

    流量控制:接收方通过动态变化的rwnd数值说明可接受的字节数

    拥塞控制:采用慢开始,拥塞避免和快重传,快恢复来实现拥塞控制

  • 对于IP层来说,它属于网络层。 提供的是无连接,尽最大努力交付的数据报服务,面向连接由运输层提供

    IP地址有32位,IPv6有64位,ip报文最少20B

计算机网络传输层

5. TCP三次握手和四次挥手

字节跳动19年秋招/本科,pdd19年实习/本科,阿里19年秋招/本科,头条19年实习,小米19年秋招本科,19年bigo秋招本科,百度19年秋招

三次握手

  1. client向server发送syn,seq=x,此时client验证client发送能力正常。client置为SYN_SENT状态
  2. server收到syn,此时server验证client发送能力正常,server接收能力正常。server向client发送ack = x + 1,seq = y,此时server验证server发送能力正常。server置为SYN_RCVD状态
  3. client收到ack,此时client验证client接收能力正常,server接收发送能力正常。client向server发送ack = y + 1, seq = x + 1,server接收到后验证client接收能力正常。client置为ESTABLISHED状态

四次挥手

  1. client向server发送fin。client置为FIN_WAIT_1
  2. server向client发送ack。server置为CLOSE_WAIT,client置为FIN_WAIT_2
  3. 等server传输数据完毕后,向client发送fin。server置为LAST_ACK
  4. client向server发送ack。client置为TIME_WAIT。之后等待2MSL,client关闭。server接收到后置为CLOSED

为啥三次握手

三次握手验证了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就会一直等下去

6. 如何处理TIME_WAIT状态过多

19年bigo秋招本科,字节跳动19年秋招本科

TIME_WAIT是client向server的最后一次握手后的client状态。之所以要保证2MSL主要是因为防止自己的ack没有到达server,这样server可以在2MSL期间再次发送ack进行确认

但是TIME_WAIT在高并发短连接的状态不是太友好,在linux上可以通过SO_REUSEADDR套接字来改 变状态,即当端口忙但是出于TIME_WAIT状态时可以重用端口

7. TCP的流量控制和拥塞控制

字节跳动19年秋招,滴滴19年秋招,猪场19年实习

流量控制协议

流量控制表明接收端可以接受多少字段,然后告诉发送方发送多少字段。整体是通过滑动窗口来实现的。

解决死锁的方式是当出现rwnd=0后,通过client定时向server询问

拥塞控制算法

拥塞控制表明发送端可以发送多少字段。主要是用来防止网络链路中的动态拥塞。主要实现方式有慢开始和拥塞避免,快恢复和快重传

对于慢开始来说,TCP最多会发送1个MSS,之后每次增加不超过1个MSS,

当拥塞窗口超过阈值,采用拥塞避免算法,拥塞窗口每个RTT只增加1。当网络发生拥塞,时,阈值变为1/2,拥塞窗口重新变为1个MSS

对于快重传来说,sender要求接收方在收到一个失序的报文段后就立即发出重复确认,如果发送三次ack后,就迅速重传,而不要等到自己的计时器(ARQ协议)到期后再重新发送

执行快恢复时,阈值变为1/2,拥塞窗口=阈值

8. TCP消息可以保证传送成功的手段

阿里19年秋招,百度19年秋招,腾讯19年秋招

  • 通过ARQ协议,发送一个分组后收到ack再发送下一个。sender会自定义一个计时器,如果超时则重新发送。实际上是使用的连续ARQ协议,receiver只确认分组的最后一个报文即可
  • 首部校验和

9. 客户端和服务器最多能发送和接收多少TCP连接数

阿里19年秋招本科

按理来说TCP是属于套接字连接,所以会有端口号65535-1024个连接

但是对于linux单机来说,由于套接字是需要占用空间的,linux默认的文件描述符为1024,需要修改

10. Dos攻击中的SYN泛洪怎么解决

百度19年秋招

  1. 减少服务器的SYN_RECEIVED的时间
  2. 将重复ip加入黑名单
  3. 增加一层SYN缓存,因为当SYN_RECEIVED状态时TCB的空间较大,增加SYN缓存先设置一个虚拟TCB,它有比较小的空间,当真正建立三次握手的时候,再将其移到TCB中

UDP

11. UDP和TCP的区别

pdd19年实习,阿里19年秋招本科,19年科大讯飞本科秋招,百度19年秋招

UDP和TCP都是运输层的协议

  1. TCP提供的是面向连接的、可靠的数据流传输;UDP提供的是非面向连接的、不可靠的数据流传输
  2. TCP提供可靠的服务,通过TCP连接传送的数据,无差错、不丢失、不重复,按序到达;UDP尽最大努力交付,即不保证可靠交付
  3. TCP面向字节流;UDP面向报文
  4. TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的交互通信
  5. UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信
  6. TCP对系统资源要求较多,UDP对系统资源要求较少。TCP首部有20字节;UDP的首部只有8个字节
  7. TCP的逻辑通信信道是全双工的可靠信道;UDP的逻辑通信信道是不可靠信道。

UDP不可靠会丢包,它有什么应用

UDP常用来视频的传输,即使丢掉少量的包,也可以接收

怎么解决UDP不可靠

UDP本身的不可靠传输是不能解决的,由于UDP是在运输层,我们只能通过应用层来解决UDP的不可靠问题。重点让应用层的协议实现AQR即可,即当sender接收到receiver的ack才确定接收成功。同时需要超时重传

udp 传送的一组数据中丢了一个咋办

通过AQR的超时重传

12. TCP沾包,UDP保护消息边界和流

阿里19年秋招本科

tcp是基于流传输的,容易出现一个流中有多个包的现象,这就是沾包

udp是基于保护消息边界使得每一个消息都是独立的,出现消息报文传播

HTTP

13. Https的建立过程

字节跳动19年秋招,瓜子二手车19年秋招,淘宝20年实习,百度19年秋招

  1. client想server发送可以接受的ssl证书,server返回自己的公钥证书
  2. client在本地通过ca验证server的正确性
  3. 成功后通过公钥加密自己的密钥发送给server
  4. server使用私钥解密,之后client和server使用密钥通信

Https

为什么是安全的

小米19年秋招本科

HTTPS通过CA进行客户端公钥证书的认证,采用非对称加密来获得秘钥,对称加密传输数据。理论上不可破解

和Http的区别

HTTP是80,HTTPS是443

HTTP会比HTTPS效率更高,HTTPS加密会浪费时间并且增加了秘钥交换即网络开销

但是HTTPS更安全

14. Https可能出现不安全的地方

阿里19年秋招

可能会出现CA伪装攻击,即第三方通过ARP或者DNS欺骗获得客户流量称为客户端和服务端的中间人。在客户端看来,中间人即是服务器,此时第三方伪装服务端的CA证书来实现中间人攻击,伪装的证书要自己生成密钥,并使用该密钥进行签名,客户端访问浏览器时因为找不到证书发行者的公钥,无法验证,浏览器会有警告,此时选择不信任即可

CA中间人攻击

15. 说几个Http的header

腾讯19年秋招

request主要分为请求行*(请求方法,url,协议版本),请求头,请求体;response主要分为状态行(协议版本,状态码)*,消息报头,响应正文

常见的header有:content-typeuser-agentaccept-languageconnectioncookie

16. Http的长连接和短连接

小米19年秋招本科

Http短连接是1.0,长连接是1.1。长连接在我项目里有用,减少了每次三次握手的时间消耗,但是可能会增加不必要的连接时间s

和Http2的关系

淘宝20年实习

HTTP 性能的关键在于低延迟而不是高带宽,大多数 HTTP 连接的时间都很短,而且是突发性的,但 TCP 只在长时间连接传输大块数据时效率才最高。HTTP 2.0 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升

Http2具有一个显著的特点就是多路复用,相对于Http1来说,增加了非阻塞这一特点

17. HTTP的状态码说一说

淘宝20年实习,贝壳找房19年秋招本科

2xx:请求成功,

3xx:重定向

4xx:客户端请求错误。401:请求验证身份;403:服务器拒绝执行;404:路径请求错误,服务器没有合适资源

5xx:服务器错误。500:服务器乱码;503:服务器过载

18. get和post的区别

瓜子二手车19年秋招,淘宝19年秋招,淘宝20年实习,腾讯19年秋招

get是幂等,post是非幂等

get通过url,post通过请求体

get长度由browser限制,post的长度由服务器限制

19. 访问taobao.com会发生什么

阿里19年秋招,淘宝20年实习

  1. URL解析,对URL自动编码,然后检查长度,之后根据url查看浏览器是否缓存了该页面,如果缓存未过期,则跳8,否则则到2
  2. DNS查询,依次通过浏览器缓存,OS hosts缓存,路由器缓存,ISP缓存和根域名服务器去查询对应的ip
  3. 浏览器将请求封装为HTTP报文,在client和server建立连接之前,会进行TCP三次握手
  4. 之后将报文从外到里封装为 以太网首部+ip首部+tcp首部+http首部经过网关和路由器发送给server
  5. 对于淘宝来说,请求会先到nginx服务器上,然后nginx采用默认的轮询算法进行负载均衡,携带原来browser的ip把报文发送给tomcat
  6. tomcat接收到请求之后会解析请求行,请求体,请求头,然后Controller接收请求,交给service处理,之后在访问DB,之后返回,其中不排除redis缓存
  7. 浏览器接收response,并进行缓存和解码
  8. 浏览器渲染页面

浏览器做了什么

访问过程

操作系统

命令

20. 有用到过什么Linux命令

腾讯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!"

21. 如何排查CPU占用太满的服务

淘宝20年实习,pdd19年秋招本科

ps -aux 查看mem查用情况,同时还有pid,user

top -H 动态查看CPU占用情况

top命令

22. linux看网络状况用什么

猪场19年实习

netstat -an

看日志用什么

可以用head readme.md -n 2 头两行

tail readme.md -n 2 尾两行

cat readme.md

23. linux查看分区大小以及使用情况

百度19年秋招

df -lh 以容易阅读的单位显示出磁盘分区的使用情况

top中的主要关注信息有哪些

  1. 近段时间系统的平均负载情况
  2. 某个进程对CPU和MEM的占用情况

24. ps命令的底层实现

猪场19年实习

25. Linux根目录下的主要文件夹

滴滴19年秋招

机制

26. 进程通信方式

滴滴19年秋招

信号:进程通过软中断方式通知另一个进程

管道:进程把数据放到FIFO的管道中

共享内存:类似于Java的堆

信箱:如果信箱为空,阻塞接受者;如果信箱为满,阻塞发送者

socket,管道,信箱,共享内存

并发编程的同步和死锁

27. 进程/处理器调度方式

头条19年实习,百度19年秋招,滴滴19年秋招

  • FCFS:先来先服务,非剥夺式,有利用CPU繁忙型,不利于IO繁忙型
  • SJF:最短作业优先,非剥夺式,会出现饥饿现象
  • SRTF:最短剩余时间优先,剥夺式
  • 优先级调度,非剥夺剥夺
  • 轮转调度,剥夺式,动态时间片轮转
  • 响应比最高者优先算法,非剥夺式作业响应时间/作业处理时间
  • 多级反馈队列调度算法,剥夺式,存在饥饿问题

28. 进程,线程,协程,纤程

百度19年秋招

  • 进程是资源分配的基本单位C;

  • 线程是资源调度的基本单位Java;

  • 协程依托于线程,比线程更轻量级。OS对协程一无所知,没有CPU开销Nginx lua;

  • 协程是Linux的概念,windows的协程叫纤程

协程和线程对比,能解决什么问题

猪场19年实习

协程依托于线程,比线程更轻量级。协程的切换没有CPU开销,协程属于一种用户态线程。

协程相对于线程来说,线程的应用程序中没有设计好导致大量的锁、切换、等待,这些很多都是应用层的问题。而协程因为是非抢占式,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力

协程

协程原理

29. 分页分段段页式

蚂蚁金服

分页是针对物理实存来说,不容易产生内存碎片,但是分段是一种虚存管理,有利于编程,容易产生内存碎片

段页式管理则是通过分段方法来分配和管理虚拟存储器,通过分页来管理实存

分页分段段页式

算法

30. 生产者消费者模型

滴滴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);
        
    }
}

31. 哲学家进餐

滴滴19年秋招

  1. 至多允许四位哲学家同时去拿左边的叉子
  2. 规定奇数号哲学家先拿他左边的叉子,然后再去拿右边的叉子;偶数号哲学家先拿他右边的叉子,然后再去拿左边的叉子
  3. 仅当哲学家的左右两把叉子均可用时,才允许他拿起叉子进餐,否则一把叉子也不取

32. 理发师问题

滴滴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

33. 银行家算法以及其应用

百度19年秋招

银行家算法是避免死锁的一种重要方法。 操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配

OS常见算法

数据结构和算法

链表

34. 判断链表是否有环

滴滴出行19年秋招

快慢双指针,如果快指针追上慢指针,则有环

用一个指针怎么实现

增加一个hash表用来存放遍历过的节点

35. 如何让指针指向链表中间(LeetCode原题)

腾讯19年秋招

快慢指针,2倍速

字符串

36. 最长回文串

滴滴出行19年秋招

  • 滑动窗口 o(n^3)
  • 中心扩展 o(n^2)
  • dp
  • 马拉车

LeetCode5

树对应着stack和queue的dfs和bfs

37. 判断树状结构有没有环

滴滴出行19年秋招

可以定义一个bool类型的visit,遍历过为1,未遍历为0,

38. 只给先序和后序遍历能确定唯一的树结构吗

阿里19年秋招

树可以(中间节点的)前序,中序,后序和层次遍历

除了前序和后序遍历不能确定结构,别的遍历都能确定结构,如前序AB,后序BA

39. 哈夫曼树原理

阿里19年秋招

主要是用于哈夫曼编码。依次将最小的两个元素形成子节点,然后父节点为其和。依次形成一个树,即为哈夫曼树。然后根据他们每个元素的权重可以形成编码

40. 红黑树和B树构造

阿里19年秋招

红黑树和B树都是AVL树的变种

红黑树

  • 根节点和叶子(null)节点为黑色
  • 红节点的子节点为黑色
  • 父节点到叶子节点所有路径上的黑色节点数目相同

B树:变种b+树广泛应用于文件搜索

  • B树一个节点可以存多个键值
  • B+树一个节点存的全是key

排序

10大排序

冒泡排序,arr[i]一次和后面每个元素比较,如果大于则移到后面,时间为o(n^2),空间为o(1),稳定;

选择排序,每次遍历找到最大值或者最小值,放到前面或者后面,时间为o(n^2),空间为o(1),不稳定;优化为堆排

插入排序,从第二个元素开始,从后往前扫描,如果大于前面且小于后面则插入,时间为o(n^2),稳定;优化为希尔排序

41. 快排

七牛云19年秋招本科,阿里19年秋招

对于快排来说,先找到一个基准元素,然后将基准元素移到中间,两边使用分治

时间为o(nlog2n),空间为o(nlog2n)。

和归并相比,哪个比较好一点,稳定一点

归并排序是由内到外的逐步排序,时间为o(nlog2n),空间为o(n)。快排不够稳定,但是归并是稳定的

42. 写一下堆排

阿里19年秋招

堆排序是先将元素构造成一个大顶堆,然后将第一个值与第二个值互换。之后对前n-1个数重复操作。时间为o(nlog2n)

其他

43. 写个LRU

滴滴出行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;
    }
}

44. 四则运算

滴滴出行19年秋招

通过递归和栈均可实现,对于栈来说,设置两个栈,一个是数字栈,一个是符号栈。数字入栈,然年符号按照优先级进行比较,如果成功则出栈对数字栈中的数字进行运算

用栈实现四则运算

45. 如何在大量数据中判断一个数是否存在

网易19年秋招本科

一种是分治法,把大量的数据通过hash分片到每个文件中,分片装载内存进行判断

一种是位图法,即布隆过滤器。它不是一种精准过滤器。主要是通过一个位数组来记录每一个进入的元素的hash码(过滤器自定义hash码的个数)。当取出时,同样查看当时的位置是不是为1,如果全为1,则可能有,如果不全为1,则一定没有

46. 讲一下动态规划

阿里19年秋招

动态规划是指利用申请的空间缓存之前的结果,是一种空间换时间的算法

常见的题目有,字符串包含,爬楼梯,最小路径

你可能感兴趣的:(计算机网络,操作系统,算法和数据结构)