多路复用

计网基础-多路复用

旧巷老猫 提交于 2020-02-03 07:01:37
多路复用,multiplexing,是通信技术中的基本概念。 在 电路交换网络 中,事实上并不能保证每一对通信之间都有单独的一个物理链路 因为在很多情况下,一些物理链路的通信能力远远大于一对通信所需要的通信能力, 比如光纤,所以,常常使用共用技术。使用复用器和分用器建立共享信道。 什么是多路复用? 把信道资源进行划分,即把链路/网络资源(如带宽)划分为“ 资源片 ”。 将资源片分配给各路“ 呼叫 ”(calls) 每路呼叫 独占 分配到的资源片进行通信。所以,这个资源片在被释放之前可能出现“ 闲置 ”(idle)(即无共享) 典型多路复用方法: - 频分多路复用(frequency division multiplexing-FDM) 将 信道资源 在 频率 上进行划分成多个子信道,现实中应用:电视的频道 各用户占用不同的带宽资源(这里的带宽是指频率带宽Hz,而不是数据的发送速率) 用户在分配到一定的频带后,在通信过程中自始至终都占用这个频带 - 时分多路复用(time division multiplexing-TDM) 将时间划分为一段段等长的 时分复用帧(TDM帧) ,每一个用户在每个TMD帧中占用固定序号的 时隙 每一个用户所占用的时隙是 周期性 出现,其周期就是TMD帧的长度 如下图,帧1中每一个用户使用1、2、3...,下一帧2每一个用户同样使用各自分配帧(1、2、3.

I/O多路复用之select

大城市里の小女人 提交于 2020-02-02 00:20:02
1、select的些许缺点 回忆一下 select接口 int select ( int nfds , fd _ set *readfds , fd _ set *writefds , fd _ set *exceptfds, struct timeval *timeout ); select需要我们指定文件描述符的最大值,然后取[0,nfds)这个范围内的值查看是在集合readfds,writefds或execptfds中,也就是说这个范围内存在一些不是我们感兴趣的文件描述符,cpu做了一些无用功,poll对她进行了改进,下面就看看poll是怎么做的。 2、poll接口 #include <poll.h> int poll ( struct pollfd *fds, nfds_t nfds, int timeout ); 跟select不同的是,poll不再告知内核一个范围,而是通过struct pollfd结构体数组精确的告知内核用户关心哪些文件描述符(流)。参数nfds指示结构体数组的大小。timeout表示程序员的忍耐度, 有三种取值: 0,poll函数不阻塞 整数,阻塞timeout时间 负数,无限阻塞 下面来看一下struct pollfd结构体,以及其中的事件有哪些取值,及其含义 struct pollfd {   int fd; /* an open file

第十二章 并发编程 学习笔记

十年热恋 提交于 2020-02-01 18:03:16
第十二章 并发编程 进程是程序级并发,线程是函数级并发。 三种基本的构造并发程序的方法: 进程: 每个逻辑控制流是个一个进程,由内核进行调度和维护。 I/O 多路复用: 应用程序在一个进程的上下文中显式地调度他们自己的逻辑流。 线程: 运行在单一进程上下文中的逻辑流,由内核进行调度。 12.1 基于进程的并发编程 构造并发程序最简单的方法就是 用进程。 使用大家都很熟悉的函数例如: fork exec waitpid 关于在父、子进程间共享状态信息:共享文件表,但不共享用户地址空间。 进程又独立的地址空间既是优点又是缺点: 优点:防止虚拟存储器被错误覆盖 缺点:开销高,共享状态信息才需要IPC机制 12.2 基于I/O多路复用的并发编程 就是使用select函数要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。 select函数处理类型为fd_set的集合,也叫做 描述符集合。 select函数有两个输入:一个称为 读集合 的描述符集合和该妒忌和该读集合的基数(n)(实际上是任何描述符集合的最大基数)。select函数会一直阻塞,直到读集合中至少有一个描述符准备好可以读。当且仅当一个从该描述符读取一个字节的请求不会阻塞时,描述符K就表示准备好可以读了。 作为一个副作用,select修改了参数fdset指向的fd_set,指明读集合中一个称为准备好集合的子集

大数据面试-redis(一)

瘦欲@ 提交于 2020-01-29 12:43:46
遇到的字节跳动面试: 一、redis为什么那么快? 主要有一下几点: 纯内存操作 单线程操作,避免频繁上下文切换 采用了非阻塞I/O多路复用机制 二、关于非阻塞I/O多路复用 简单来说, 就是我们的redis-client 在操作的时候, 会产生不同时间类型的socket。 在服务端,有一段 I/O多路复用程序, 将其置入队列中。然后, 文件时间分派器, 依次去队列中取, 转发到不同的时间处理器中。 另外 , redis还提供了select、 来源: CSDN 作者: weixin_38965811 链接: https://blog.csdn.net/weixin_38965811/article/details/104104780

Nginx学习笔记(三)—Nginx的I/O模型详解

☆樱花仙子☆ 提交于 2020-01-29 03:37:47
一、web请求处理机制 1.1 多进程方式 多进程方式: 服务器每接受到一个客户端请求就有服务器的 主进程 生成一个 子进程 响应客户端 ,直到用户关闭连接 优点:处理速度快,子进程之间相互独立 缺点: 访问过多会导致服务器资源耗尽而无法再提供请求 1.2 多线程方式 多线程方式: :与多进程方式类似,但是每收到一个客户端请求会有 服务进程 派生出一个 线程 来和客户方进行交互。 优点: 一个线程的开销远远小于一个进程 ,因此减轻了web服务器对系统资源的要求 缺点:当多个线程位于同一个进程内工作的时候,可以相互访问同一的内存地址空间,所以 线程相互影响 , 一旦主进程挂掉则所有子线程都不能工作 ,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。 1.3 异步 异步的方式:nginx的epoll,apache的event等 二、同步异步,阻塞非阻塞和Nginx的I/O模型 2.1 同步与异步(应用程序与内核的交互方式) 同步: 进程发出数据后,等内核返回响应以后才继续下一个请求,即如果内核一直不返回数据,那么进程就一直等,直到天荒地老,死机error。 异步: 进程发出数据后,不等内核返回响应,接着处理下一个请求,内核通过回调函数来处理进程。Nginx是异步的。 同步和异步关注的是消息通信机制 ,在同步机制中,所有的请求在服务器端得到同步

python IO模式(多路复用和异步IO深入理解)

我只是一个虾纸丫 提交于 2020-01-26 04:38:13
1、事件渠道模型。事件渠道为异步IO的原型。 2、IO模式,一次IO调用会经历两个阶段。一、等待数据阶段,将数据从网络或者是磁盘读取到系统内核(kennel) 二、将数据从内核拷贝到进程中。 基于这两个阶段,linux系统下面产生了五种网络网络模式方案。 -阻塞I/O(blocking IO) -非阻塞I/O(nobokcing IO) - I/O多路复用。(I/O multiplexing) - 信号驱动 -异步I/O(async) 由于信号驱动使用较少,主要介绍其余四种模式。 3、阻塞I/O(blocking IO)在数据准备阶段和贝考数据阶段都会阻塞。用户调用recefrom 以后会一直等待数据拷贝到用户内存未至。 2、非阻塞I/O(nobokcing IO),用户会一直调用recefrom,如果数据没有准备好。会返回一个ERROR。一直到数据准备好。因此在读数据阶段不会卡住。 3、epoll模式,也就是IO多路复用模式。一次性可以处理多个网络IO。调用select方法。首先会卡住。直到其中一个有数据就会立即返回。然后拷贝数据。然后进入下一个循环 4、异步IO,异步I/O不会阻塞。当用户进程发起read操作以后。可以立刻开始做其他的事情(相当于告诉在内核注册一个事件。由内核进行监控,处理完以后内核主动通知)。而另一方面从kennel角度看当他收到一个async read以后

IO模型——IO多路复用机制

孤街醉人 提交于 2020-01-24 02:49:31
(1)I/O多路复用技术通过把多个I/O的阻塞复用到同一个select、poll或epoll的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程。 (2)select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。 (3)I/O多路复用的主要应用场景如下: 服务器 需要同时处理多个处于监听状态或者多个连接状态的套接字; 服务器需要同时处理多种网络协议的套接字; (4)目前支持I/O多路复用的系统调用有 select,poll,epoll,epoll与select的原理比较类似,但epoll作了很多重大改进,现总结如下: ①支持一个进程打开的文件句柄FD个数不受限制(为什么select的句柄数量受限制:select使用位域的方式来传递关心的文件描述符,因为位域就有最大长度,在Linux下是1024,所以有数量限制); ②I/O效率不会随着FD数目的增加而线性下降; ③epoll的API更加简单; 来源: https://www.cnblogs.com/sea-stream/p/10563955.html

Flume拦截器、Process、多路复用的使用

我是研究僧i 提交于 2020-01-23 16:19:05
#flume扇出的时候的多路复用形式 a1.sources=r1 a1.channels=c1 c2 a1.sinks=s1 s2 a1.sources.r1.type=HTTP a1.sources.r1.port=4444 a1.sources.r1.selector.type=multiplexing a1.sources.r1.selector.header=a # 是a1的话就发送到c1上 a1.sources.r1.selector.mapping.a1=c1 #不是a1而是其他情况的话,就发送到c2 a1.sources.r1.selector.default=c2 a1.channels.c1.type=memory a1.channels.c1.capacity=100 a1.channels.c1.transactionCapacity=100 a1.channels.c2.type=memory a1.channels.c2.capacity=100 a1.channels.c2.transactionCapacity=100 a1.sinks.s1.type=avro a1.sinks.s1.hostname=192.168.224.132 a1.sinks.s1.port=3333 a1.sinks.s2.type=avro a1.sinks.s2

QUIC协议文档翻译——什么是QUIC

霸气de小男生 提交于 2020-01-23 01:10:40
原文地址 https://docs.google.com/document/d/1gY9-YNDNAB1eip-RTPbqphgySwSNSDHLq9D5Bty4FSU/edit QUIC是一个谷歌提出的新的互联网协议。 QUIC解决出现在现在网络协议的一些传输层和应用层的问题,而且几乎不需要应用更改。QUIC和 TCP+TLS+HTTP2十分相似,但是基于UDP实现。使用QUIC作为一个独立的协议可以做到一些别的协议做不到的创新,因为它们受到传统客户端和中间件的阻碍。 和 TCP+TLS+HTTP2相比,QUIC的核心优势有以下几点: 连接建立延迟 提升拥塞控制 无需排头阻塞的多路复用 向前纠错 连接迁移 连接建立 简单来说,在发送有效负载前,和 TCP+TLS的1~3rt相比, QUIC通常需要0rt。 当QUIC客户端第一次链接到服务端时,客户端必须执行1rt的握手来获取完成握手的所有必要信息。客户端发送一个 CHLO,服务端返回一个带有客户端用来继续执行的拒信,包括源地址令牌和服务器证书。下次客户端发送CHLO时,可以使用上次连接缓存的证书来立刻返回一个加密的消息。 拥塞控制 QUIC有可插拔的拥塞控制,而且比TCP给拥塞控制提供更丰富的信息。这允许一个QUIC发送者识别重发的ACK和原始的ACK避免TCP的重发歧义问题。QUIC ACK还明确传输数据包发送和接收的延时