欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!
在我后台回复 「资料」 可领取
编程高频电子书
!
在我后台回复「面试」可领取硬核面试笔记
!文章导读地址:点击查看文章导读!
感谢你的关注!
美团优选后端一面:网络 & 操作系统
TCP 报文的组成?有哪些标志位?
TCP 报文主要由头部和数据组成,头部放一些标志字段,其中比较重要的就是橙色部分的 标志位 ,总共有 6 位,代表不同的功能吗,TCP 报文的组成如下:
橙色部分的 6 个标志位功能如下:
1、UGR: 紧急指针标志,用于传输紧急数据
2、ACK : 确认序号标志,用于确认收到数据
3、PSH: 提示接收方在接收到数据以后,应尽快的将这个报文交付到应用程序,而不是在缓冲区缓冲
4、RST : 用于重置错误的连接
5、SYN : 建立连接时使用
6、FIN : 用于释放连接
其中 seq 和 ack 功能如下:
seq :发送数据的第一个字节的序号,比如当前报文段的 seq 为 100,当前报文段有 100 个字节,那么下一个报文段的 seq 就是 200
ack :期待下一个收到的字节序号,比如收到了 seq 为 100 的 TCP 报文,该报文有 100 个字节,那么应该回复的 ack 就是 200
HTTP 和 HTTPS 的区别?
HTTP 是明文传输的,因此存在安全风险,而 HTTPS 则是在 HTTP 的基础上添加了 SSL/TLS 协议,来保证通信的安全的
那么双方如果需要建立 HTTP 通信的话,只需要通过 TCP 三次握手即可
但是若果需要建立 HTTPS 通信的话,除了 TCP 三次握手建立 TCP 连接,还需要进行 SSL/TLS 握手,之后双方才可以加密进行通信
扩展:HTTPS 通信流程
HTTPS 的通信流程为:
- 客户端向服务器请求获取 公钥
- 双方协商产生 对称密钥
- 双方采用 对称密钥 进行加密通信
前两个步骤是建立 SSL/TLS 的过程,HTTPS 是基于 SSL 或 TLS 进行加密的,不过 SSL 已经退出历史舞台了,现在说的 HTTPS 其实就是 HTTP+TLS
那么 TLS 握手的过程总共包含了 4 次通信 ,在 4 次通信之后,TLS 协议也就建立成功了,可以进行 HTTPS 通信了,4 次通信如下:
- 第一次通信 ClientHello:客户端向服务端发送加密请求,主要是协商 TLS 版本、随机数(生成后续的对称密钥)
- 第二次通信 ServerHello:服务端向客户端回复,主要协商 TLS 版本、随机数(生成后续的对称密钥)、数字证书(包含公钥)
- 第三次通信 客户端回应:取出数字证书的公钥,将用于通信的 对称密钥 通过公钥加密发送给服务端
- 第四次通信 服务端最后回应:使用自己本地的密钥进行解密,得到用于通信的 对称密钥
之后双方就可以使用这个 对称密钥 进行加密通信了
说一说操作系统中的死锁,如何避免死锁呢?具体使用什么样的算法?
死锁需要 同时满足 四个条件才会发生:
1、互斥 :资源是互斥的,也就是一个资源只能被一个进程持有
2、持有并等待 :一个进程至少占有一个资源,并且正在等待获取额外的资源
3、不可剥夺 :进程持有的资源不可以被其他进程抢占
4、循环等待 :每个进程持有下一个进程所需要的至少一个资源
避免死锁的话,可以通过破坏四个条件中的一个或几个来避免死锁,对于 互斥 来说,一般无法避免,因为有些资源互斥的特性我们无法改变
避免死锁常用的方法是:资源分配图 和 银行家算法
- 资源分配图 是标识进程与资源之间分配状态的有向图,节点分为 进程节点(P) 和 资源节点(R)
通过检查资源分配图中是否存在环,可以检测系统是否处于死锁状态。如果图中存在环,则系统处于死锁状态。
- 银行家算法 是一种避免死锁的预分配策略,预分配流程如下:
1、当进程请求资源时,系统尝试分配,分配后判断系统是否处于安全状态
2、如果分配后系统处于安全状态,则允许分配,否则拒绝请求
什么是虚拟内存?为什么需要?优缺点
虚拟内存是现代系统提供的对主存储器的抽象,是用于内存管理的一种技术
虚拟内存的作用就是为每个进程提供了一个大的、统一的、私有的地址空间,让每个进程认为自己在独享内存
虚拟内存的意义是定义了一块连续的虚拟地址空间,并且将内存空间扩展到了磁盘空间,也就是说一块连续的虚拟内存在进程看来是连续的,但是其实是多个物理内存碎片,并且还有一部分暂存在磁盘上,如果需要用到磁盘上的数据的话,需要进行数据交换
为什么需要虚拟内存?
通过虚拟内存,程序可以拥有超过物理内存大小的可用内存空间,并且为每个进程提供了一个连续、独享的内存空间,一个进程的错误不会影响到其他进程,提升系统稳定性
并且操作系统可以更加灵活的管理内存资源,如按需加载页面、提供高效的缓存机制
虚拟内存的优点
使用虚拟内存优点如下:
1、程序可以不受物理内存大小的限制
2、不同进程之间的内存空间相互隔离,减少进程之间干扰和内存冲突
3、操作系统可以更灵活的管理内存资源
虚拟内存的缺点
使用虚拟内存缺点如下:
1、需要将虚拟地址转换到物理地址,增加额外的性能开销
2、管理虚拟内存增加了操作系统的复杂性
3、当内存和磁盘中需要数据交换时,速度是比较慢的
扩展:操作系统如何管理虚拟地址与物理地址之间的映射关系呢?
有 内存分段 和 内存分页 两种方式
内存分段
内存分段 会根据进程实际需要使用内存大小进行分配,需要多少内存就分配多大内存的段,但是由于每个段的长度不固定,因此会在物理内存上出现内存碎片的问题,也称为 外部内存碎片 问题
举个例子:有 100MB 物理内存,程序 A 使用了 30MB,占据了 0-30MB 的区域,程序 B 使用了 40MB,占据了 30-70MB 的区域
此时程序 A 卸载了,于是腾出了 0-30MB 的内存区域,又进来一个程序 C 占用 35MB,但是此时只有 0-30MB 和 70-100MB 的物理内存区域是空闲的,并没有 35MB 的连续空间供程序 C 使用,这就是外部内存碎片问题
解决外部内存碎片问题的方法就是 内存交换 :也就是将程序 B 先写到磁盘,再读回内存,此时将程序 B 放在内存 0-30MB 的区域,那么就留出来了 70MB 的连续空闲内存可以供程序 C 使用
内存分段的缺点: 存在外部内存碎片问题,需要内存交换来解决,效率比较低,因此为了解决该问题,引入了 内存分页
内存分页
内存分页 会将虚拟和物理内存空间切分为一页一页的固定大小,这样就 不会存在内存碎片的问题了 ,通过 页表 来记录虚拟地址和物理地址之间的映射关系,如果物理内存不够的话,操作系统会根据置换策略,将一些页面给写入到磁盘上,释放这些页面占用的内存空间,当需要使用这些页面时,再去磁盘中加载对应页到内存中