新年快乐,更新Spring源码-第三章

This commit is contained in:
youthlql
2022-01-01 00:04:04 +08:00
parent f62da3a4ab
commit 96af08a273
3 changed files with 1547 additions and 7 deletions

View File

@@ -136,7 +136,7 @@
## 源码【12.21更新】 ## 源码【01.01更新】
@@ -144,7 +144,7 @@
[02.第2章-后置工厂处理器和Bean生命周期](docs/spring-sourcecode-v1/02.第2章-后置工厂处理器和Bean生命周期.md) [02.第2章-后置工厂处理器和Bean生命周期](docs/spring-sourcecode-v1/02.第2章-后置工厂处理器和Bean生命周期.md)
[03.第3章-后置处理器和Bean生命周期](docs/spring-sourcecode-v1/03.第3章-后置处理器和Bean生命周期.md)
# Netty # Netty

View File

@@ -9,7 +9,7 @@ categories:
- 操作系统 - 操作系统
keywords: 操作系统IO零拷贝 keywords: 操作系统IO零拷贝
description: 基本面试会问到的IO进行了详解同时本篇文章也对面试以及平时工作中会看到的零拷贝进行了充分的解析。万字长文系列读到就是赚到。 description: 基本面试会问到的IO进行了详解同时本篇文章也对面试以及平时工作中会看到的零拷贝进行了充分的解析。万字长文系列读到就是赚到。
cover: 'https://unpkg.zhimg.com/youthlql@1.0.0/os/os_logo.jpg' cover: 'https://unpkg.zhimg.com/youthlql@1.0.9/os/os_logo.jpg'
abbrlink: e959db2e abbrlink: e959db2e
date: 2021-04-08 15:21:58 date: 2021-04-08 15:21:58
--- ---
@@ -47,7 +47,7 @@ date: 2021-04-08 15:21:58
3. 而在用户进程这边,整 个进程会被阻塞。当**内核**一直等到数据准备好了,它就会将数据从**内核**中拷贝到用户内存,然后**内核**返回果,用户进程才解除 block的状态重新运行起来。 3. 而在用户进程这边,整 个进程会被阻塞。当**内核**一直等到数据准备好了,它就会将数据从**内核**中拷贝到用户内存,然后**内核**返回果,用户进程才解除 block的状态重新运行起来。
4. **所以blocking IO的特点就是在IO执行的两个阶段都被block了。** 4. **所以blocking IO的特点就是在IO执行的两个阶段都被block了。**
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/summary/0003.png"> <img src="https://unpkg.zhimg.com/youthlql@1.0.8/computer_network/summary/0003.png">
@@ -58,7 +58,7 @@ date: 2021-04-08 15:21:58
3. 虽然用户线程每次发起IO请求后可以立即返回但是为了等到数据仍需要不断地轮询、重复请求消耗了大量的CPU的资源。一般很少直接使用这种模型而是在其他IO模型中使用非阻塞IO这一特性。 3. 虽然用户线程每次发起IO请求后可以立即返回但是为了等到数据仍需要不断地轮询、重复请求消耗了大量的CPU的资源。一般很少直接使用这种模型而是在其他IO模型中使用非阻塞IO这一特性。
4. **所以,用户进程第一个阶段不是阻塞的,需要不断的主动询问内核数据好了没有;第二个阶段依然总是阻塞的。** 4. **所以,用户进程第一个阶段不是阻塞的,需要不断的主动询问内核数据好了没有;第二个阶段依然总是阻塞的。**
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/summary/0004.png"> <img src="https://unpkg.zhimg.com/youthlql@1.0.8/computer_network/summary/0004.png">
@@ -76,7 +76,7 @@ date: 2021-04-08 15:21:58
2. 它的基本原理就是select /epoll这个函数会不断的轮询所负责的所有socket当某个socket有数据到达了就通知用户进程正式发起read请求。 2. 它的基本原理就是select /epoll这个函数会不断的轮询所负责的所有socket当某个socket有数据到达了就通知用户进程正式发起read请求。
3. 从流程上来看使用select函数进行IO请求和同步阻塞模型没有太大的区别甚至还多了添加监视socket以及调用select函数的额外操作效率更差。但是使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket然后不断地调用select读取被激活的socket(也就是数据准备好了的socket)即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中必须通过多线程的方式才能达到这个目的。 3. 从流程上来看使用select函数进行IO请求和同步阻塞模型没有太大的区别甚至还多了添加监视socket以及调用select函数的额外操作效率更差。但是使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket然后不断地调用select读取被激活的socket(也就是数据准备好了的socket)即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中必须通过多线程的方式才能达到这个目的。
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/summary/0005.png"> <img src="https://unpkg.zhimg.com/youthlql@1.0.8/computer_network/summary/0005.png">
**select函数** **select函数**
@@ -106,7 +106,7 @@ date: 2021-04-08 15:21:58
3. 而另一方面,从**内核**的角度,当它受到一个异步读之后,首先它会立刻返回,所以不会对用户进程产生任何阻塞。然后,内核会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都 完成之后,**内核**会给用户进程发送一个信号告诉它read操作完成了用户线程直接使用即可。 在这整个过程中,进程完全没有被阻塞。 3. 而另一方面,从**内核**的角度,当它受到一个异步读之后,首先它会立刻返回,所以不会对用户进程产生任何阻塞。然后,内核会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都 完成之后,**内核**会给用户进程发送一个信号告诉它read操作完成了用户线程直接使用即可。 在这整个过程中,进程完全没有被阻塞。
4. 异步IO模型使用了Proactor设计模式实现了这一机制。**(具体怎么搞得,看上面的文章链接)** 4. 异步IO模型使用了Proactor设计模式实现了这一机制。**(具体怎么搞得,看上面的文章链接)**
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/computer_network/summary/0007.png"> <img src="https://unpkg.zhimg.com/youthlql@1.0.8/computer_network/summary/0007.png">

File diff suppressed because it is too large Load Diff