纠错与更改所有文章的图床

This commit is contained in:
Dragon
2021-03-22 20:01:15 +08:00
parent cdb811a48a
commit bf0d1bcccd
27 changed files with 767 additions and 642 deletions

View File

@@ -1,3 +1,17 @@
---
title: 计算机网络-总结篇
tags:
- 计算机网络
- 面试
categories:
- 计算机网络
keywords: 计算机网络,计网,面试
description: 计算机网络-总结篇,可以用来期末复习,校招面试等。
cover: 'https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/logo.jpg'
abbrlink: 3905e6f8
date: 2020-04-16 17:21:58
---
# 备注
@@ -177,7 +191,7 @@ https://www.cnblogs.com/felixzh/p/10345929.html
## 区别+应用场景
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/computer_network/summary/0001.png" width=90%>
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/summary/0001.png" width=90%>
**总结:**
@@ -292,7 +306,7 @@ TCP通过三次握手建立可靠连接
在采用快恢复算法时慢开始算法只是在TCP连接建立时和网络出现超时时才使用。
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/computer_network/summary/0002.png" width=80%>
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/summary/0002.png" width=80%>
@@ -819,7 +833,7 @@ proactor: 这有十个字节数据,收好了跟我说一声。
当用户进程进行recvfrom这个系统调用内核就开始了IO的第一个阶段等待数据准备。对于network io来说很多时候数据在一开始还没有到达比如还没有收到一个完整的UDP包这个时候**内核**就要等待足够的数据到来。而在用户进程这边,整 个进程会被阻塞。当**内核**一直等到数据准备好了,它就会将数据从**内核**中拷贝到用户内存,然后**内核**返回果,用户进程才解除 block的状态重新运行起来。**所以blocking IO的特点就是在IO执行的两个阶段都被block了。**
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/computer_network/summary/0003.png" width=80%>
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/summary/0003.png" width=80%>
<img src="http://images.cnitblog.com/blog/405877/201411/142330286789443.png" width=70%>
@@ -830,7 +844,7 @@ proactor: 这有十个字节数据,收好了跟我说一声。
3. 虽然用户线程每次发起IO请求后可以立即返回但是为了等到数据仍需要不断地轮询、重复请求消耗了大量的CPU的资源。一般很少直接使用这种模型而是在其他IO模型中使用非阻塞IO这一特性。
4. **所以,用户进程第一个阶段不是阻塞的,需要不断的主动询问内核数据好了没有;第二个阶段依然总是阻塞的。**
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/computer_network/summary/0004.png" width=80%>
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/summary/0004.png" width=80%>
<img src="http://images.cnitblog.com/blog/405877/201411/142332004602984.png" width=70%>
@@ -842,7 +856,7 @@ proactor: 这有十个字节数据,收好了跟我说一声。
2. 它的基本原理就是select /epoll这个函数会不断的轮询所负责的所有socket当某个socket有数据到达了就通知用户进程正式发起read请求。
3. 从流程上来看使用select函数进行IO请求和同步阻塞模型没有太大的区别甚至还多了添加监视socket以及调用select函数的额外操作效率更差。但是使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket然后不断地调用select读取被激活的socket(也就是数据准备好了的socket)即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中必须通过多线程的方式才能达到这个目的。
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/computer_network/summary/0005.png" width=80%>
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/summary/0005.png" width=80%>
@@ -868,7 +882,7 @@ proactor: 这有十个字节数据,收好了跟我说一声。
2. 这个一般用于UDP中对TCP套接口几乎是没用的原因是该信号产生得过于频繁并且该信号的出现并没有告诉我们发生了什么事情
3. 信号驱动IO放佛很像异步IO它的第一阶段不是阻塞的。但是很遗憾它的数据拷贝阶段(第二阶段),任然是阻塞的。
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/computer_network/summary/0006.png" width=80%>
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/summary/0006.png" width=80%>
@@ -879,7 +893,7 @@ proactor: 这有十个字节数据,收好了跟我说一声。
3. 而另一方面,从**内核**的角度,当它受到一个异步读之后,首先它会立刻返回,所以不会对用户进程产生任何阻塞。然后,内核会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都 完成之后,**内核**会给用户进程发送一个信号告诉它read操作完成了用户线程直接使用即可。 在这整个过程中,进程完全没有被阻塞。
4. 异步IO模型使用了Proactor设计模式实现了这一机制。**(具体怎么搞得,看上面的文章链接)**
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/computer_network/summary/0007.png" width=80%>
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/summary/0007.png" width=80%>