精华内容
下载资源
问答
  • HTTP/2解决的问题,就是HTTP/1.1存在的问题: ...另外慢启动是TCP为了减少网络拥塞的一种策略,我们是没有办法改变的。 条TCP连接竞争带宽: 如果同时建立条TCP连接,当带宽不足时就会竞争带宽,影响关键资...

    HTTP/2解决的问题,就是HTTP/1.1存在的问题:

    • TCP慢启动: TCP连接建立后,会经历一个先慢后快的发送过程,就像汽车启动一般,如果我们的网页文件(HTML/JS/CSS/icon)都经过一次慢启动,对性能是不小的损耗。另外慢启动是TCP为了减少网络拥塞的一种策略,我们是没有办法改变的。
    • 多条TCP连接竞争带宽: 如果同时建立多条TCP连接,当带宽不足时就会竞争带宽,影响关键资源的下载。
    • HTTP/1.1队头阻塞: 尽管HTTP/1.1长链接可以通过一个TCP连接传输多个请求,但同一时刻只能处理一个请求,当前请求未结束前,其他请求只能处于阻塞状态。

    为了解决以上几个问题,HTTP/2一个域名只使用一个TCP⻓连接来传输数据,而且请求直接是并行的、非阻塞的,这就是多路复用

    实现原理: HTTP/2引入了一个二进制分帧层,客户端和服务端进行传输时,数据会先经过二进制分帧层处理,转化为一个个带有请求ID的帧,这些帧在传输完成后根据ID组合成对应的数据。


     

    展开全文
  • 看大图:https://www.processon.com/view/link/5f26da28f346fb5cdcb377a3
    展开全文
  • 多路复用原理介绍

    千次阅读 2017-11-09 18:05:00
    多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。 Linux Linux中的 select,poll,epoll 都是IO多路复用的机制。 具体...

    多路复用

    I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

    Linux
    Linux中的 select,poll,epoll 都是IO多路复用的机制。

    具体说明如下:

    select
     
      select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。
    select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一。
    select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。
    另 外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量 TCP连接处于非活跃状态,但调用select()会对所有socket进行一次线性扫描,所以这也浪费了一定的开销。
     
    poll
     
        poll在1986年诞生于System V Release 3,它和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制。
    poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。
    另 外,select()和poll()将就绪的文件描述符告诉进程后,如果进程没有对其进行IO操作,那么下次调用select()和poll()的时候将 再次报告这些文件描述符,所以它们一般不会丢失就绪的消息,这种方式称为水平触发(Level Triggered)。
     
    epoll
     
        直到Linux2.6才出现了由内核直接支持的实现方法,那就是epoll,它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。
    epoll可以同时支持水平触发和边缘触发(Edge Triggered,只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发),理论上边缘触发的性能要更高一些,但是代码实现相当复杂。
    epoll 同样只告知那些就绪的文件描述符,而且当我们调用epoll_wait()获得就绪文件描述符时,返回的不是实际的描述符,而是一个代表就绪描述符数量的 值,你只需要去epoll指定的一个数组中依次取得相应数量的文件描述符即可,这里也使用了内存映射(mmap)技术,这样便彻底省掉了这些文件描述符在 系统调用时复制的开销。
    另一个本质的改进在于epoll采用基于事件的就绪通知方式。在select/poll中,进程只有在调用一定的方法后, 内核才对所有监视的文件描述符进行扫描,而epoll事先通过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类 似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait()时便得到通知。

    Python
    Python中有一个select模块,其中提供了:select、poll、epoll三个方法,分别调用系统的 select,poll,epoll 从而实现IO多路复用。

    Windows Python:
        提供: select
    Mac Python:
        提供: select
    Linux Python:
        提供: select、poll、epoll

    注意:网络操作、文件操作、终端操作等均属于IO操作,对于windows只支持Socket操作,其他系统支持其他IO操作,但是无法检测 普通文件操作 自动上次读取是否已经变化。

    对于select方法:

    句柄列表11, 句柄列表22, 句柄列表33 = select.select(句柄序列1, 句柄序列2, 句柄序列3, 超时时间)
    参数: 可接受四个参数(前三个必须)
    返回值:三个列表
     
    select方法用来监视文件句柄,如果句柄发生变化,则获取该句柄。
    1、当 参数1 序列中的句柄发生可读时(accetp和read),则获取发生变化的句柄并添加到 返回值1 序列中
    2、当 参数2 序列中含有句柄时,则将该序列中所有的句柄添加到 返回值2 序列中
    3、当 参数3 序列中的句柄发生错误时,则将该发生错误的句柄添加到 返回值3 序列中
    4、当 超时时间 未设置,则select会一直阻塞,直到监听的句柄发生变化
       当 超时时间 = 1时,那么如果监听的句柄均无任何变化,则select会阻塞 1 秒,之后返回三个空列表,如果监听的句柄有变化,则直接执行。


    利用select监听终端操作实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import select
    import threading
    import sys
    while True:
        readable, writeable, error = select.select([sys.stdin,],[],[],1)
        if sys.stdin in readable:
            print 'select get stdin',sys.stdin.readline()



    利用select实现伪同时处理多个Socket客户端请求:服务端

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import socket
    import select
    sk1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sk1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sk1.bind(('127.0.0.1',8002))
    sk1.listen(5)
    sk1.setblocking(0)
    inputs = [sk1,]
    while True:
        readable_list, writeable_list, error_list = select.select(inputs, [], inputs, 1)
        for in readable_list:
            # 当客户端第一次连接服务端时
            if sk1 == r:
                print 'accept'
                request, address = r.accept()
                request.setblocking(0)
                inputs.append(request)
            # 当客户端连接上服务端之后,再次发送数据时
            else:
                received = r.recv(1024)
                # 当正常接收客户端发送的数据时
                if received:
                    print 'received data:', received
                # 当客户端关闭程序时
                else:
                    inputs.remove(r)
    sk1.close()


    利用select实现伪同时处理多个Socket客户端请求:客户端

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import socket
    ip_port = ('127.0.0.1',8002)
    sk = socket.socket()
    sk.connect(ip_port)
    while True:
        inp = raw_input('please input:')
        sk.sendall(inp)
    sk.close()

      此处的Socket服务端相比与原生的Socket,他支持当某一个请求不再发送数据时,服务器端不会等待而是可以去处理其他请求的数据。但是,如果每个请求的耗时比较长时,select版本的服务器端也无法完成同时操作。

    分别启动服务端和客户端输入内容

    客户端输入:

    wKiom1cQlwigOyG7AACLOJxGIxo868.png


    服务端接收:

    wKiom1cQlymwF8hdAACCR5usF1M402.png


    说明:此处的Socket服务端相比与原生的Socket,他支持当某一个请求不再发送数据时,服务器端不会等待而是可以去处理其他请求的数据。但是,如果每个请求的耗时比较长时,select版本的服务器端也无法完成同时操作。





          本文转自027ryan  51CTO博客,原文链接:http://blog.51cto.com/ucode/1740095,如需转载请自行联系原作者


    展开全文
  • 多路复用技术的基本原理是:各路信号在进入同一个有线的或无线的传输媒质之前,先采用调制技术把它们调制为互相不会混淆的已调制信号,然后进入传输媒质传送到对方,在对方再用解调(反调制)技术对这些信号加以...

    基带信号就是将数字信号1或0直接用两种不同的电压来表示,然后送到线路上去传输。

    宽带信号则是将基带信号进行调制后形成的频分复用模拟信号。

    多路复用技术的基本原理是:各路信号在进入同一个有线的或无线的传输媒质之前,先采用调制技术把它们调制为互相不会混淆的已调制信号,然后进入传输媒质传送到对方,在对方再用解调(反调制)技术对这些信号加以区分,并使它们恢复成原来的信号,从而达到多路复用的目的。

    常用的多路复用技术有频分多路复用技术和时分多路复用技术。

    频分多路复用是将各路信号分别调制到不同的频段进行传输,多用于模拟通信。频分复用(FDM,Frequency Division Multiplexing)就是将用于传输信道的总带宽划分成若干个子频带(或称子信道),每一个子信道传输1路信号。频分复用要求总频率宽度大于各个子 信道频率之和,同时为了保证各子信道中所传输的信号互不干扰,应在各子信道之间设立隔离带,这样就保证了各路信号互不干扰(条件之一)。频分复用技术的特 点是所有子信道传输的信号以并行的方式工作,每一路信号传输时可不考虑传输时延,因而频分复用技术取得了非常广泛的应用。频分复用技术除传统意义上的频分复用(FDM)外,还有一种是正交频分复用(OFDM)。频分多路复用的原理图如下所示:

    clip_image002

    时分多路复用技术是利用时间上离散的脉冲组成相互不重叠的多路信号,广泛应用于数字通信。时分多路复用适用于数字信号的传输。由于信道的位传输率超过每一路信号的数据传输率,因此可将信道按时间分成若干片段轮换地给多个信号使用。每一时间片由 复用的一个信号单独占用,在规定的时间内,多个数字信号都可按要求传输到达,从而也实现了一条物理信道上传输多个数字信号。假设每个输入的数据比特率是 9. 6kbit / s ,线路的最大比特率为76. 8 kbit / s ,则可传输8 路信号。

    除了频分和时分多路复用技术外,还有一种波分复用技术。这是在光波频率范围内,把不同波长的光波,按一定间隔排列在一根光纤中传送。这种用于光纤通信的“波分复用”技术,现在正在迅速发展之中。波分复用(WND)是将两种或多种不同波长的光载波信号(携带各种信息)在发送端经复用器(亦称合波器,Multiplexer)汇合在一起,并耦合到光线路的同一根光纤中进行传输的技术;在接收端,经解复用器(亦称分波器或称去复用器,Demultiplexer)将各种波长的光载波分离,然后由光接收 机作进一步处理以恢复原信号。这种在同一根光纤中同时传输两个或众多不同波长光信号的技术,称为波分复用clip_image004

    频分多路复用与时分多路复用的区别如下:
      (1)微观上,频分多路复用的各路信号是并行的,而时分多路复用是串行的。

      (2)频分多路复用较适合于模拟信号,而时分多路复用较适用于数字信号。

    频分多路复用是将传输介质的可用带宽分割成一个个“频段”,以便每个输入装置都分配到一个“频段”。传输介质容许传输的最大带宽构成一个信道,因此每个“频段”就是一个子信道。

    频分多路复用的特点是:每个用户终端的数据通过专门分配给它的信道传输,在用户没有数据传输时,别的用户也不能使用。频分多路复用适合于模拟信号的频分传输,主要用于电话和电缆电视(CATV)系统,在数据通信系统中应和调制解调技术结合使用。

    展开全文
  • IO多路复用

    万次阅读 多人点赞 2017-09-26 23:22:24
    I/O多路复用机制 IO多路复用机制 简介 1流的概念 2 IO同步异步阻塞非阻塞 3 多路复用概念 4 IO复用的优势 IO复用函数介绍 1 select函数 2 Poll函数 3epoll函数 4 epoll相比于selectpoll的优势 总结 1.简介希望通过这...
  • 计算机网络-多路复用

    千次阅读 多人点赞 2019-02-12 16:41:22
     事实上,多路复用技术的原理就是,把通信资源或者说是链路、信道资源进行的划分,分成一系列的资源片。把这些资源片分配给每一路通信。每一路通信在通信过程中就独占它分配到的分配资源。当然在整个通信过程中,...
  • redis原理,为什么快,io多路复用

    千次阅读 2020-03-21 17:34:18
    很多同学对Redis的单线程和I/O多路复用技术并不是很了解,所以我用简单易懂的语言让大家了解下Redis单线程和I/O多路复用技术的原理,对学好和运用好Redis打下基础。 一、Redis的单线程理解 Redis客户端对服务端的...
  • 多路复用基本方法 频分复用(FDM: frequency division multiplexing) 时分复用(TDM: time division multiplexing) 码分复用(CDM: code division multiplexing) 复接 目的:解决来自若干条链路的多路信号...
  • 多路复用技术

    千次阅读 2018-11-28 12:59:27
    多路复用就是把多个低速信道组合成一个高速信道的技术,这个技术当中要用到两个设备。多路复用器:在发送端根据某种规则把多个低带宽的信号复合成一个高带宽的信号。多路分配器:在接收端根据同一规则将高带宽的信号...
  • 多路复用

    2020-09-27 23:35:35
    多路复用基本知识多进程/多线程连接处理模型多路复用连接处理模型工作原理selectpollepollLT模式ET模式 基本知识 多进程/多线程连接处理模型 在该模型下,一个用户连接请求会由一个内核进程处理,而一个内核进程...
  • redis IO多路复用技术

    万次阅读 2018-02-04 18:38:22
    redis 是一个单线程却性能非常好...LINUX IO多路复用原理 在linux下面, 常见的有5中网络IO方式, 具体可以参考如下的文章, 总结的很清楚, 我们就不再具体介绍: http://blog.csdn.net/lltaoyy/article/details/54
  • 多路复用

    2008-06-18 15:10:29
    2、多路复用基本原理:  当物理信道的可用带宽超过单个原始信号所需的带宽时,可将该物理信道的总带宽分割成若干个固定带宽的子信道,并利用每个子信道传输一路信号,从而达到多路信号共用一个信道,或者将多路...
  • 今天给大家带来的是“多路复用技术”,什么是多路复用技术呢?简单的说就是许多单个的信号通过高速线路上的信道同时进行传输,这里有两点是要说的。第一,前面所说的高速线路的信道实际上是由一条信道分割出来的多条...
  • IO多路复用—由Redis的IO多路复用yinch

    万次阅读 多人点赞 2018-04-23 16:56:40
    linux IO多路复用有epoll, poll, select,epoll性能比其他几者要好。 名词比较绕口,理解涵义就好。一个epoll场景:一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”(事件),你小跑过去...
  • Linux多路复用之select/poll/epoll实现原理及优缺点对比
  • 相关文章 java网络编程—NIO与Netty(四) ...java网络编程—基石:五种IO模型及原理(多路复用\epoll) 理解Netty首先要理解NIO,理解NIO首先要理解reactor模型、多路复用select\poll\epoll等等原理。所以
  • Java IO多路复用机制详解

    千次阅读 2020-04-03 18:03:42
    1、在Java中,常见的IO模型有4种, 同步阻塞IO(BlockingIO):即传统的IO模型。 同步非阻塞IO(Non-blockingIO):默认创建的socket都... IO多路复用(IOMultiplexing):经典的Reactor模式,也称为异步阻塞IO,...
  • IO多路复用机制详解

    千次阅读 2016-07-21 15:53:30
    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型。 (2)同步非阻塞IO(Non-blocking IO):默认创建的...(3)IO多路复用
  • 把一个物理信道划分为个逻辑信道,各个逻辑信道占用互不重叠的频带,相邻信道之间用“警戒频带”隔离,以便将不同的信号调制(滤波)分别限制在不同的频带内,在接收端再用滤波将它们分离。 (2)时分复用 ...
  • 多路复用(multiplexing) 简称复用,是通信技术中的基本概念 主要思想:将链路/网络资源划分为"资源片",将资源片分配给各路"呼叫"(calls) 每路呼叫独占分配到的资源片进行通信。这个过程中,资源片可能闲置。 ...
  • 面试之多路复用

    万次阅读 多人点赞 2018-03-27 21:07:31
    所谓I/O多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通...
  • Java IO多路复用技术详解

    万次阅读 2017-04-28 09:49:58
    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型。 (2)同步非阻塞IO(Non-blocking IO):默认创建的...(3)IO多路复用(IO Multiplexi
  • 前面两篇文章我们主要了解了一下...今天我们重点分析一下ConnectIntercept拦截器中的多路复用 @Override public Response intercept(Chain chain) throws IOException { RealInterceptorChain realChain = (Rea...
  • python-IO多路复用

    千次阅读 2017-04-12 17:58:54
    I/O多路复用I/O多路复用是用于提升效率,单个进程可以同时监听多个网络连接IOI/O是指Input/OutputI/O多路复用,通过一种机制,可以监视多个文件描述符,一旦描述符就绪(读就绪和写就绪),能通知程序进行相应的读写...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,785
精华内容 14,714
关键字:

多路复用基本原理