精华内容
下载资源
问答
  • IO 多路复用是什么意思? 转自:https://www.zhihu.com/question/32163005 1 IO 多路复用是什么意思? - 罗志宇的回答 - 知乎 https://www.zhihu.com/question/32163005/answer/55772739 这个还是很好说清楚的。 ...

    IO 多路复用是什么意思?

    转自: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多路复用是什么意思,在实际的应用中是指什么情况? 以及IO多路复用在一些异步web server中的实际应用,就好比nginx是怎样使用epoll来实现异步IO处理的,一个请求到来了,nginx使用epoll接收请求的过程是怎样的.....

    提问一:

    Linux IO多路复用有 epoll, poll, select,知道epoll性能比其他几者要好。也在网上查了一下这几者的区别,表示没有弄明白。

    IO多路复用是什么意思,在实际的应用中是指什么情况?

    以及IO多路复用在一些异步web server中的实际应用,就好比nginx是怎样使用epoll来实现异步IO处理的,一个请求到来了,nginx使用epoll接收请求的过程是怎样的?

    回答1

    作者:罗志宇

    这个还是很好说清楚的。

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

    你会怎么做?

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

    那么问题就来了:

    • 很快你就发现空管塔里面聚集起来一大票的空管员,交通稍微繁忙一点,新的空管员就已经挤不进来了。
    • 空管员之间需要协调,屋子里面就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我可以直接去撞墙了

    回答2:

    要弄清问题 先要知道问题的出现原因

    原因:

    由于进程的执行过程是线性的(也就是顺序执行),当我们调用低速系统I/O(read,write,accept等等),进程可能阻塞,此时进程就阻塞在这个调用上,不能执行其他操作。阻塞很正常。 接下来考虑这么一个问题:

    一个服务器进程和一个客户端进程通信,服务器端read(sockfd1,bud,bufsize),此时客户端进程没有发送数据,那么read(阻塞调用)将阻塞直到客户端调用write(sockfd,but,size)发来数据。 在一个客户和服务器通信时这没什么问题,当多个客户与服务器通信时,若服务器阻塞于其中一个客户sockfd1,当另一个客户的数据到达套接字sockfd2时,服务器不能处理,仍然阻塞在read(sockfd1。。。)上;此时问题就出现了,不能及时处理另一个客户的服务,咋么办?I/O多路复用来解决!

    I/O多路复用:

    继续上面的问题,有多个客户连接,sockfd1,sockfd2,sockfd3。。sockfdn同时监听这n个客户,当其中有一个发来消息时就从select的阻塞中返回,然后就调用read读取收到消息的sockfd,然后又循环回select阻塞;

    这样就不会因为阻塞在其中一个上而不能处理另一个客户的消息

     

     

    提问二:I/O复用 与 连接池 的区别

    答主你好,看你的回答好犀利,我菜鸟一个好多概念搞不清楚,想请教你一些。I/O复用是不是用跟各种池一起用的?比如线程池,socket连接池哪些。最困扰的一个问题是一个线程池或socket连接池里面的诸多线程、socket如何利用一个端口与多个端进行通信的呢?还有您能不能能说一下一个socket连接池里面的诸多socket有何不同啊,是不是就只是目的IP和目的端口的区别?万谢!!!

    回答1:

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

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

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

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

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

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

     

     

     

    摘自:

    http://www.zhihu.com/question/32163005

    展开全文
  • 天真的我以为多路复用是redis实现的技术. 今天才发现, 我被自己骗了, 多路复用是系统来实现的. 对不起自己的专业了. 为了引出多路复用, 我来大胆设想一下技术的发展路程. 前提 一个应用程序, 想对外提供服务, 一般...

    有没有人和我一样, 自打知道了redis, 就一直听说什么redis单线程, 使用了多路复用等等. 天真的我以为多路复用是redis实现的技术. 今天才发现, 我被自己骗了, 多路复用是系统来实现的. 对不起自己的专业了.

    为了引出多路复用, 我来大胆设想一下技术的发展路程.

    前提

    一个应用程序, 想对外提供服务, 一般都是通过建立套接字监听端口来实现, 也就是socket. 在这个时候, 应用对外提供服务的过程大概是这样.

    1. 创建套接字
    2. 绑定端口号
    3. 开始监听
    4. 当监听到连接时, 调用系统read去读取内容, 但是读取操作是阻塞的(也就是说,如果主线程处理read,就不能接收其他连接了, 所以只能开新的线程去处理这个事情)

    画个丑丑的流程图:

    在这里插入图片描述

    问题分析

    这个流程的问题很明显, 会不停的创建线程, 当然, 可以维护一个线程池. 但是线程之间的不停切换也是消耗资源的. 而且也不可能无限的创建线程. 那我如果想一个线程处理呢? 从上面流程图能看的出来, 问题出在阻塞上面. 如果read操作可以立刻返回结果, 如果没有读到数据, 就可以继续处理后边的事情了.

    简版

    整个简单版本. 主线程维护一个所有连接的列表, 每次循环读取所有列表, 有数据就处理, 没有就跳过.

    1. 创建套接字
    2. 绑定端口号
    3. 开始监听
    4. 监听到连接, 将连接加到连接列表中, 循环读取连接列表中的所有连接, 对有数据的进行处理

    画个丑图:

    在这里插入图片描述

    问题分析

    现在这样处理貌似是比开线程要好一些了, 但是事实是这样么? 众所周知, 其中的read操作是调用系统函数, 简单说就是要进行进程的切换, 从用户进程切换到系统进程. 连接少还好, 如果有十万个连接, 甚至更多呢? 每次循环都会频繁的调用系统函数, 可能十万次调用, 甚至其中有数据的只有一次, 其余调用都白掉了. 这无疑降低了性能.

    其实解决方法说起来也很容易想到. 问题出在系统调用上, 频繁的系统调用导致了问题的出现. 如果能够一次性将需要查询的所有数据都发给系统, 让系统进行查询, 那不就只需要一次切换就可以了么?.

    select版本

    为了解决上面的问题. 可以批量将待查询的连接发给系统. 出现了select, 这就是说的 多路复用 了. 在系统 中, 无论是监听端口还是建立了连接, 程序拿到的都是一个文件描述符, 将这些文件描述符批量查询就是了.

    直接上丑图:

    在这里插入图片描述

    这里和上一个版本相比, 将循环检查交到了系统去做, 只发生一次进程的切换. select 简单说, 就是你告诉系统, 你需要哪些数据, 你同帮你遍历找找, 然后将结果返回给你.

    问题分析

    这样确实要好上一些, 但是上面的问题还没有完全解决. 比如有10万个连接, 其中有数据的只有一个, 那就回有9999次无效的操作, 虽然这些无效的操作是由系统做的, 但不一样么, 系统做的无效操作, 你应用程序也得等着啊. 而且每次查询都要把所有的需要的都传过去, 10万个就要传10万了, 蓝瘦.

    问题出在哪呢? 需要循环遍历, 是因为不知道哪些连接是有数据的, 所以只能一个一个的看. 如果可以不 需要遍历, 直接知道哪些连接是有数据的, 然后直接拿到数据返回就好了.

    epoll

    跟上一个版本相比, 现在不通过批量查询的方式了, 而是通过回调的方式. 简单说, 建立一个需要回调的连接, 将需要监听的文件描述符都扔给他, 当有新数据到达时, 会返回给你.

    上丑图:

    在这里插入图片描述

    看着是不是有点晕了? 其实它和select版本的区别简单来说, epoll是将你需要监听的列表交给系统维护, 这样当有新数据来的时候, 系统知道这是你要的, 等你下次来拿的时候, 直接给你了, 少去了上面的系统遍历. 同时, 也没有select查询时那一大堆参数, 每次都只调用一次进行绑定即可.

    那系统是怎么知道新数据的到来呢? 这里靠的是事件中断, 忘得差不多了, 回头再看看.

    epoll 简单说就是, 你告诉系统, 你需要哪些数据, 然后等着, 有数据了系统就通知你, 然后你去读.


    以上select, epoll是两种多路复用的技术, 当然, 还有多路复用还有其他的.

    据说redis的多路复用对系统方法进行了封装, 不过我还没看, 再议!!!

    展开全文
  • 什么是频分多路复用(FDM) “复用一种将若干个彼此独立的信号,合并为一个可在同一信道上同时传输的复合信号的方法。比如,传输的语音信号的频谱一般在300~3400Hz内,为了使若干个这种信号能在同一信道上传输,...

      什么是频分多路复用(FDM)

      “复用”是一种将若干个彼此独立的信号,合并为一个可在同一信道上同时传输的复合信号的方法。比如,传输的语音信号的频谱一般在300~3400Hz内,为了使若干个这种信号能在同一信道上传输,可以把它们的频谱调制到不同的频段,合并在一起而不致相互影响,并能在接收端彼此分离开来。

      有三种基本的多路复用方式:频分复用(FDM)、时分复用(TDM)与码分复用(CDM)。按频率区分信号的方法叫频分复用,按时间区分信号的方法叫时分复用,而按扩频码区分信号的方式称为码分复用。

      频分复用的目的在于提高频带利用率。通常,在通信系统中,信道所能提供的带宽往往要比传送一路信号所需的带宽宽得多。因此,一个信道只传输一路信号是非常浪费的。为了充分利用信道的带宽,因而提出了信道的频分复用问题。图1示出了一个频分复用电话系统的组成框图。图中,复用的信号共有 路,每路信号首先通过低通滤波器(LPF),以限制各路信号的最高频率 。为简单起见,无妨设各路的 都相等。例如,若各路都是话音信号,则每路信号的最高频率皆为3400Hz。然后,各路信号通过各自的调制器进行频谱搬移。调制器的电路一般是相同的,但所用的载波频率不同。调制的方式原则上可任意选择,但最常用的是单边带调制,因为它最节省频带。因此,图中的调制器由相乘器和边带滤波器(SBF)构成。在选择载频时,既应考虑到边带频谱的宽度,还应留有一定的防护频带 ,以防止邻路信号间相互干扰,即

    9f77b96b52fcb01c31dadd0e14fe3511.png

      式中, 和 分别为第 路和第( +1)路的载波频率。显然,邻路间隔防护频带越大,对边带滤波器的技术要求越低。但这时占用的总频带要加宽,这对提高信道复用率不利。因此,实际中应尽量提高边带滤波技术,以使 尽量缩小。目前,按CCITT标准,防护频带间隔应为900Hz。

    c421282f6b21fe0d8e41ec07535cab99.png

      经过调制的各路信号,在频率位置上就被分开了。因此,可以通过相加器将它们合并成适合信道内传输的复用信号,其频谱结构如图2所示。图中,各路信号具有相同的fm ,但它们的频谱结构可能不同。 n路单边带信号的总频带宽度为

    301b7df768a5f6fc65b1cb9f7dbe558e.png

    9f578594506ebf1829e284f86b40cded.png

      合并后的复用信号,原则上可以在信道中传输,但有时为了更好地利用信道的传输特性,还可以再进行一次调制。

      在接收端,可利用相应的带通滤波器(BPF)来区分开各路信号的频谱。然后,再通过各自的相干解调器便可恢复各路调制信号。

      频分复用系统的最大优点是信道复用率高,容许复用的路数多,分路也很方便。因此,它成为目前模拟通信中最主要的一种复用方式。特别是在有线和微波通信系统中应用十分广泛。频分复用系统的主要缺点是设备生产比较复杂,会因滤波器件特性不够理想和信道内存在非线性而产生路间干扰。

    展开全文
  • 软件复用是什么意思

    千次阅读 2007-05-31 20:58:00
    软件复用是将已有的软件及其有效成分用于构造新的软件或系统。它不仅是对软件程序的复用,还包括对软件生产过程中其它劳动成果的复用,如项目计划书、可行性报告、需求分析、概要设计、详细设计、编码(源程序)、测试...
  • Linux IO 多路复用是什么意思?

    千次阅读 2016-04-10 16:56:59
    再次向作者表示感谢~~假设你一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接乘客。你会怎么做? 那么问题就来了: 很快你就发现空管塔...
  • 著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处...假设你一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接乘客。
  • 软件复用是将已有的软件及其有效成分用于构造新的软件或系统。它不仅是对软件程序的复用,还包括对软件生产过程中其它劳动成果的复用,如项目计划书、可行性报告、需求分析、概要设计、详细设计、编码(源程序)、...
  • 什么是IO多路复用

    2021-01-06 17:21:31
    先百度或者知乎,找到这篇文章 [1]IO 多路复用是什么意思? 文中提到:   第一种好理解,就是来一个请求,fork一个进程,第二种提到I/O多路复用使用单个线程实现的,作者肯定没有写错,因为后面的文章也都是...
  • 信道复用频分复用 频分复用(FDM,Frequency Division Multiplexing)就是将用于传输信道的总带宽划分成若干个子频带(或称子信道),每一个子信道传输1路信号。...频分复用技术的特点所有子信道传输的信号以...
  • 什么是I/O多路复用

    2021-01-23 17:16:10
    IO多路复用是什么? 回答: I/O多路复用,我觉得其实是一种机制,相比于之前的多进程,多线程来处理连接请求后的相关操作,I/O多路复用则可以一个进程或者一个线程去完成对这些I/O请求的操作,使得内核一旦发现进程...
  • WDM承载方案有粗波分复用(CWDM)、密集波分复用(DWDM...而LWDM基于以太网通道的波分复用Lan-WDM技术,也被称为细波分复用。其通道间隔为200~800GHz,此范围介于DWDM(100GHz、50GHz)和CWDM(约3THz)之间。LWD...
  • 详详解解Python IO 口口多多路路复复用用 这篇文章主要介绍了Python IO 口多路复用的的相关资料文中讲解的非常细致帮助大家更好的理解和学习 兴趣的朋友可以参考下 什什么是是IO 多多路路复复用用呢呢 我一个...
  • WDM波分复用技术5G前传网络的优选方案,根据使用波长的不同,可分为DWDM密集波分复用,CWDM粗波分复用,以及新提出的MWDM中等波分复用,基于以太网通道的LWDM波分复用。 早期的时候,技术条件有限,波长间隔会控制...
  • 什么是多路复用IO

    2021-01-14 14:13:49
    在redis,nginx等软件中,都提到了多路复用IO模型,那么什么是多路复用IO? 解答 多路复用IO,在linux系统中内核处理程序网络IO的一种方式; linux系统中使用,查看系统调用命令 # 安装系统调用命令描述手册 yum ...
  • 5G商用,承载先行。5G新基建的大范围建设,也...CWDM和DWDM都已经较为常见的WDM波分复用技术,那么什么是MWDM呢? MWDM英文Metro Wave Division Multiplexing,即为中等波分复用。要了解什么是MWDM,首先需要知道为
  • 什么是combo复用

    2016-03-02 17:33:26
    Combo接口又叫光电复用接口,由设备面板上的两个以太网口(一个光口和一个电口)组成。Combo电口与其对应的光口在逻辑上光电复用的,用户可根据实际组网情况选择其中的一个使用,但两者不能同时工作。...
  • 学习笔记(简单概念介绍)什么是buffer? 首先Buffer一个对象 它包含一些要写入或者要读出的数据。Buffer api 参考地址 https://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html什么是channel?Channel ...
  • 语音复用设备一种小容量、多业务的复用及传输设备,它能为用户提供综合的通信功能,满足用户对电话、数据以及计算机网络连接的实际需要。它的多种传输方式使其能灵活的应用在各种通信网络中:可以作为光电一体化...
  • 什么是多路复用

    千次阅读 2016-03-31 09:00:25
    数据通信系统或计算机网络系统中,传输媒体的带宽或容量往往会大于传输单一信号的需求,为了有效地利用通信线路,希望一个信道同时传输多路信号,这就是所谓的多路复用技术(Multiplexing)。采用多路复用技术能把多个...
  • 什么是码分复用

    万次阅读 2018-04-27 10:47:10
    就是给用户M bit(位)码片,然后并且给所有的码片正交,对于任意两个不同的两个码片都有设M为8 ,设该码片 S 为00011011, 拥有该码片的用户发送1时就发送00011011,当用户发送0就取反发送11100100,内积计算...
  • WDM波分复用什么是C波段、L波段?

    千次阅读 2020-06-29 11:16:52
    WDM波分复用是光纤通信中利用一根光纤同时传输多个不同波长的光载波的传输技术。光的波长不同,在光纤中的传输损耗就不同。为了尽可能减少损耗,保证传输效果,需要找寻到最为适合传输的波长。经过长时间摸索和测试...
  • I/O 多路复用技术为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用。 select(),poll(),epoll()都I/O多路复用的机制。I/O多路复用通过一种机制,可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,426
精华内容 5,370
关键字:

复用是什么