1.文档阅读
19 | 单服务器高性能模式:Reactor与Proactor-极客时间
高性能网络编程中的线程模型看完这篇就会了! - 知乎
网络编程中的I/O模型
网络/Network - 网络编程 - 高性能 - 单服务器高性能模式[网络模型]及性能对比 - 学习/实践
操作系统/OS - I/O - 学习/实践_穿素白衫的少年的博客-CSDN博客
网路/Network - 网络编程 - 为什么网络 I/O 会被阻塞?_穿素白衫的少年的博客-CSDN博客
2.整理输出 开始之前,先看下,服务端处理网络请求/响应的简化流程图 应该记住,并且能画出来 2.1 前言 I/O 模型的基本认识 介绍操作系统的 I/O 模型之前,先了解一下几个概念: 2.2 同步/异步
Synchronous(同步)
各方都实时(或者尽可能实时)地收取(而且必要的话也处理或者回复)信息的即时沟通方式,即为同步。
电话即为一个日常的例子:人们都倾向于在使用电话时即时地作出回应。
许多程序指令也是实时的:例如当输入一个算式时,除非编程人员有意为止,否则环境都会立即将结果反馈回来。
Asynchronous(异步)
异步指两个或两个以上的对象或事件,不同时存在或发生(或多个相关事物的发生无需等待其前一事物的完成)。在计算机技术中,"异步"一词被用于两大语境。「这才是今天最解惑的地方」
网络与通信
异步通信是一种在双方或多方之间交换消息的方式。其中每个参与方,各自在他们方便或可操作的情况下接收并处理消息,而不是在收到消息后立即进行处理「针对服务端,异步处理」。另外,消息的发送无需等待确认信息「针对客户端的,异步请求」,前提是如果出现问题,接收方将请求更正或以其他方式处理该情况「这是考虑到异常处理」。
对人类来说,电子邮件就是一种异步通信方式;
发送者发送了一封邮件,接着接收者会在方便时读取和回复该邮件,而不是马上这样做。
双方可以继续随时发送和接收信息,而无需双方安排何时进行操作。
在软件进行异步通信时,一个程序可能会向另一软件(如服务器)请求信息,并在等待回复的同时继续执行其他操作。
例如,AJAX(Asynchronous JavaScript and XML) 编程技术(现在通常简写为"Ajax",不过现在的应用不常用 XML,而是用JSON)就是这样一种机制,它通过 HTTP 从服务器请求较少的数据,当结果可被返回时才返回结果,而不是立即返回。
软件设计
异步软件设计,通过构建代码扩展了异步的概念,按照这种设计编写的代码使得程序,能够要求一个任务与先前的一个(或多个)任务一起执行,而无需为了等待它们完成而停止执行。
当后来的任务完成时,程序将使用约定好的机制通知先前的任务,以便让它知道任务已经完成,以及如果有结果存在的话,这个结果是可用的。
还有许多用来实现异步软件的编程技术。查看文章Asynchronous JavaScript来了解它们吧。
同步处理与异步处理 「是针对服务端/被调用方 而言的」
1)同步处理,是指被调用方得到最终结果之后才返回给调用方;
2)异步处理,是指被调用方先返回应答,然后再计算调用结果,计算完最终结果后再通知并返回给调用方。「想到微信支付流程,就是异步通知的方式,跟这里似乎是契合的。」
Note JavaScript - 多线程/单线程, 同步/异步,阻塞/非阻塞, 回调函数 -- 其中有详细说到同步/异步,以及延伸
同步/异步任务「软件设计,包含客户端和服务端,所有的程序,不过应该结合上下文,区分确认指的是哪个」
同步/异步请求「网络与通信,针对客户端,如,浏览器 / JS」
同步/异步处理「网络与通信,针对服务端,如,Web Server / NodeJS」
同步/异步通信 = 同步/异步请求「客户端」 + 同步/异步处理「服务端」
不过有时候异步通信,通常可能认为是 异步请求,而不管是否异步处理。
其实严格起来,应该是,只有同步请求 + 同步处理,才是真正的同步,其他请求都是异步通信「也就是只要两端中有一端是异步操作,就是异步通信,同时也说明,同步和异步并没有优劣之分,都有各自适合的应用场景」
题外话:其实这世上很多的事情,都是双向选择的。
2.3 阻塞/非阻塞 「阻塞/非阻塞和其延伸」类比「同步/异步和其的延伸」
阻塞调用 与 非阻塞调用
1)阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回;
2)非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
两者的最大区别在于被调用方在收到请求到返回结果之前的这段时间内,调用方是否一直在等待。
阻塞是指调用方一直在等待而且别的事情什么都不做;非阻塞是指调用方先去忙别的事情。
2.4 阻塞、非阻塞和同步、异步的区别
阻塞、非阻塞和同步、异步其实针对的对象是不一样的:
1)阻塞、非阻塞的讨论对象是调用者;
2)同步、异步的讨论对象是被调用者。
recvfrom 函数:
recvfrom 函数(经 Socket 接收数据),这里把它视为系统调用。
一个输入操作通常包括两个不同的阶段:
1)等待数据准备好;// 数据最先到网卡[缓存区],然后从网卡复制到内存缓存区 [内存-->内存]
2)从内核向进程复制数据。// 将数据从核心缓存区复制到用户进程缓存区 [内存-->内存]
对于一个套接字/Socket上的输入操作:
第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。
第二步就是把数据从内核缓冲区复制到应用进程缓冲区。
实际应用程序在系统调用完成上面的 2 步操作时,调用方式的阻塞、非阻塞,操作系统在处理应用程序请求时,处理方式的同步、异步处理的不同,可以分为 5 种 I/O 模型(下面的章节将逐个展开介绍)。
阻塞式 I/O 模型(blocking I/O)、
非阻塞式 I/O 模型(non-blocking I/O)、
I/O 复用模型(I/O multiplexing)、
信号驱动式 I/O 模型(signal-driven I/O)、
异步 I/O 模型(即AIO,全称asynchronous I/O)
网络编程中的I/O模型
2.5 网友评论收集 看到下面网友的评论,思考之后,意识到大家的认知都很混乱。甚至“老师”都没讲明白 「网上也没有权威的文档去统一,当没有统一的概念时,那就按照自己的理解来,并不断完善,但同时不要太在意概念了,理解本质,并使用才是最重要的」 ------------------------------------------------------------------------------ start Note: 这里只是做参考,因为这里只是他们的看法,通常不是很准确。 林: IO操作分两个阶段 1、等待数据准备好(读到内核缓存) 2、将数据从内核读到用户空间(进程空间) 一般来说1花费的时间远远大于2。 1上阻塞, 2上也阻塞: 同步阻塞IO 1上非阻塞, 2阻塞: 同步非阻塞IO,这讲说的Reactor就是这种模型 1上非阻塞, 2上非阻塞: 异步非阻塞IO,这讲说的Proactor模型就是这种模型 慕士塔格: 意思就是内核空间,我们用阻塞,非阻塞描述;用户空间我们用同步,非同步描述? 狮锅艺 > 慕士塔格:我的理解是这样的:同步/异步关注的是消息通信机制,也就是当前进程调用返回后有没有拿到结果。阻塞/非阻塞关注的是程序在等待调用结果时的状态,也就是说当前线程/进程发起调用后是否要拿到结果才返回。 林: Reactor与Proactor能不能这样打个比方: 1、假如我们去饭店点餐,饭店人很多,如果我们付了钱后站在收银台等着饭端上来我们才离开,这就成了同步阻塞了。 2、如果我们付了钱后给你一个号就可以离开,饭好了老板会叫号,你过来取。这就是Reactor模型。 3、如果我们付了钱后给我一个号就可以坐到坐位上该干啥干啥,饭好了老板会把饭端上来送给你。这就是Proactor模型了。
作者回复: 太形象了👍👍👍
------------------------------------------------------------------------------ end 后续补充 ... |