精华内容
下载资源
问答
  • Linux下socket多路复用应用--select函数

    千次阅读 2017-07-25 18:44:45
    Linux下socket多路复用应用--select函数 Select系统调用是用来让我们的程序监视多个文件描述符(file descriptor)的状态变化的。程序会停在select这里等待,直到被监视的文件描述符有某一个或多个发生了状态改变。...

    Linux下socket多路复用应用--select函数

    Select系统调用是用来让我们的程序监视多个文件描述符(file descriptor)的状态变化的。程序会停在select这里等待,直到被监视的文件描述符有某一个或多个发生了状态改变。

    文件描述符在Linux里有很多,如果你man某个函数,在函数返回值部分说到成功后有一个文件描述符被创建,如man socket可以看到“On success,a file descriptor for the new socket is returned.”而man 2 open可以看到“open() and create() return the new file descriptor”,其实文件描述符就是一个整数,看socket函数的声明就明白了:

    Int socket(int domain, int type,int protocol);

     

     

    当然,我们最熟悉的文件描述符是0,1,2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE*结构的表示就是stdin、stdout、stderr,0就是stdin,1就是stdout,2就是stderr。

    select()的机制中提供一种fd_set的数据结构,实际上是一个long类型的数组,每一个数组元素都能与一个打开的文件描述符(不管是socket,还是其他文件或命名管道或设备描述符)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select的进程哪一个socket或文件可读。

    非阻塞式I/O编程有两个特点:

    1.如果一个发现I/O有输入,读取的过程中,另外一个也有了输入,这时候不会产生任何反应。这就需要你的程序语句去用到select函数的时候才知道有数据输入。

    2.程序调用select的时候,如果没有数据输入,程序会一直等待,直到有数据为止,也就是程序中无需循环和sleep。

    select在socket编程中还是比较重要的,可是对于初学socket的人来说都不太爱用select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓非阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果某个事件没有发生,进程或线程就被阻塞,函数不能立即返回)。

    可是使用select就可以完成非阻塞(所谓非阻塞方式non_block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映此函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生,则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况--读写或是异常。

     

    Select函数介绍

    函数名:select

    头文件:#include<sys/types.h>

    #include<syss/times.h>

    #include<sys/select.h>

    函数原型:int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout);

    函数功能:检测文件状态变化

    参数说明:1.ndfs:select监视的文件描述符数,视进程中打开文的文件数而定,一般设定为你要监视各文件中最大文件号加一。

              2.readfds:select监视的可读文件描述符集合。

      3.writefds:select监视的可写文件描述符集合。

      4.exceptfds:select监视的异常文件描述符集合。

      5.timeout:本次select()的超时结束时间。(见/usr/sys/select.h)

      struct timeval

      {

    long tv_sec; //秒

    long tv_unsec; //微秒

      };(可精确至百万分之一秒)

    函数返回值:成功时,返回准备就绪的描述符数,若超时则返回0,失败则返回-1。

     

    我们在程序中药申明几个fd_set类型的变量,比如rdfds,wtfds,exfds,然后把这个变量的地址&rdfds,&wtfds,&exfds传递给select函数。这三个参数都是一个描述符的集合,第一个rdfds是用来保存这样的描述符的:当描述符的状态变成可读的时系统就会告诉select函数返回,同理第二个wtfds是指有描述符状态变成可写是系统就会告诉select函数返回,同理第三个参数exfds是特殊情况,即描述符有特殊情况发生时系统就会告诉select函数返回。对socket编程有用的就是readfds。

    几个相关的宏解释如下:

    FD_ZERO(fd_set* fdset):清空fdset与所有文件描述符的联系。

    FD_SET(int fd,fd_set* fdset):建立文件描述符fd与fdset的联系。

    FD_CLR(int fd,fd_set* fdset):清除文件描述符fd和fdset的联系。

    FD_ISSET(int fd,fd_set* fdset):检查fdset联系的文件描述符fd是否可读写,当>0表示可读写。

    (关于fd_set及相关宏的定义见/usr/include/sys/types.h)。

    特殊情况比如对方通过一个socket描述符发来了紧急数据。如果我们程序里只是想检测某个socket是否有数据可读,我们可以这样:

     

    fd_set rdfds; //先声明一个fd_set集合来保护我们要检测的socket描述符

    struct timeval tv; //声明一个时间变量来保存时间

    int ret; //保存返回值

    FD_ZERO(&rdfds); //用select函数之前先把集合清零

    FD_SET(socket,&fdfds); //把要检测的描述符socket加入到集合里

    tv.tv_sec = 1;

    tv.tv_usec = 500; //设置select等待的最大时间为1秒加500毫秒

    ret = select(socket+1,&rdfds,NULL,NULL,&tv); //检测我们上面设置到集合rdfds里的描述符是否有可读信息

    If(ret < 0 )perror(“select”); //这说明select函数出错

    else if(ret == 0)printf(“超时\n”); //说明在我们设定的时间值1秒加500毫秒内,socket的状态没有发生变化

    else //说明等待时间内,socket的状态发生了变化

    {

    printf(“ret = %d\n”,ret); //ret这个返回值记录了发生状态变化的描述符的数目,由于这里我们只监视了socket这一个描述符,所以这里一定ret == 1,如果同时有多个描述符发生变化返回的就是描述符的总和了

    //这里我们就可以从socket这个描述符里读取数据了,因为select函数已经告诉我们这个描述符里有数据可读

    if(FD_ISSET(socket,&rdfds)) //先判断一下socket这被监视的描述符是否真的变成可读的了

    {

    recv() ;  //读取socket描述符里的数据

    }

    }

     

    注意:select函数的第一个参数,是所有加入集合的描述符值得最大那个值还要加1。比如我们创建了3个描述符:

    int sa,sb,sc;

    sa = socket(...);

    connect(sa,...);

    sb = socket(...);

    connect(sb,...);

    sc = socket(...);

    connect(sc,...);

    FD_SET(sa,&rdfds);

    FD_SET(sb,&rdfds);

    FD_SET(sc,&rdfds);

    在使用select函数之前,一定要找到3个描述符的最大值,我们一般定义一个变量来保存最大值,取得最大socket值,算法就不用说了吧,求三个数的最大值就OK了。定义最大值变量int maxfd = 0;

    。。。

    ret = select(maxfd+1,&rdfds,NULL,NULL,&tv);

    同样的道理,如果我们要检测用户是否按了键盘进行输入,我们就应该把标准输入0这个描述符放到select里来检测,如下:

    FD_ZERO(&rdfds);

    FD_SET(0,&rdfds);

    tv.tv_sec = 1;

    tv.tv_usec = 0;

    ret = select(1,&rdfds,NULL,NULL,&tv); //注意最大值还要加1

    if(ret < 0)

    perror(“select”);

    else if(ret == 0)

    printf(“超时\n”);

    else

    scanf(“%s”,buf);

     

    Ok,用法已经讲的很明白了吧,接下来就是select的具体应用了,如果有兴趣的到时候可以看一下我的“TCP套接字编程实例(三)”,里面讲了利用select和TCP套接字实现异步通讯聊天。

    展开全文
  • 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.简介希望通过这...

    I/O多路复用机制

    1.简介

    希望通过这篇文章,可以回答以下几个问题?

    1. 为什么需要IO多路复用?
    2. 什么是IO多路复用机制?
    3. IO多路复用的机制该怎么使用?
    4. epoll比select/poll相比,优势在哪里?

    在了解I/O多路复用之前,先来了解的概念。

    1.1流的概念

    一个流可以文件、socket、pipe等可以进行IO操作的内核对象。不管是文件,还是套接字,还是管道,我们都可以把他们看作流。

    中读取数据或者写入数据到流中,可能存在这样的情况:读取数据时,流中还没有数据;写入数据时,流中数据已经满了,没有空间写入了。典型的例子为客户端要从socket流中读入数据,但是服务器还没有把数据准备好。此时有两种处理办法:

    • 阻塞,等待数据准备好了,再读取出来返回;
    • 非阻塞,通过轮询的方式,查询是否有数据可以读取,直到把数据读取返回。

    接下来再来了解以下I/O同步、异步、阻塞、非阻塞的概念。

    1.2 I/O同步、异步、阻塞、非阻塞

    在IO操作过程中,可能会涉及到同步(synchronous)、异步(asynchronous)、阻塞(blocking)、非阻塞(non-blocking)、IO多路复用(IO multiplexing)等概念。他们之间的区别是什么呢?

    以网络IO为例,在IO操作过程会涉及到两个对象:

    • 一个是调用这个IO的process (or thread);
    • 另外一个是一个就是系统内核(kernel)。

    在一个IO操作过程中,以read为例,会涉及到两个过程:

    1. 等待数据准备好(Waiting for the data to be ready);
    2. 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)

    这两个阶段是否发生阻塞,将产生不同的效果。

    阻塞VS非阻塞

    阻塞IO:

    • 在1、2阶段都发生阻塞;
    • 调用阻塞IO会一直block住进程,直到操作完成;

    非阻塞IO:

    • 在第1阶段没有阻塞,在第2阶段发生阻塞;
    • 调用非阻塞IO会在kernel准备数据的情况下立即返回;
    • 非阻塞IO需要不断轮询,查看数据是否已经准备好了;

    阻塞与非阻塞可以简单理解为调用一个IO操作能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了;否则就可以理解为非阻塞。

    同步VS异步

    同步IO:

    同步IO操作将导致请求的进程一直被blocked,直到IO操作完成。从这个层次来,阻塞IO、非阻塞IO操作、IO多路复用都是同步IO。

    异步IO:

    异步IO操作不会导致请求的进程被blocked。当发出IO操作请求,直接返回,等待IO操作完成后,再通知调用进程。

    多路复用IO

    多路复用IO也是阻塞IO,只是阻塞的方法是select/poll/epoll。select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理是select/epoll这个函数会不断轮询所负责的IO操作,当某个IO操作有数据到达时,就通知用户进程。然后由用户进程去操作IO。比较详细的介绍可以参考:
    IO-同步,异步,阻塞,非阻塞网络IO之阻塞、非阻塞、同步、异步总结

    1.3 多路复用概念

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

    阻塞I/O有一个比较明显的缺点是在I/O阻塞模式下,一个线程只能处理一个流的I/O事件。如果想要同时处理多个流,需要多个进程或者多个线程,但是这种方式效率不高。

    非阻塞的I/O需要轮询查看流是否已经准备好了,比较典型的方式是忙轮询

    忙轮询
    忙轮询方式是通过不停的把所有的流从头到尾轮询一遍,查询是否有流已经准备就绪,然后又从头开始。如果所有流都没有准备就绪,那么只会白白浪费CPU时间。轮询过程可以参照如下:

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

    无差别的轮询方式
    为了避免白白浪费CPU时间,我们采用另外一种轮询方式,无差别的轮询方式。即通过引进一个代理,这个代理为select/poll,这个代理可以同时观察多个流的I/O事件。当所有的流都没有准备就绪时,会把当前线程阻塞掉;当有一个或多个流的I/O事件就绪时,就从阻塞状态中醒来,然后轮询一遍所有的流,处理已经准备好的I/O事件。轮询的过程可以参照如下:

    while true {
        select(streams[])
        for i in streams[] {
            if i has data
                  read until unavailable
        }
    }
    

    如果I/O事件准备就绪,那么我们的程序就会阻塞在select处。我们通过select那里只是知道了有I/O事件准备好了,但不知道具体是哪几个流(可能有一个,也可能有多个),所以需要无差别的轮询所有的流,找出已经准备就绪的流。可以看到,使用select时,我们需要O(n)的时间复杂度来处理流,处理的流越多,消耗的时间也就越多。

    最小轮询方式

    无差别的轮询方式有一个缺点就是,随着监控的流越来越多,需要轮询的时间也会随之增加,效率也会随之降低。所以还有另外一种轮询方式,最小轮询方式,即通过epoll方式来观察多个流,epoll只会把发生了I/O事件的流通知我们,我们对这些流的操作都是有意义的,时间复杂度降低到O(k),其中k为产生I/O事件的流个数。轮询的过程如下:

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

    select/poll/epoll都是采用I/O多路复用机制的,其中select/poll是采用无差别轮询方式,而epoll是采用最小的轮询方式。

    1.4 I/O复用的优势

    I/O多路复用的优势并不是对于单个连接能处理的更快,而是在于可以在单个线程/进程中处理更多的连接。

    与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

    2. I/O复用函数介绍

    下面简单的介绍一下I/O复用函数。

    2.1 select函数

    系统提供Select函数来实现多路复用输入/输出模型,Select系统调用是用来让我们的程序监视多个文件句柄的状态变化。程序会阻塞在select函数上,直到被监视的文件句柄中有一个或多个发生了状态变化。

    函数原型

    #include <sys/select.h>
    #include <sys/time.h>
    
    int select(int maxfd,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)
    

    参数说明:

    • maxfd:需要监视的最大的文件描述符值+1;
    • readset:需要检测的可读文件描述符的集合;
    • writeset:需要检测的可写文件描述符的集合
    • exceptset:需要检测的异常文件描述符的集合
    • timeout:超时时间;超时时间有三种情况:
      • NULL:永远等待下去,仅在有一个描述字准备好I/O时才返回;
      • 0:立即返回,仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生;
      • 特定的时间值: 如果在指定的时间段里没有事件发生,select将超时返回;

    函数返回值有三种情况:

    • 返回0表示超时了;
    • 返回-1,表示出错了;
    • 返回一个大于0的数,表示文件描述符状态改变的个数;

    fd_set是一个文件描述符集合,可以通过以下宏来操作:

    • FD_CLR(inr fd,fd_set* set):用来清除文件描述符集合set中相关fd的位
    • FD_ISSET(int fd,fd_set *set):用来测试文件描述符集合set中相关fd的位是否为真
    • FD_SET(int fd,fd_set*set):用来设置文件描述符集合set中相关fd的位
    • FD_ZERO(fd_set *set):用来清除文件描述符集合set的全部位

    2.2 Poll函数

    Poll的处理机制与Select类似,只是Poll选择了pollfd结构体来处理文件描述符的相关操作:

    struct pollfd {
        int fd;         /* 文件描述符 */
        short events;   /* 等待的事件 */
        short revents;  /* 实际发生了的事件 */
    } ; 
    

    每一个pollfd结构体都指定了一个文件描述符fd,events代表了需要监听该文件描述的事件掩码,可选的有:

    • POLLIN:有数据可读。
    • POLLRDNORM:有普通数据可读。
    • POLLRDBAND:有优先数据可读。
    • POLLPRI:有紧迫数据可读。
    • POLLOUT:写数据不会导致阻塞。
    • POLLWRNORM:写普通数据不会导致阻塞。
    • POLLWRBAND:写优先数据不会导致阻塞。
    • POLLMSGSIGPOLL:消息可用。

    revents代表文件描述符的操作结果掩码,内核在调用返回时设置这个域。events域中请求的任何事件都可能在revents域中返回,除此之外,revents域还可以包含以下事件:

    • POLLER:指定的文件描述符发生错误。
    • POLLHUP:指定的文件描述符挂起事件。
    • POLLNVAL:指定的文件描述符非法。

    poll的函数原型

    # include <poll.h>
    int poll ( struct pollfd * fds, unsigned int nfds, int timeout);
    

    参数说明:

    • fds:需要被监视的文件描述符集合;
    • nfds:被监视的文件描述符数量;
    • timeout:超时时间,有三种取值:
      • 负数:无限超时,一直等到一个指定事件发生;
      • 0:立即返回,并列出准备好的文件描述符;
      • 正数:等待指定的时间,单位为毫秒;

    poll函数与select函数的最大不同之处在于:select函数有最大文件描述符的限制,一般1024个,而poll函数对文件描述符的数量没有限制。但select和poll函数都是通过轮询的方式来查询某个文件描述符状态是否发生了变化,并且需要将整个文件描述符集合在用户空间和内核空间之间来回拷贝,这样随着文件描述符的数量增加,相应的开销也随之增加。

    2.3epoll函数

    epoll是在Linux内核2.6引进的,是select和poll函数的增强版。与select相比,epoll没有文件描述符数量的限制。epoll使用一个文件描述符管理多个文件描述符,将用户关心的文件描述符事件存放到内核的一个事件列表中,这样在用户空间和内核空间只需拷贝一次。

    epoll操作是包含有三个接口的:

    #include <sys/epoll.h>
    int epoll_create(int size);
    int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
    int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
    

    epoll_create函数

    • 用创建一个epoll的句柄;
    • size用来告诉内核这个监听的数目一共有多大,占用一个fd值;

    epoll_ctl函数

    • epoll的事件注册函数;
    • 参数:

      • epfd:epoll_create()的返回值;
      • op:动作,有三种取值:

        • EPOLL_CTL_ADD:注册新的fd到epfd中;
        • EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
        • EPOLL_CTL_DEL:从epfd中删除一个fd;
      • fd:需要监听的fd;

      • event: 告诉内核需要监听什么事件,取值有:
        • EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
        • EPOLLOUT:表示对应的文件描述符可以写;
        • EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
        • EPOLLERR:表示对应的文件描述符发生错误;
        • EPOLLHUP:表示对应的文件描述符被挂断;
        • EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
        • EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列;

    epoll_wait函数

    • 等待事件的产生;
    • 参数:
      • events:从内核得到事件的集合;
      • maxevents:事件集合的大小;
      • timeout:超时时间,0会立即返回,-1表示永久阻塞,正数表示一个指定的值;

    工作模式

    epoll对文件描述符的操作由两种模式:水平触发LT(level trigger)和边沿触发ET(edge trigger)。默认的情况下为LT模式。LT模式与ET模式的区别在于:

    • LT模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll_wait时,会再次响应应用程序并通知此事件。
    • ET模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次响应应用程序并通知此事件。

    ET模式在很大程度上减少了epoll事件被重复触发的次数,因此效率要比LT模式高。epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。

    2.4 epoll相比于select/poll的优势?

    从上面对select/poll/epoll函数的介绍,可以知道epoll与select/poll相比,具有如下优势:

    1. 监视的描述符数量不受限制,所支持的FD上限是最大可以打开文件的数目;
    2. I/O效率不会随着监视fd的数量增长而下降。epoll不同于select和poll轮询的方式,而是通过每个fd定义的回调函数来实现的,只有就绪的fd才会执行回调函数。

    3.总结

    IO复用机制可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立即通知相应程序进行读或写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的

    参考文章:

    1. 同步,异步,阻塞,非阻塞
    2. select/poll/epoll对比分析
    3. Linux下的I/O复用与epoll详解
    4. epoll 或者 kqueue 的原理是什么?
    5. select、poll、epoll之间的区别总结
    展开全文
  • 基带信号就是将数字信号1或0直接用两种不同的电压来表示,然后送到线路上去传输。... 常用的多路复用技术有频分多路复用技术和时分多路复用技术。 频分多路复用是将各路信号分别调制到不同的频段进行传输,

    基带信号就是将数字信号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)系统,在数据通信系统中应和调制解调技术结合使用。

    展开全文
  • 多路复用技术

    千次阅读 2019-01-18 15:52:30
    多路复用:数据通信系统或计算机网络系统中,传输媒体的带宽或容量往往会大于传输单一信号的需求,为了有效地利用通信线路,希望一个信道同时传输多路信号,这就是所谓的多路复用技术(Multiplexing)。 在计算机网络...

    多路复用:数据通信系统或计算机网络系统中,传输媒体的带宽或容量往往会大于传输单一信号的需求,为了有效地利用通信线路,希望一个信道同时传输多路信号,这就是所谓的多路复用技术(Multiplexing)。

    在计算机网络中,对于服务器而言,它的用户是多个,因此多路复用和多路分解是必要的。

    最早我接触到的多路复用技术是在51单片机中,它的P1口在外接存储器的时候,要多路复用为数据总线和低8位的地址总线。复用信号是ALE引脚发出的,可以通过一个锁存器将地址信号存储起来。这样就能实现多路复用。

    在通信技术中,常使用一下的多路复用技术。

    频分多路复用(FDM):各个用户占用不同的带宽(这个是指频率范围,单位是HZ)

    时分多路复用(TDM):各个用户占据不同的时隙,这些时隙是固定的。和时间片轮转技术是相似的。

    码分多路复用(CMD):CMD广泛应用于无线网络中。它给每个用户分配m比特的序列,这个序列是唯一的。因此,每个用户只需要利用各自的序列进行编码即可。如果是用户发送数据是1,那么传输该序列即可,如果是0,那么传输该序列的反码。

     

    展开全文
  • 多路复用

    千次阅读 2017-09-04 07:20:09
    1 多路复用的基本概念多路复用(multiplexing),简称复用,是通信技术中的基本概念,多路复用多用在电路交换技术中。多路复用(Multiplexing): 链路/网络资源(如带宽)划分为“资源片”,将资源片分配给各路...
  • Java网络编程-IO多路复用(单线程)

    千次阅读 2017-04-28 11:05:00
    常见的IO多路复用应用有:select、poll、epoll 有关于select的应用方式,请参阅[C语言] 基于Linux的一对一Socket简易聊天程序实例 本篇文章采用Java的NIO框架来实现单线程的IO多路复用 2. ...
  • IO多路复用之水平触发和边缘触发

    千次阅读 2018-09-24 17:16:20
    IO多路复用允许我们同时检查...IO多路复用应用场景很广,在将待监控的FD加入EPOLL(select、pool)时,可以设置两种事件触发模式: 1:边缘触发 2:水平触发 使用水平触发和边缘触发通知模型支持情况 I/o 模型 ...
  • golang线程池在IO多路复用中的应用

    千次阅读 2020-10-11 21:18:49
    之前介绍过基于reactor模式的IO多路复用技术,reactor模式本质上就是循环监听-处理的过程,当处理过程代价很小(比如echo服务器),服务端实际上长期阻塞于监听环节,这样会导致客户端感觉自己的请求是被立即处理的...
  • 计算机网络-多路复用

    千次阅读 多人点赞 2019-02-12 16:41:22
    什么是多路复用技术呢? 多路复用(multiplexing),简称复用,是通信技术中的基本概念 。  事实上,多路复用技术的原理就是,把通信资源或者说是链路、信道资源进行的划分,分成一系列的资源片。把这些资源片...
  • 传输层(多路分解与多路复用

    千次阅读 2018-06-25 10:28:53
    为什么要多路分解和多路复用?因为:如果某层的一个协议对应直接上层的多个协议/多个实体,则需要多路分解和多路复用。例子:这里值得注意的是,在发送之前,需要为每个数据封装上头部信息才会生成Segment,交给网络...
  • 多路复用/多路分解

    千次阅读 2015-08-10 20:22:00
    套接字寻址系统使得TCP和UDP能够执行传输层另一个重要任务:多路复用和多路分解。多路复用是指把多个来源的数据导向一个输出,而多路分解是把从一个来源接收的数据发送到多个输出。 多路传输/多路分解让TCP/...
  • TCP/IP多路复用

    2021-02-28 17:08:43
    所有网络通信的本质目标就是...因此这里需要用到一个叫作多路复用(Multiplex)的技术。多路复用,就是多个信号,复用一个信道。 传输层多路复用 多个请求复用一个 TCP 连接。 多个请求相当于并行的发送请求。即使其
  • 多路复用

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

    万次阅读 多人点赞 2019-05-19 19:18:01
    引出IO多路复用 为什么 Redis 中要使用 I/O 多路复用这种技术呢? 首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下...
  • 一、什么是多路复用和多路分解 我们知道,在网络上主机与主机之间的通信,实质上是主机上运行的应用进程之间的通信。例如,当你通过Http上网浏览网页时,实质上是你所访问的主机的服务器进程与你本机的浏览器进程在...
  • 42-IO 多路复用

    千次阅读 2017-04-23 14:51:02
    1. 概述早在学习《Linux 环境编程笔记》的时候,我们学已经把 IO 多路复用的知识系统的介绍了,它主要包括 select、poll 和 epoll 技术。如果你还没有熟练的掌握这些知识,请参考 《Linux 环境编程笔记》的第十二章...
  • 多路复用时钟

    千次阅读 2015-09-08 19:30:42
    时钟多路器用于使同一个逻辑功能具有不同的时钟,比如需要处理多个频率标准的通信应用常常使用多个时钟。下图是某一类型的时钟多路器: 虽然在时钟信号上引入多路逻辑会产生毛刺等问题,但是在不同的应用中,对...
  • redis IO多路复用技术

    万次阅读 2018-02-04 18:38:22
    redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量。 LINUX IO多路复用原理 在linux下面, 常见的有5中网络IO方式, 具体可以参考如下的文章, 总结的很清楚, 我们就不再具体介绍: ...
  • IO多路复用机制详解

    千次阅读 2018-04-02 18:47:15
    0. IO多路复用机制详解 参考 : https://blog.csdn.net/baixiaoshi/article/details/48708347 1. IO多路复用 参考: https://www.zhihu.com/question/32163005要弄清问题先要知道问题的出现原因原因: 由于进程...
  • 常见的IO多路复用应用有:select、poll、epoll 有关于select的应用方式,请参阅[C语言] 基于Linux的一对一Socket简易聊天程序实例 本篇文章采用Java的NIO框架来实现单线程的IO多路复用 2. Reactor模式的组成...
  • I/O多路复用之select

    千次阅读 2017-03-30 16:39:49
    I/O多路复用:I/O多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备就绪后,它就通知该进程的应用程序,应用程序就可以马上完成响应的I/O操作,而不需要等待系统完成I/O操作,这样大大提高了效率。I/O多路...
  • IO多路复用监听函数select,poll,epoll,它们的实现原理网络上大量资料,此处不做赘述 本文通过表格的形式,对比select,poll,epoll在各方面的表现,从而引出它们实际的应用场景 话不多说,看表格   ...
  • 计算机网络运输层之多路复用与多路分解

    万次阅读 多人点赞 2014-03-21 00:13:10
    一、什么是多路复用和多路分解 我们知道,在网络上主机与主机之间的通信,实质上是主机上运行的应用进程之间的通信。例如,当你通过Http上网浏览网页时,实质上是你所访问的主机的服务器进程与你本机的浏览器进程在...
  • Android移动端IM开发之应用层实现TCP长连接多路复用

    千次阅读 热门讨论 2016-04-22 17:09:50
    这里只是提供一个长连接多路复用的实现思路什么是长连接多路复用 从字面意思看就是一台设备只有一条长连接连向服务器,其他集成这个IM SDK的app都会共享这条长连接,TCP长连接的维护是比较耗资源的,而且也会增加...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,335
精华内容 36,934
关键字:

多路复用的应用