多路复用

Netty-6、Netty 线程模型

不羁的心 提交于 2019-12-09 11:03:05
1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发、高吞吐量的环境中进行I/O处理。 I/O多路复用机制都依赖于一个事件分发器,事件分离器把接收到的客户事件分发到不同的事件处理器中,如下图: 1.1 select,poll,epoll 在操作系统级别select,poll,epoll是3个常用的I/O多路复用机制,简单了解一下将有助于我们理解Proactor和Reactor。 1.1.1 select select的原理如下: 用户程序发起读操作后,将阻塞查询读数据是否可用,直到内核准备好数据后,用户程序才会真正的读取数据。 poll与select的原理相似,用户程序都要阻塞查询事件是否就绪,但poll没有最大文件描述符的限制。 1.1.2 epoll epoll是select和poll的改进,原理图如下: epoll使用“事件”的方式通知用户程序数据就绪,并且使用内存拷贝的方式使用户程序直接读取内核准备好的数据,不用再读取数据 1.2 Proactor Proactor是一个异步I/O的多路复用模型,原理图如下: 用户发起IO操作到事件分离器 事件分离器通知操作系统进行IO操作 操作系统将数据存放到数据缓存区 操作系统通知分发器IO完成 分离器将事件分发至相应的事件处理器

Netty学习三:线程模型

本秂侑毒 提交于 2019-12-09 11:02:45
1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发、高吞吐量的环境中进行I/O处理。 I/O多路复用机制都依赖于一个事件分发器,事件分离器把接收到的客户事件分发到不同的事件处理器中,如下图: 1.1 select,poll,epoll 在操作系统级别select,poll,epoll是3个常用的I/O多路复用机制,简单了解一下将有助于我们理解Proactor和Reactor。 1.1.1 select select的原理如下: 用户程序发起读操作后,将阻塞查询读数据是否可用,直到内核准备好数据后,用户程序才会真正的读取数据。 poll与select的原理相似,用户程序都要阻塞查询事件是否就绪,但poll没有最大文件描述符的限制。 1.1.2 epoll epoll是select和poll的改进,原理图如下: epoll使用“事件”的方式通知用户程序数据就绪,并且使用内存拷贝的方式使用户程序直接读取内核准备好的数据,不用再读取数据 1.2 Proactor Proactor是一个异步I/O的多路复用模型,原理图如下: 用户发起IO操作到事件分离器 事件分离器通知操作系统进行IO操作 操作系统将数据存放到数据缓存区 操作系统通知分发器IO完成 分离器将事件分发至相应的事件处理器

04 电路交换.md - Typora

非 Y 不嫁゛ 提交于 2019-12-06 21:13:26
04 电路交换 如何实现数据从源主机通过网络核心送达目的主机? 数据交换 为什么需要数据交换? 若不采用数据交换,字节采用直通式的传输, 那么每两条主机就需要一个传输路径, 那么随着网络规模的增加, 所需链路呈现n^2增长。 数据交换的类型 电路交换 报文交换 分组交换 电路交换 电路交换的三个阶段:建立连接 通信 释放连接 建立连接即找一条连接专线, 通信即找到专线后用此传输数据, 传输完数据后需要释放链接 传统打电话采用的就是电路交换. 可以看到, 长距离电路交换需要经过多个交换机, 占线较多, 所以长途电话很贵. 电路交换网络如何共享中继线? 多路复用(Multiplexing) 电路交换适合数据量大的实时交换, 如语音,视频 核心路由器之间可以使用电路交换 不灵活, 电路交换存在占线的情况 注意: 电路交换的中继站是可以供多个用户同时使用的, 电路交换中的独占连接并不是独占链路, 一条链路上可以同时有多个连接. 多路复用 典型多路复用方法: 频分多路复用( frequency division multiplexing-FDM ) 时分多路复用( time division multiplexing-TDM ) 波分多路复用(Wavelength division multiplexing-WDM) 码分多路复用( Code division multiplexing

04 电路交换

北城余情 提交于 2019-12-06 10:09:14
04 电路交换 如何实现数据从源 主机通过网络核心送达 目的主机? 数据交换 为什么需要数据交换? 若不采用数据交换, 那么随着网络规模的增加, 所需链路呈现n^2增长。 数据交换的类型 电路交换 报文交换 分组交换 电路交换: 打电话 电路交换的三个阶段:建立连接 通信 释放连接 建立连接即找一条连接专线, 通信即找到专线后用此传输数据, 传输完数据后需要释放链接 可以看到, 长距离电路交换需要经过多个交换机, 占线较多, 所以长途电话很贵 电路交换适合数据量大的实时交换, 如语音,视频 核心路由器之间可以使用电路交换 不灵活, 电路交换存在占线的情况 多路复用 典型多路复用方法:  频分多路复用( frequency division multiplexing-FDM )  时分多路复用( time division multiplexing-TDM )  波分多路复用(Wavelength division multiplexing-WDM)  码分多路复用( Code division multiplexing-CDM ) 频分多路复用FDM 频分多路复用的各用户占用不同的 带宽资源 (请注意,这里的“带宽 ”是频率带宽(单位:Hz)而不是 数据的发送速率); 用户在分配到一定的频带后,在通 信过程中自始至终都占用这个频带 时分多路复用TDM

详解IO多路复用中的select, poll, epoll

荒凉一梦 提交于 2019-12-06 08:33:30
select, poll, epoll 都是I/O多路复用的具体的实现,这三个是不同时期先后顺序出来的,也是为了改进性能。 I/O多路复用这个概念被提出来以后, select是第一个实现 (1983 左右在BSD里面实现的)。 1.select 被实现以后,暴露出了很多问题。 select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。 select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是哪个sock上有数据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍,这就消耗了很多无谓开销。 select 只能监视1024个链接, linux 定义在头文件中的,参见FD_SETSIZE。 select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,这个sock不用,要收回。这时候这个select 不支持的,如果你强制关掉这个sock,结果不可预测的。 2.poll的诞生:于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的很多问题,比如: poll 去掉了1024个链接的限制,于是要多少链接呢, 自己随意设置。 poll 从设计上来说,可以不再修改传入数组,当然这个要看你的平台了。

一文让你读懂懂阻塞、非阻塞、同步、异步IO

倖福魔咒の 提交于 2019-12-06 01:24:02
介绍 在谈及网络IO的时候总避不开阻塞、非阻塞、同步、异步、IO多路复用、select、poll、epoll等这几个词语。在面试的时候也会被经常问到这几个的区别。本文就来讲一下这几个词语的含义、区别以及使用方式。 Unix网络编程一书中作者给出了五种IO模型: 1、BlockingIO - 阻塞IO 2、NoneBlockingIO - 非阻塞IO 3、IO multiplexing - IO多路复用 4、signal driven IO - 信号驱动IO 5、asynchronous IO - 异步IO 这五种IO模型中前四个都是同步的IO,只有最后一个是异步IO。信号驱动IO使用的比较少,重点介绍其他几种IO以及在Java中的应用。 阻塞、非阻塞、同步、异步以及IO多路复用 在进行网络IO的时候会涉及到用户态和内核态,并且在用户态和内核态之间会发生数据交换,从这个角度来说我们可以把IO抽象成两个阶段:1、用户态等待内核态数据准备好,2、将数据从内核态拷贝到用户态。之所以会有同步、异步、阻塞和非阻塞这几种说法就是根据程序在这两个阶段的处理方式不同而产生的。 同步阻塞 当在用户态调用read操作的时候,如果这时候kernel还没有准备好数据,那么用户态会一直阻塞等待,直到有数据返回。当kernel准备好数据之后,用户态继续等待kernel把数据从内核态拷贝到用户态之后才可以使用

IP寻址过程二

只愿长相守 提交于 2019-12-06 01:02:43
,跨三层交换机 1,由于 B 的 IP 地址并没有和 A 在一个网段,所以当 A 向 B 发送数据时, A 并不会直接把数据给 B ,而是交给自己的网关,所以 A 首先会 ARP 广播请求 网关 的 MAC 地址 A 得到网关的 MAC 地址后,以它为数据帧的目标 MAC 地址进行封装数据,并发送出去 2,Router1 收到该帧后,检查该帧的目标 IP ,并到自己的路由表查找如何到达该网段发现能够到,并且下一跳地址是 routerB 的 s0 端口,于是将数据重新封装,将源地址改为 s0 端口 MAC 地址,目标 MAC 地址改为 router2 的 s0 端口 MAC 地址,并发送给router2 3,中间 路由原理一样 。。。。。。 4,最后一个路由(routerN )收到该帧,发现目标 IP 就在自己的直连网段,于是查看ARP 缓存,如果找到该 IP 的 MAC 地址,则以该 MAC 地址封装数据发送出去,如果在ARP 缓存没找到,则发出 ARP 广播,请求该 IP 的 MAC 地址,得到对应的 MAC 地址后,再发送给主机 B 在以上数据传递过程中,我们发现,数据帧的源 IP 和目标 IP 始终是不变的,而经过每个路由进行重新封装数据时 MAC 地址则在不断的变化,总是以自己的地址作为源 MAC 地址,下一跳的地址作为目标 MAC 地址 上面是因特网上全球唯一的IP

I/O多路复用模型

旧巷老猫 提交于 2019-12-05 11:50:59
背景 在文章 《unix网络编程》(12)五种I/O模型 中提到了五种I/O模型,其中前四种:阻塞模型、非阻塞模型、信号驱动模型、I/O复用模型都是同步模型;还有一种是异步模型。 想写一个系列的文章,介绍从I/O多路复用到异步编程和RPC框架,整个演进过程,这一系列可能包括: I/O多路复用模型 epoll介绍与使用 Reactor和Proactor模型 为什么需要异步编程 enable_shared_from_this用法分析 网络通信库和RPC 为什么有多路复用? 多路复用技术要解决的是“通信”问题,解决核心在于“同步事件分离器”(de-multiplexer),linux系统带有的分离器select、poll、epoll网上介绍的比较多,大家可以看看这篇介绍的不错的文章: 我读过的最好的epoll讲解 。通信的一方想要知道另一方的状态(以决定自己做什么),有两种方法: 一是轮询,二是消息通知。 轮询 轮询的一种典型的实现可能是这样的:当然这里的epoll_wait()也可以使用poll()或者select()替换。 while (true) { active_stream[] = epoll_wait(epollfd) for i in active_stream[] { read or write till } } 轮询方式主要存在以下不足: 增加系统开销

并发网络通信-io多路复用

佐手、 提交于 2019-12-04 23:42:24
""" io多路复用 select select tcp 服务 """ from socket import * from select import * s = socket()# 创建套接字,监听连接 s.setsockopt(SOL_SOCKET, SO_REUSEADDR, True) s.bind(('0.0.0.0', 9999)) s.listen(5) rlist = [s] while True: try: rs, ws, xs = select(rlist,[], []) except: continue for i in rs: if i == s: c, addr = i.accept() rlist.append(c) else: data = i.recv(1024).decode() if not data: rlist.remove(i) i.close() else: print(data) i.send(b'thanks') """ io多路复用的实现 poll() """ from select import * from socket import * s = socket()# 创建套接字 io s.setsockopt(SOL_SOCKET, SO_REUSEADDR, True) s.bind(('0.0.0.0', 8888)) s

多路复用相关资料

三世轮回 提交于 2019-12-04 19:58:59
同步非阻塞 ngx.req.read_body() -- 同步非阻塞 (1) local data = ngx.req.get_body_data() if data then ngx.print("body: ", data) -- 同步非阻塞 (2) end (1)和(2)分别是数据是收和发运作,只有收到才能发送,所以是同步的。 但即使因为网络原因没有收到或者发送不出,也不会阻塞干等着,而是做个“记号”,把等待的这段CPU时间用来处理其他请求 单个处理流程是阻塞的,但整个程序却是非阻塞的 单个请求处理来看是分散的、阻塞的,但因为都 复用 了一个线程里,所以资源的利用率非常高 来源: https://www.cnblogs.com/yeni/p/11880480.html