精华内容
下载资源
问答
  • IO 多路复用什么意思?

    千次阅读 2019-01-03 00:36:26
    1 IO 多路复用什么意思? - 罗志宇的回答 - 知乎 https://www.zhihu.com/question/32163005/answer/55772739 这个还是很好说清楚的。 假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,...

    转自:https://www.zhihu.com/question/32163005

    1 IO 多路复用是什么意思? - 罗志宇的回答 - 知乎 https://www.zhihu.com/question/32163005/answer/55772739

    这个还是很好说清楚的。

    假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接乘客。

    你会怎么做?

    最简单的做法,就是你去招一大批空管员,然后每人盯一架飞机, 从进港,接客,排位,出港,航线监控,直至交接给下一个空港,全程监控。

    那么问题就来了:

    • 很快你就发现空管塔里面聚集起来一大票的空管员,交通稍微繁忙一点,新的空管员就已经挤不进来了。
    • 空管员之间需要协调,屋子里面就1, 2个人的时候还好,几十号人以后 ,基本上就成菜市场了。
    • 空管员经常需要更新一些公用的东西,比如起飞显示屏,比如下一个小时后的出港排期,最后你会很惊奇的发现,每个人的时间最后都花在了抢这些资源上。

     

    现实上我们的空管同时管几十架飞机稀松平常的事情, 他们怎么做的呢?
    他们用这个东西

    这个东西叫flight progress strip. 每一个块代表一个航班,不同的槽代表不同的状态,然后一个空管员可以管理一组这样的块(一组航班),而他的工作,就是在航班信息有新的更新的时候,把对应的块放到不同的槽子里面。

     

    这个东西现在还没有淘汰哦,只是变成电子的了而已。。

    是不是觉得一下子效率高了很多,一个空管塔里可以调度的航线可以是前一种方法的几倍到几十倍。

    如果你把每一个航线当成一个Sock(I/O 流), 空管当成你的服务端Sock管理代码的话.

    第一种方法就是最传统的多进程并发模型 (每进来一个新的I/O流会分配一个新的进程管理。)
    第二种方法就是I/O多路复用 (单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流 。)

    其实“I/O多路复用”这个坑爹翻译可能是这个概念在中文里面如此难理解的原因。所谓的I/O多路复用在英文中其实叫 I/O multiplexing. 如果你搜索multiplexing啥意思,基本上都会出这个图:

    于是大部分人都直接联想到"一根网线,多个sock复用" 这个概念,包括上面的几个回答, 其实不管你用多进程还是I/O多路复用, 网线都只有一根好伐。多个Sock复用一根网线这个功能是在内核+驱动层实现的

    重要的事情再说一遍: I/O multiplexing 这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态(对应空管塔里面的Fight progress strip槽)来同时管理多个I/O流. 发明它的原因,是尽量多的提高服务器的吞吐能力。

     

    是不是听起来好拗口,看个图就懂了.

     


    在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流, (学过EE的人现在可以站出来义正严辞说这个叫“时分复用”了)。

     

    什么,你还没有搞懂“一个请求到来了,nginx使用epoll接收请求的过程是怎样的”, 多看看这个图就了解了。提醒下,ngnix会有很多链接进来, epoll会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理。

    ------------------------------------------
    了解这个基本的概念以后,其他的就很好解释了。

    select, poll, epoll 都是I/O多路复用的具体的实现,之所以有这三个鬼存在,其实是他们出现是有先后顺序的。

    I/O多路复用这个概念被提出来以后, select是第一个实现 (1983 左右在BSD里面实现的)。

    select 被实现以后,很快就暴露出了很多问题。

    • select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。
    • select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍,这个无谓的开销就颇有海天盛筵的豪气了。
    • select 只能监视1024个链接, 这个跟草榴没啥关系哦,linux 定义在头文件中的,参见FD_SETSIZE。
    • select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,尼玛,这个sock不用,要收回。对不起,这个select 不支持的,如果你丧心病狂的竟然关掉这个sock, select的标准行为是。。呃。。不可预测的, 这个可是写在文档中的哦.

    “If a file descriptor being monitored by select() is closed in another thread, the result is unspecified”
    霸不霸气

    于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的很多问题,比如

    • poll 去掉了1024个链接的限制,于是要多少链接呢, 主人你开心就好。
    • poll 从设计上来说,不再修改传入数组,不过这个要看你的平台了,所以行走江湖,还是小心为妙。

    其实拖14年那么久也不是效率问题, 而是那个时代的硬件实在太弱,一台服务器处理1千多个链接简直就是神一样的存在了,select很长段时间已经满足需求。

    但是poll仍然不是线程安全的, 这就意味着,不管服务器有多强悍,你也只能在一个线程里面处理一组I/O流。你当然可以那多进程来配合了,不过然后你就有了多进程的各种问题。

    于是5年以后, 在2002, 大神 Davide Libenzi 实现了epoll.

    epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题, 比如:

    • epoll 现在是线程安全的。
    • epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。

     

    epoll 当年的patch,现在还在,下面链接可以看得到:
    /dev/epoll Home Page

    贴一张霸气的图,看看当年神一样的性能(测试代码都是死链了, 如果有人可以刨坟找出来,可以研究下细节怎么测的).


    横轴Dead connections 就是链接数的意思,叫这个名字只是它的测试工具叫deadcon. 纵轴是每秒处理请求的数量,你可以看到,epoll每秒处理请求的数量基本不会随着链接变多而下降的。poll 和/dev/poll 就很惨了。

     

    可是epoll 有个致命的缺点。。只有linux支持。比如BSD上面对应的实现是kqueue。

    其实有些国内知名厂商把epoll从安卓里面裁掉这种脑残的事情我会主动告诉你嘛。什么,你说没人用安卓做服务器,尼玛你是看不起p2p软件了啦。

    而ngnix 的设计原则里面, 它会使用目标平台上面最高效的I/O多路复用模型咯,所以才会有这个设置。一般情况下,如果可能的话,尽量都用epoll/kqueue吧。

    详细的在这里:
    Connection processing methods

    PS: 上面所有这些比较分析,都建立在大并发下面,如果你的并发数太少,用哪个,其实都没有区别。 如果像是在欧朋数据中心里面的转码服务器那种动不动就是几万几十万的并发,不用epoll我可以直接去撞墙了

    I/O复用是不是用跟各种池一起用的?

    线程池和sock池都和具体实现有关。所以你要告诉我你指的线程池是某个实现呢,还是通常意义上的“线程池”

    通常意义上的线程池只是多线程里面对线程生命周期的一个管理方法而已(不用的线程不是直接结束掉,而是放到池里面复用, 以避免创建/销毁线程的开销),和并发模型没有关系。线程池=空管员宿舍。没有宿舍,空管员都要从家里来上班,有了宿舍,上下班开销变小。但是和空管们工作方式没有关系。

    不过很多很多的文章里面说的线程池其实是和多线程模型一起用的(多进程模型里面把进程换成线程)。这种情况一般是一个线程一个sock.

    如果用I/O复用和线程池,一般是一个线程一组I/O, 然后可能另外还有一堆工作线程处理具体数据。。

    关于socket 一个端口和多个端口通信如何通信?你注意到了accept会返回一个新的socket描述符么。。所以服务端只会监听一个端口,每次来了新的请求,都会创建一个新的sock和客户端通信。

    每个socket就是一个I/O流,不考虑协议的情况下,确实就是两端IP和端口不同(服务器可能有多个IP). 不管这个socket在不在池里面。

     

    笔者菠萝关于多线程和io多路复用的一点看法

    见下篇

    展开全文
  • 什么是复用工功能输入输出?复用功能输入输出类似于:房间《--》大厅《--》门《--》室外的关系;从房间到室外,需要经过大厅,在经过大门才可以到达室外;从室外到房间,也需要经过大门  1) 当给TDR寄存器...
  • Linux IO 多路复用什么意思?

    千次阅读 2016-04-10 16:56:59
    于是大部分人都直接联想到”一根网线,多个sock复用” 这个概念,包括上面的几个回答, 其实不管你用多进程还是I/O多路复用, 网线都只有一根好伐。多个Sock复用一根网线这个功能是在内核+驱动层实现的。 重要...

    写在前面:本文整理于知乎,原文链接为http://www.zhihu.com/question/32163005/answer/55772739,作者:罗志宇
    再次向作者表示感谢~~

    假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接乘客。

    你会怎么做?

    那么问题就来了:
    很快你就发现空管塔里面聚集起来一大票的空管员,交通稍微繁忙一点,新的空管员就已经挤不进来了。
    空管员之间需要协调,屋子里面就1, 2个人的时候还好,几十号人以后 ,基本上就成菜市场了。
    空管员经常需要更新一些公用的东西,比如起飞显示屏,比如下一个小时后的出港排期,最后你会很惊奇的发现,每个人的时间最后都花在了抢这些资源上。

    现实上我们的空管同时管几十架飞机稀松平常的事情, 他们怎么做的呢?
    他们用这个东西

       ![这里写图片描述](https://pic2.zhimg.com/583d5ba3cee12e78befa8e2b749f4269_b.jpg)
    

    这个东西叫flight progress strip. 每一个块代表一个航班,不同的槽代表不同的状态,然后一个空管员可以管理一组这样的块(一组航班),而他的工作,就是在航班信息有新的更新的时候,把对应的块放到不同的槽子里面。

    这个东西现在还没有淘汰哦,只是变成电子的了而已。。

    是不是觉得一下子效率高了很多,一个空管塔里可以调度的航线可以是前一种方法的几倍到几十倍。

    如果你把每一个航线当成一个Sock(I/O 流), 空管当成你的服务端Sock管理代码的话.

    第一种方法就是最传统的多进程并发模型 (每进来一个新的I/O流会分配一个新的进程管理。)
    第二种方法就是I/O多路复用 (单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流 。)

    其实“I/O多路复用”这个坑爹翻译可能是这个概念在中文里面如此难理解的原因。所谓的I/O多路复用在英文中其实叫 I/O multiplexing. 如果你搜索multiplexing啥意思,基本上都会出这个图:

    这里写图片描述
    于是大部分人都直接联想到”一根网线,多个sock复用” 这个概念,包括上面的几个回答, 其实不管你用多进程还是I/O多路复用, 网线都只有一根好伐。多个Sock复用一根网线这个功能是在内核+驱动层实现的。

    重要的事情再说一遍: I/O multiplexing 这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态(对应空管塔里面的Fight progress strip槽)来同时管理多个I/O流. 发明它的原因,是尽量多的提高服务器的吞吐能力。

    是不是听起来好拗口,看个图就懂了.

    这里写图片描述
    在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流, (学过EE的人现在可以站出来义正严辞说这个叫“时分复用”了)。

    什么,你还没有搞懂“一个请求到来了,nginx使用epoll接收请求的过程是怎样的”, 多看看这个图就了解了。提醒下,ngnix会有很多链接进来, epoll会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理。

    ------------------------------------------
    了解这个基本的概念以后,其他的就很好解释了。

    select, poll, epoll 都是I/O多路复用的具体的实现,之所以有这三个鬼存在,其实是他们出现是有先后顺序的。

    I/O多路复用这个概念被提出来以后, select是第一个实现 (1983 左右在BSD里面实现的)。

    select 被实现以后,很快就暴露出了很多问题。
    select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。
    select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍,这个无谓的开销就颇有海天盛筵的豪气了。
    select 只能监视1024个链接, 这个跟草榴没啥关系哦,linux 定义在头文件中的,参见FD_SETSIZE。
    select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,尼玛,这个sock不用,要收回。对不起,这个select 不支持的,如果你丧心病狂的竟然关掉这个sock, select的标准行为是。。呃。。不可预测的, 这个可是写在文档中的哦.
    “If a file descriptor being monitored by select() is closed in another thread, the result is unspecified”
    霸不霸气

    于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的很多问题,比如
    poll 去掉了1024个链接的限制,于是要多少链接呢, 主人你开心就好。
    poll 从设计上来说,不再修改传入数组,不过这个要看你的平台了,所以行走江湖,还是小心为妙。
    其实拖14年那么久也不是效率问题, 而是那个时代的硬件实在太弱,一台服务器处理1千多个链接简直就是神一样的存在了,select很长段时间已经满足需求。

    但是poll仍然不是线程安全的, 这就意味着,不管服务器有多强悍,你也只能在一个线程里面处理一组I/O流。你当然可以那多进程来配合了,不过然后你就有了多进程的各种问题。

    于是5年以后, 在2002, 大神 Davide Libenzi 实现了epoll.

    epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题, 比如:
    epoll 现在是线程安全的。
    epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。

    epoll 当年的patch,现在还在,下面链接可以看得到:
    /dev/epoll Home Page

    贴一张霸气的图,看看当年神一样的性能(测试代码都是死链了, 如果有人可以刨坟找出来,可以研究下细节怎么测的).

    这里写图片描述
    横轴Dead connections 就是链接数的意思,叫这个名字只是它的测试工具叫deadcon. 纵轴是每秒处理请求的数量,你可以看到,epoll每秒处理请求的数量基本不会随着链接变多而下降的。poll 和/dev/poll 就很惨了。

    可是epoll 有个致命的缺点。。只有linux支持。比如BSD上面对应的实现是kqueue。

    其实有些国内知名厂商把epoll从安卓里面裁掉这种脑残的事情我会主动告诉你嘛。什么,你说没人用安卓做服务器,尼玛你是看不起p2p软件了啦。

    而ngnix 的设计原则里面, 它会使用目标平台上面最高效的I/O多路复用模型咯,所以才会有这个设置。一般情况下,如果可能的话,尽量都用epoll/kqueue吧。

    详细的在这里:
    Connection processing methods

    PS: 上面所有这些比较分析,都建立在大并发下面,如果你的并发数太少,用哪个,其实都没有区别。 如果像是在欧朋数据中心里面的转码服务器那种动不动就是几万几十万的并发,不用epoll我可以直接去撞墙了。

    作者:罗志宇
    链接:http://www.zhihu.com/question/32163005/answer/55772739
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 信道复用频分复用 频分复用(FDM,Frequency Division Multiplexing)就是将用于传输信道的总带宽划分成若干个子频带(或称子信道),每一个子信道传输1路信号。频分复用要求总频率宽度大于各个子信道频率之和,...

    信道复用
    频分复用
      频分复用(FDM,Frequency Division Multiplexing)就是将用于传输信道的总带宽划分成若干个子频带(或称子信道),每一个子信道传输1路信号。频分复用要求总频率宽度大于各个子信道频率之和,同时为了保证各子信道中所传输的信号互不干扰,应在各子信道之间设立隔离带,这样就保证了各路信号互不干扰(条件之一)。频分复用技术的特点是所有子信道传输的信号以并行的方式工作,每一路信号传输时可不考虑传输时延,因而频分复用技术取得了非常广泛的应用。频分复用技术除传统意义上的频分复用(FDM)外,还有一种是正交频分复用(OFDM)。
      1.1传统的频分复用
      传统的频分复用典型的应用莫过于广电HFC网络电视信号的传输了,不管是模拟电视信号还是数字电视信号都是如此,因为对于数字电视信号而言,尽管在每一个频道(8 MHz)以内是时分复用传输的,但各个频道之间仍然是以频分复用的方式传输的。
      1.2正交频分复用
      OFDM(Orthogonal Frequency Division Multiplexing)实际是一种多载波数字调制技术。OFDM全部载波频率有相等的频率间隔,它们是一个基本振荡频率的整数倍,正交指各个载波的信号频谱是正交的。
      OFDM系统比FDM系统要求的带宽要小得多。由于OFDM使用无干扰正交载波技术,单个载波间无需保护频带,这样使得可用频谱的使用效率更高。另外,OFDM技术可动态分配在子信道中的数据,为获得最大的数据吞吐量,多载波调制器可以智能地分配更多的数据到噪声小的子信道上。目前OFDM技术已被广泛应用于广播式的音频和视频领域以及民用通信系统中,主要的应用包括:非对称的数字用户环线(ADSL)、数字视频广播(DVB)、高清晰度电视(HDTV)、无线局域网(WLAN)和第4代(4G)移动通信系统等。
    时分复用
      时分复用(TDM,Time Division Multiplexing)就是将提供给整个信道传输信息的时间划分成若干时间片(简称时隙),并将这些时隙分配给每一个信号源使用,每一路信号在自己的时隙内独占信道进行数据传输。时分复用技术的特点是时隙事先规划分配好且固定不变,所以有时也叫同步时分复用。其优点是时隙分配固定,便于调节控制,适于数字信息的传输;缺点是当某信号源没有数据传输时,它所对应的信道会出现空闲,而其他繁忙的信道无法占用这个空闲的信道,因此会降低线路的利用率。时分复用技术与频分复用技术一样,有着非常广泛的应用,电话就是其中最经典的例子,此外时分复用技术在广电也同样取得了广泛地应用,如SDH,ATM,IP和HFC网络中CM与CMTS的通信都是利用了时分复用的技术。
    波分复用
      通信是由光来运载信号进行传输的方式。在光通信领域,人们习惯按波长而不是按频率来命名。因此,所谓的波分复用(WDM,Wavelength Division Multiplexing)其本质上也是频分复用而已。WDM是在1根光纤上承载多个波长(信道)系统,将1根光纤转换为多条“虚拟”纤,当然每条虚拟纤独立工作在不同波长上,这样极大地提高了光纤的传输容量。由于WDM系统技术的经济性与有效性,使之成为当前光纤通信网络扩容的主要手段。波分复用技术作为一种系统概念,通常有3种复用方式,即1 310 nm和1 550 nm波长的波分复用、粗波分复用(CWDM,Coarse Wavelength Division Multiplexing)和密集波分复用(DWDM,Dense Wavelength Division Multiplexing)。
      (1)1 310 nm和1 550 nm波长的波分复用
      这种复用技术在20世纪70年代初时仅用两个波长:1 310 nm窗口一个波长,1 550 nm窗口一个波长,利用WDM技术实现单纤双窗口传输,这是最初的波分复用的使用情况。
      (2)粗波分复用
      继在骨干网及长途网络中应用后,波分复用技术也开始在城域网中得到使用,主要指的是粗波分复用技术。CWDM使用1 200~1 700 nm的宽窗口,目前主要应用波长在1 550 nm的系统中,当然1 310 nm波长的波分复用器也在研制之中。粗波分复用(大波长间隔)器相邻信道的间距一般≥20 nm,它的波长数目一般为4波或8波,最多16波。当复用的信道数为16或者更少时,由于CWDM系统采用的DFB激光器不需要冷却,在成本、功耗要求和设备尺寸方面,CWDM系统比DWDM系统更有优势,CWDM越来越广泛地被业界所接受。CWDM无需选择成本昂贵的密集波分解复用器和“光放”EDFA,只需采用便宜的多通道激光收发器作为中继,因而成本大大下降。如今,不少厂家已经能够提供具有2~8个波长的商用CWDM系统,它适合在地理范围不是特别大、数据业务发展不是非常快的城市使用。
      (3)密集波分复用
      密集波分复用技术(DWDM)可以承载8~160个波长,而且随着DWDM技术的不断发展,其分波波数的上限值仍在不断地增长,间隔一般≤1.6 nm,主要应用于长距离传输系统。在所有的DWDM系统中都需要色散补偿技术(克服多波长系统中的非线性失真——四波混频现象)。在16波DWDM系统中,一般采用常规色散补偿光纤来进行补偿,而在40波DWDM系统中,必须采用色散斜率补偿光纤补偿。DWDM能够在同一根光纤中把不同的波长同时进行组合和传输,为了保证有效传输,一根光纤转换为多根虚拟光纤。目前,采用DWDM技术,单根光纤可以传输的数据流量高达400 Gbit/s,随着厂商在每根光纤中加入更多信道,每秒太位的传输速度指日可待。

    码分复用
      分复用(CDM,Code Division Multiplexing)是靠不同的编码来区分各路原始信号的一种复用方式,主要和各种多址技术结合产生了各种接入技术,包括无线和有线接入。例如在多址蜂窝系统中是以信道来区分通信对象的,一个信道只容纳1个用户进行通话,许多同时通话的用户,互相以信道来区分,这就是多址。移动通信系统是一个多信道同时工作的系统,具有广播和大面积覆盖的特点。在移动通信环境的电波覆盖区内,建立用户之间的无线信道连接,是无线多址接入方式,属于多址接入技术。联通CDMA(Code Division Multiple Access)就是码分复用的一种方式,称为码分多址,此外还有频分多址(FDMA)、时分多址(TDMA)和同步码分多址(SCDMA)。
      (1)FDMA
      FDMA频分多址采用调频的多址技术,业务信道在不同的频段分配给不同的用户。FDMA适合大量连续非突发性数据的接入,单纯采用FDMA作为多址接入方式已经很少见。目前中国联通、中国移动所使用的GSM移动电话网就是采用FDMA和TDMA两种方式的结合。
      (2)TDMA时分多址
      TDMA时分多址采用了时分的多址技术,将业务信道在不同的时间段分配给不同的用户。TDMA的优点是频谱利用率高,适合支持多个突发性或低速率数据用户的接入。除中国联通、中国移动所使用的GSM移动电话网采用FDMA和TDMA两种方式的结合外,广电HFC网中的CM与CMTS的通信中也采用了时分多址的接入方式(基于DOCSIS1.0或1.1和Eruo DOCSIS1.0或1.1)。
      (3)CDMA码分多址
      CDMA是采用数字技术的分支——扩频通信技术发展起来的一种崭新而成熟的无线通信技术,它是在FDM和TDM的基础上发展起来的。FDM的特点是信道不独占,而时间资源共享,每一子信道使用的频带互不重叠;TDM的特点是独占时隙,而信道资源共享,每一个子信道使用的时隙不重叠;CDMA的特点是所有子信道在同一时间可以使用整个信道进行数据传输,它在信道与时间资源上均为共享,因此,信道的效率高,系统的容量大。CDMA的技术原理是基于扩频技术,即将需传送的具有一定信号带宽的信息数据用一个带宽远大于信号带宽的高速伪随机码(PN)进行调制,使原数据信号的带宽被扩展,再经载波调制并发送出去;接收端使用完全相同的伪随机码,与接收的带宽信号作相关处理,把宽带信号换成原信息数据的窄带信号即解扩,以实现信息通信。CDMA码分多址技术完全适合现代移动通信网所要求的大容量、高质量、综合业务、软切换等,正受到越来越多的运营商和用户的青睐。
      (4)同步码分多址技术
      同步码分多址(SCDMA,Synchrnous Code Division Multiplexing Access)指伪随机码之间是同步正交的,既可以无线接入也可以有线接入,应用较广泛。广电HFC网中的CM与CMTS的通信中就用到该项技术,例如美国泰立洋公司(Terayon)和北京凯视通电缆电视宽带接入,结合ATDM(高级时分多址)和SCDMA上行信道通信(基于DOCSIS2.0或Eruo DOCSIS2.0)。
      中国第3代移动通信系统也采用同步码分多址技术,它意味着代表所有用户的伪随机码在到达基站时是同步的,由于伪随机码之间的同步正交性,可以有效地消除码间干扰,系统容量方面将得到极大的改善,它的系统容量是其他第3代移动通信标准的4~5倍

    转载于:https://www.cnblogs.com/cyyljw/p/6871946.html

    展开全文
  • 什么是IO多路复用,理解IO多路复用

    千次阅读 多人点赞 2020-04-03 12:18:00
    一、什么是socket? 我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,对我们来说,一切都是文件,一切都是流。在信息 交换的过程中,我们都...

    一、什么是socket?

    我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,对我们来说,一切都是文件,一切都是流。在信息 交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output),往流中读出数据,系统调用read,写入数据,系统调用write。不过话说回来了 ,计算机里有这么多的流,我怎么知道要操作哪个流呢?对,就是文件描述符,即通常所说的fd,一个fd就是一个整数,所以,对这个整数的操作,就是对这个文件(流)的操作。我们创建一个socket,通过系统调用会返回一个文件描述符,那么剩下对socket的操作就会转化为对这个描述符的操作。不能不说这又是一种分层和抽象的思想

    二、阻塞?

    什么是程序的阻塞呢?想象这种情形,比如你等快递,但快递一直没来,你会怎么做?有两种方式:

    • 快递没来,我可以先去睡觉,然后快递来了给我打电话叫我去取就行了。
    • 快递没来,我就不停的给快递打电话说:擦,怎么还没来,给老子快点,直到快递来。

    很显然,你无法忍受第二种方式,不仅耽搁自己的时间,也会让快递很想打你。
    而在计算机世界,这两种情形就对应阻塞和非阻塞忙轮询。

    • 非阻塞忙轮询:数据没来,进程就不停的去检测数据,直到数据来。
    • 阻塞:数据没来,啥都不做,直到数据来了,才进行下一步的处理。

    先说说阻塞,因为一个线程只能处理一个套接字的I/O事件,如果想同时处理多个,可以利用非阻塞忙轮询的方式,伪代码如下:

    while true  
    {  
        for i in stream[]  
        {  
            if i has data  
            read until unavailable  
        }  
    }  


    我们只要把所有流从头到尾查询一遍,就可以处理多个流了,但这样做很不好,因为如果所有的流都没有I/O事件,白白浪费CPU时间片。正如有一位科学家所说,计算机所有的问题都可以增加一个中间层来解决,同样,为了避免这里cpu的空转,我们不让这个线程亲自去检查流中是否有事件,而是引进了一个代理(一开始是select,后来是poll),这个代理很牛,它可以同时观察许多流的I/O事件,如果没有事件,代理就阻塞,线程就不会挨个挨个去轮询了,伪代码如下:

    while true  
    {  
        select(streams[]) //这一步死在这里,知道有一个流有I/O事件时,才往下执行  
        for i in streams[]  
        {  
            if i has data  
            read until unavailable  
        }  
    }  

     

    但是依然有个问题,我们从select那里仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。

    epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))伪代码如下:

    while true  
    {  
        active_stream[] = epoll_wait(epollfd)  
        for i in active_stream[]  
        {  
            read or write till  
        }  
    }  

     

    可以看到,select和epoll最大的区别就是:select只是告诉你一定数目的流有事件了,至于哪个流有事件,还得你一个一个地去轮询,而epoll会把发生的事件告诉你,通过发生的事件,就自然而然定位到哪个流了。不能不说epoll跟select相比,是质的飞跃,我觉得这也是一种牺牲空间,换取时间的思想,毕竟现在硬件越来越便宜了。

    三、I/O多路复用

    好了,我们讲了这么多,再来总结一下,到底什么是I/O多路复用。
    先讲一下I/O模型:
    首先,输入操作一般包含两个步骤:

    1. 等待数据准备好(waiting for data to be ready)。对于一个套接口上的操作,这一步骤关系到数据从网络到达,并将其复制到内核的某个缓冲区。
    2. 将数据从内核缓冲区复制到进程缓冲区(copying the data from the kernel to the process)。

    其次了解一下常用的3种I/O模型:

    1、阻塞I/O模型

    最广泛的模型是阻塞I/O模型,默认情况下,所有套接口都是阻塞的。 进程调用recvfrom系统调用,整个过程是阻塞的,直到数据复制到进程缓冲区时才返回(当然,系统调用被中断也会返回)。

    2、非阻塞I/O模型

    当我们把一个套接口设置为非阻塞时,就是在告诉内核,当请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。当数据没有准备好时,内核立即返回EWOULDBLOCK错误,第四次调用系统调用时,数据已经存在,这时将数据复制到进程缓冲区中。这其中有一个操作时轮询(polling)。

    3、I/O复用模型

    此模型用到select和poll函数,这两个函数也会使进程阻塞,select先阻塞,有活动套接字才返回,但是和阻塞I/O不同的是,这两个函数可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写(就是监听多个socket)。select被调用后,进程会被阻塞,内核监视所有select负责的socket,当有任何一个socket的数据准备好了,select就会返回套接字可读,我们就可以调用recvfrom处理数据。
    正因为阻塞I/O只能阻塞一个I/O操作,而I/O复用模型能够阻塞多个I/O操作,所以才叫做多路复用。

     

    4、信号驱动I/O模型(signal driven I/O, SIGIO)

      首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让它来读取数据报。无论如何处理SIGIO信号,这种模型的优势在于等待数据报到达(第一阶段)期间,进程可以继续执行,不被阻塞。免去了select的阻塞与轮询,当有活跃套接字时,由注册的handler处理。

     

    5、异步I/O模型(AIO, asynchronous I/O)

      进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。

      这个模型工作机制是:告诉内核启动某个操作,并让内核在整个操作(包括第二阶段,即将数据从内核拷贝到进程缓冲区中)完成后通知我们。

    这种模型和前一种模型区别在于:信号驱动I/O是由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。

    展开全文
  • 白话IO多路复用 这里引述知乎大佬对于IO多路复用的机场空管的比喻和理解: 假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接...
  • 使用C语言实现的io多路复用http服务器的一个简单例子,可以显示简单的图片文字等,内含makefile,所用到的图片和html,编译运行即可
  • I/O复用到底是什么意思

    千次阅读 2017-08-18 12:27:01
    问 epoll  网络编程   jql09 2016年03月05日提问 · 2016年03月06日更新 关注 6 关注 收藏 3 收藏,1.4k 浏览 ...UNP网络编程中,有I/O复用
  • 什么叫做引脚复用

    千次阅读 2019-02-25 14:08:03
    问:什么叫做引脚复用? 答:STM32芯片内部有很多外设,这些外设的引脚都是与IO口复用的。也就是说,一个IO口如果可以复用为内置外设的功能引脚,那么当这个IO口作为内外设使用的时候,就叫做复用。 ...
  • 我发现很多人在面试的时候,都会被问道关于什么select、poll、epoll的问题,但是多路复用IO这...一、什么是IO操作 我们都知道在Unix环境下,一切皆文件,而文件就是一串二进制流。在信息 交换的过程中,我们都是对这...
  • 同步时分复用和异步时分复用

    千次阅读 2019-12-08 21:44:49
    时分复用 ** 对于一条TDM链路,时间被划分为固定区间的帧,并且每帧又被划分为固定数量的时隙。当网络跨越一条链路创建一条连接时,网络在每个帧中为该连接指定个时隙。这些时隙专门由该连接单独使用,一个时隙( 在...
  • 多址复用技术详解——空分复用、频分复用、时分复用、码分复用 空中接口的频率对于运营商而言是最重要的战略资源。在中国,无线频谱资源是由政府直接分配给运营商;在欧洲很多国家,运营商的频谱资源通过拍卖...
  • DDR复用,CPU复用视频,非常好用,一看就懂,讲得非常的详细非常的好,确实是一个好资料哦,大家可以看看
  • 详详解解Python IO 口口多多路路复复用用 这篇文章主要介绍了Python IO 口多路复用的的相关资料文中讲解的非常细致帮助大家更好的理解和学习 兴趣的朋友可以参考下 什什么么是是IO 多多路路复复用用呢呢 我一个...
  • 什么是码分复用

    万次阅读 2018-04-27 10:47:10
    就是给用户M bit(位)码片,然后并且给所有的...码分复用需要发送的数据量为原先的 m 倍。因为本来可以发1、0、-1来表示用户发送的数据0和1以及其他用户发送的数据,现在需要用m位来表示用户和其他用户发送的数据;
  • 复用的概念就是将不同的信道合并为一个共享信道,在发送端使用一个复用器,让大家使用同一个信道传输信息,接收端使用一个分用器,将合起来传输的信息分别送入相应的终点。 如下图所示 1.频分复用FDM(Frequency ...
  • STM32中功能复用重映射是什么意思

    千次阅读 2016-10-19 16:01:31
    就是IO口可以有多种用途,比如可以作为普通的输入输出口使用,也可以作为PWM通道使用,还有DAC通道等, 但需要相应的配置。I/O口不可以同时进行这三个功能的使用,只能是配置为什么功能使用相应的功能。
  • 通信技术之复用与解复用

    千次阅读 2018-09-16 10:43:59
    想像一下,如果一条信道一次只能传输一条信息,那么对于海量的信息来说,传输的速度未免太慢了,因此,我们想要一根线上传送多路信号,复用技术就应运而生了。 在上一篇博客中,我们知道了PCM编码的位数是8,抽样...
  • 1. 首先来说说什么是信道复用 信道复用,顾名思义,就是把多个用户使用的信道合并在一条信道,即一条信道承载着多个用户传输数据的任务; ps:信道:数据信息传输的媒介 2.信道复用的必要性 对于广域网传输中的信道...
  • 时分复用共享 时分复用是指当多个程序或用户想要使用同一个资源时而采取的策略。每个程序或用户需要按照一定的顺序依次使用这个资源。 例子——CPU CPU的时间片就是时分复用的体现。多个程序在cpu中以一段时间间隔内...
  • 7、合成复用原则(Composite Reuse Principle) 合成复用原则就是在一个新的对象里通过关联关系(组合关系、聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用...
  • 文章目录时分复用TDM存在的问题频分复用FDM与波分复用WDM关系码分多址的原理(CDMA)ADSL含义,采用什么复用形式 时分复用TDM存在的问题 频分复用FDM与波分复用WDM关系 码分多址的原理(CDMA) 码分多址(CDMA)的...
  • 传输层的复用和解复用

    千次阅读 2017-06-10 21:37:41
    复用和解复用 将端到端的网络层协议扩展到进程到进程的传输层协议称为复用和解复用复用和解复用是所有计算机网络都需要的 在目的端主机上,传输层将段中的数据传送给相应的进程中。一个进程可以有一个或多个...
  • 关于Vue的就地复用

    千次阅读 2019-08-08 16:58:46
    关于Vue的就地复用 这是第一次使用博客,就是想来记录一下自己碰到的一些问题以及解决方法,各位看官随意。 之前做项目的时候,要求对elementui的表格做拖拽排序,拖拽要做成只能通过拖拽最后一列的标记才能够拖动...
  • 问: 什么是信道复用. 在回答这个问题之前先看这样一个场景: 其中u1u2是两个用户, 如果这两个用户之间连通的信道在他们使用过程中, 被他们完全占用了, 其他人就只能等着了. 那有人说了, 那就多架设信道不就好了. ...
  • 信号复用技术

    千次阅读 2019-12-02 09:01:39
    在传输介质连接起来不同的通信设备之后,为了**提高传输的效率**,经常会采用复用的技术 复用是允许同时通过一条数据链路传输多个信号的技术。 在复用系统中,N个设备共享一条链路。复用器(MUX)在 发送端将多路...
  • HTML的复用技巧

    2020-09-28 08:15:29
    在面向对象软件开发的时候,我们经常提到“复用”,很好地复用代码不仅可以大大提高开发效率,同时使得代码更易于维护。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 706,802
精华内容 282,720
关键字:

复用是什么