操作系统与计算机网络 面试知识点

操作系统与计算机网络


面试中经常考查的计算机基础知识以及Java语言特性。计算机的基础知识是工程师基本能力的体现,也是面试前必须要牢牢掌握的部分。

操作系统

第一个,我们来看看操作系统相关知识的汇总。操作系统知识对于服务问题的排查定位十分重要,在面试时一般以了解和应用考察为主,面试题目占的比重一般不会太高。

进程与线程

进程与线程是一个非常重要的考察点,首先需要掌握它们的区别和联系。

  • 进程是系统资源分配的最小单位,线程是程序执行的最小单位,
  • 进程使用独立的数据空间,而线程共享进程的数据空间。

进程调度,简单了解进程的几种调度算法就可以了。

  • 时间片轮转调度
  • 先来先服务调度优先级调度
  • 多级反馈队列调度
  • 高响应比优先调度

进程间通信(ipc)

六种进程通讯方式的原理和适用场景。

  • Pipe
  • MessageQueue(进程间数据交换的场景)
  • 共享内存(进程间数据共享的场景)
  • UnixSocket(进程间数据交换的场景)
  • Signal
  • Semaphore

协程

协程,更轻量化,是在用户态进行调度,切换的代价比线程上下文切换要低很多了。

Linux命令

  • awk
  • top
  • netstat
  • grep
  • less
  • tail

扩展知识点

  • 内存分页管理与Swap机制
  • 任务队列与CPU load。
  • 内存屏障
  • 指令乱序
  • 分支预测
  • CPU亲和性等。

计算机网络

计算机网络也是非常重要的基础知识,服务之间通过不同的网络协议进行交互,例如http协议,rpc协议等。网络的四七层模型,这是网络知识的基础。

另外两个非常重要的网络协议就是http和TCP了。这两个协议也是服务交互中使用最多的协议。

TCP协议

知识点

  • TCP协议中的三次握手建连,四次挥手断连。
  • TCP的报文状态标志与连接状态,在排查网络问题时非常重要,必须要明白协议状态,方便抓包分析。
  • Nagel算法和ACK延迟,需要了解产生的背景是要解决小包问题,提高数据载荷比。知道对于延迟比较敏感,且发送数据频率较低的场景,可以关闭Nagel算法。
  • 关于TCP的keepalive是一种长时间没有数据发送的场景下,TCP保持连接可用的机制,需要知道keepalive的开启和设置方式。
  • 通过滑动窗口机制来实现流量控制。

特性

  • TCP是传输层协议,对应OSI网络模型的第四层传输层。
  • TCP协议的特点是基于连接,也就是传输数据前需要先建立好连接,然后再进行传输。
  • TCP连接一旦建立,就可以在连接上进行双向的通信。
  • TCP的传输是基于字节流,而不是报文。将数据按自己大小进行编号,接收端通过ACK来确认收到的数据编号。通过这种机制TCP协议能够保证接收数据的有序性和完整性。因此TCP能够提供可靠性传输
  • TCP还能提供流量控制能力,通过滑动窗口来控制数据的发送速率。滑动窗口的本质是动态缓冲区,接收端根据自己的处理能力,在TCP的Header中动态调整窗口大小,通过ACK应答包通知给发送端,发送端根据窗口的大小调整发送的速度,仅仅有了流量控制能力还不够。
  • TCP协议还考虑到了网络问题可能会导致大量重传,进而导致网络情况进一步恶化。因此TCP协议还提供了拥塞控制。TCP处理拥塞控制主要是用到了慢启动,拥塞避免、拥塞发生快速恢复是个算法
  • TCP协议的报文状态,滑动窗口的工作流程,keepalive的参数设置和Neagel算法的规则等一些细节。
  • 有典型的TCP协议问题,例如特定场景下和Nagel和Ack延迟机制配合使用,可能会出现延迟40毫秒超时后才能回复ACK包的问题。

三次握手

TCP建连的三次握手。TCP是基于连接的,所以在传输数据前需要先建立连接。TCP在传输上是双工传输,不区分Client端与Server端。为了便于理解,我们把主动发起建连请求的一端称作Client端,把被动建立连接的一端称作Server端。

  • 首先建立连接前需要Server端先监听端口,因此Server端建立连接前的初始状态就是LISTEN状态。
  • 这时Client端,准备建立连接,先发送一个SYN同步包,发送完同步包后,Client端的连接状态就变成了SYN_SEND的状态。
  • Server端收到SYN后同意建立连接,会向Client端回复一个ACK。由于TCP是双工传输,Server端也会同时向Client端发送一个同步请求SYN申请。Server向Client的方向建立连接,
  • 发送完ACK和SYN后,Server端的连接状态就变成了SYN_RCVD。
  • Client收到Server的ACK后,Client端的连接状态就变成了ESTABLISHED的状态。
  • 同时Client端向Server端发送ACK响应,回复Server端的SYN请求,Server端收到Server端的ACK后Server的连接状态,也就变成了ESTABLISHED的状态。此时建连完成,双方随时可以进行数据传输。

SYN洪水攻击发生的原因,就是Server端收到Client端的SYN请求后发送了ACK和SYN但是Client端不进行回复,导致Server端大量的连接处在SYN_RCVD状态,进而影响其他正常请求的建连。

可以通过设置Linux的TCP参数tcp_synack_retries 等于0来加快半连接的回收速度,或者调大tcp_max_syn_backlog来应对少量的SYN洪水攻击。

四次挥手

再来看看TCP的断连,TCP连接的关闭,通讯双方都可以先发起。我们暂且把先发起的一方看作Client

  • 通信中的Client和Server两端的连接状态都是ESTABLISHED的状态。
  • 然后Client端先发起了关闭连接请求。Client向Server发送了一个FIN包,表示Client端已经没有数据要发送了,然后Client端就进入了FIN_WAIT_1状态。
  • Server端收到FIN后返回ACK然后进入CLOSE_WAIT的状态。此时Server属于半关闭状态,因为此时Client向Server方向已经不会再发送数据了,可是Server向Client可能还有数据要发送。
  • 当Server端数据发送完毕后,Server端会向Client端发送FIN表示Server端也没有数据要发送。这时Server进入LAST_ACK状态,就等待Client端的应答,就可以关闭连接了。
  • Client端收到Server端的FIN后回复ACK然后进入TIME_WAIT为的状态,TIME_WAIT的状态下需要等待2MSL就是最大报文段生存时间,来保证连接的可靠关闭,之后才会进入CLOSED状态。
  • 而Server端收到ACK后,直接就可以进入CLOSED状态。

为什么需要等待2MSL之后才能关闭连接?
原因有两个:

  • 要保证TCP协议的全双工连接能够可靠关闭。
  • 要保证这次连接中重复的数据段能够从网络中消失,防止端口被重用的时候可能会产生数据混淆。

从交互流程上可以看出,无论是建连还是断连,都是需要在两个方向上进行,只不过见建连SYN和ACK两个包合并为一次发送,而断开连接时两个方向的数据发送的时间可能是不同的,所以无法合并FIN和ACK发送,这就是建连的时候必须要三次握手,而断连的时候必须要四次的原因。

实际应用中有可能会遇到大量Socket处在TIME_WAIT或者CLOSED_WAIT的状态的问题。一般开启Linux的tcp_tw_reuse、tcp_tw_recycle能够加快TIME_WAIT的状态的回收,而出现大量的CLOSED_WAIT的状态,一般是被动关闭的一方可能存在代码的bug,没有正确关闭连接导致的。

http协议

  • http协议的规范,
  • 协议中的Method、Header、Cookies,
  • 需要了解常见的状态码含义,例如404、503、302等。
  • https的交互流程。

http2

  • 多路复用
  • Stream流式交互
  • 流量控制
  • 服务端推送
  • 头部压缩

UDP

UDP也是一个比较常见的传输层协议。UDP的特点是非连接非可靠传输,但是效率非常高。
QUIC协议已经被标准化为http3协议,

QUIC

QUIC是基于UDP协议的,但QUIC提供了类似TCP的可靠性保障和流量控制。QUIC可以有效避免http2协议的前续包阻塞问题,能实现零RTT建连、提供FEC前向纠错能力。

设计模式

前面说了操作系统和网络知识。第三个是设计模式的考察点,一般有两个,一个是常用设计模式的实现,另外一个是设计模式的使用场景,也就是每个设计模式用来解决什么样的问题,在什么场景下该使用什么样的设计模式?

最常见的设计模式有:

  • 单例模式
  • 工厂模式
  • 代理模式
  • 构造者模式、
  • 责任链模式,
  • 适配器模式
  • 观察者模式等

设计模式,共23种,其中

创建型的有五种:

  • 工厂方法模式
  • 抽象工厂模式
  • 单例模式
  • 建造者模式
  • 原型模式

结构型的有七种:

  • 适配器模式
  • 装饰器模式
  • 代理模式
  • 外观模式
  • 桥接模式
  • 组合模式
  • 享元模式

行为型的有11种、

  • 策略模式
  • 模板方法模式
  • 观察者模式
  • 迭代子模式
  • 责任链模式
  • 命令模式
  • 备忘录模式
  • 状态模式
  • 访问者模式
  • 终结者模式
  • 解释器模式

你可能感兴趣的:(面试,Java)