复用_复用技术 - CSDN
精华内容
参与话题
  • I/O复用的理解

    千次阅读 多人点赞 2018-05-12 00:31:27
    I/O复用就是单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流.假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接...

    I/O复用就是单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O.

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

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

    · 很快你就发现空管塔里面聚集起来一大票的空管员,交通稍微繁忙一点,新的空管员就已经挤不进来了。 

    · 空管员之间需要协调,屋子里面就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
    可是epoll 有个致命的缺点。。只有linux支持。比如BSD上面对应的实现是kqueue
    ngnix 的设计原则里面, 它会使用目标平台上面最高效的I/O多路复用模型咯,所以才会有这个设置。一般情况下,如果可能的话,尽量都用epoll/kqueue吧。
    详细的在这里:

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

    Linux下实现I/O复用的系统调用有select、poll、epoll。

    select系统调用的用途:在一段时间内,监听用户感兴趣的文件描述符上的可读,可写和异常等事件

    poll系统调用:在制定时间内轮询一定数量的文件描述符,已测试其中是否有就绪者

    epoll系列系统调用:

    epolllinux特有的I/O复用函数

    文件描述符(用来标识内核中的事件表)的创建有epoll_creat来完成


     

    展开全文
  • 代码复用

    千次阅读 2019-01-08 02:02:35
    1、代码复用有两个方式:继承和复合。 2、继承分为public继承和private继承,public继承是继承接口,也就是父类提供的接口,子类承若仍然提供,内部有可能修改实现,子类与父类是IS-A关系。private继承是继承实现,...

    1、代码复用有两个方式:继承和复合。

    2、继承分为public继承和private继承,public继承是继承接口,也就是父类提供的接口,子类承若仍然提供,内部有可能修改实现,子类与父类是IS-A关系。private继承是继承实现,父类提供的接口,子类不再提供,子类与父类不是IS-A的关系,不满足里氏代换,private表示的意义是,根据某物来实现。

    3、复合可以分为关联,聚合,组合。关联是一对一的关系,聚合和组合都是多对一的关系,但二者的紧密程度不一样。举例来说,大雁聚合成雁群,翅膀和脚组合成大雁。复合表示的意义也是,根据某物来实现。更合理的说法应该是,委托某物去做某件事。

    4、关联与依赖不同,关联是一个对象持有另一个对象的引用,而依赖则是,别人依赖我,我把自己作为实参传递给别人使用。

    5、继承和复合都能实现代码复用,哪一种方式更好?

      优先使用复合,除非出现下面的情况:

      a、确实是IS-A 的关系;

      b、需要访问protected成员;

      c、需要重写某个虚方法。

    展开全文
  • 通信技术之复用与解复用

    千次阅读 2018-09-16 10:43:59
    想像一下,如果一条信道一次只能传输一条信息,那么对于海量的信息来说,传输的速度未免太慢了,因此,我们想要一根线上传送多路信号,复用技术就应运而生了。 在上一篇博客中,我们知道了PCM编码的位数是8,抽样...

    想像一下,如果一条信道一次只能传输一条信息,那么对于海量的信息来说,传输的速度未免太慢了,因此,我们想要一根线上传送多路信号,复用技术就应运而生了。


    在上一篇博客中,我们知道了PCM编码的位数是8,抽样周期是1s/8000次=125us,在这125us内,我们希望更多的8位PCM编码能够通过信道。

    常见的复用方式有三种,TDM(时分复用),FDM(频分复用),WDM(波分复用)。我们以PCM脉冲编码调制作为时分复用的典型进行举例。在举例前,我们首先需要介绍“同步”的概念,想像一下,由于很多路信号一起通过信道,A的信号占用一些时间片,B的信号也占用一些时间片,由于采用时分复用的方式,A和B的信号都是被分割后传输的,那么想要得到完整的A的信号或者B的信号就需要把分割成不同时间片上的信号重新组合起来(在接收端),因此我们需要各个时间片上的信号按照同样的时间顺序不早一分不晚一秒的到达,这样,我们就要引入同步的概念了。顾名思义,同步就是各路信号保持同样的步伐,想要做到同步就需要在每路信号上添加一段关于时间的信息,叫做同步码,还要一些保障信号其他功能的信息,比如挂机,接通等,称为信令,只要是与信号本身内容无关,只是为了保障信号的功能的信息统称为信令。

    国际电信联盟对于PCM复用给出了两种方案:一是PCM30/32制式,二是PCM24制式,即一是指30路话音信号,1路同步码,1路信令码,二是指22路话音信号,一路同步码,1路信令码。

    对于30/32来说,我们可以理解为,在一秒钟内,发送8000条信号,即每一条信号就是125us,这个时间片我们称之为一帧。每一帧中,有32路信号,可以理解为分别代表30个客户,还有1个同步信号,1个信令信号,是为了保障30个客户的信号排列整齐的指挥官,这么算来,整整一秒钟内,能够通过8000*8*32=2048bit的信息,这就是PCM的一次群速率2048bit/s。

    展开全文
  • 【面试】I/O 复用

    2019-03-31 07:29:35
    面试考察的是如何把书本上的知识转化为自己的理解 前前后后也面试了大小快二十场面试,总的来看感觉面试的过程其实没有想象的那么难,很多知识是自己平时遇到的问题,要么是没有用心去理解,要么是理解了,心里知道...

    面试考察的是如何把书本上的知识转化为自己的理解

    前前后后也面试了大小快二十场面试,总的来看感觉面试的过程其实没有想象的那么难,很多知识是自己平时遇到的问题,要么是没有用心去理解,要么是理解了,心里知道是什么意思,但是无法表达清楚,抓不住关键点。

    所以打算以后学习一个知识,先仔细阅读理解,然后不看书本,用自己的话写下来总结成一篇博客。

    知识回顾

    1. 套接字

    套接字就是IP:端口号,是用于 TCP 连接的端点

    1. I/O 模型

    一个输入操作大概就是分两步:应用程序请求并等待数据到达;从内核向进程复制数据。而对于套接字上的输入操作,第一步类似,就是等待数据从网络中到达,数据到达以后为了防止数据丢失,会先复制到内核中的某个缓冲区;第二步就是将内核缓冲区中的数据复制到应用程序缓冲区。

    Unix 下有五种 I/O 模型:

    • 阻塞式 I/O
    • 非阻塞式 I/O
    • I/O 复用(select poll)
    • 信号驱动式 I/O(SIGIO)
    • 异步 I/O(AIO)

    阻塞式 I/O

    具体过程就是首先应用进程发起系统调用,会进入等待,一直等到数据报就绪,这时候数据还是在内核缓冲区中,需要将数据报返回给应用进程缓冲区。

    需要注意的是,阻塞式 I/O 不是意味着系统进入阻塞,而仅仅是当前应用程序阻塞,其他应用程序还是可以继续运行的,因此不消耗 CPU 时间,执行效率较高

    非阻塞式 I/O

    应用进程执行系统调用以后,不同于阻塞式进程直接进入阻塞,而是如果数据没有准备好,就会返回一个错误码,应用进程可以继续执行,但是需要不断进行系统调用来获得 I/O 是否完成,这种方式称为轮询(polling)

    我这里的理解就是其实非阻塞式 I/O 和阻塞式 I/O 实际上是相同的,都需要等待数据,只不过一个是被动进入阻塞,另一个是主动请求看数据有没有好,就比如是高中学习,一个是在想学习新知识过程中等待老师上课讲,在老师没有上课讲之前就一直等待,而另外一个同学是不停去办公室问,老师上不上课,什么时候上课。

    I/O 复用

    I/O 复用其实流程和阻塞式有很大相同之处,只不过 I/O 复用会先调用 select,这个时候系统会监听所有 select 负责的数据报,一旦有某个数据准备就绪,就会将其返回,然后进行 recvfrom 系统调用,执行同阻塞式 I/O 相同的处理。对比阻塞式 I/O,这里需要调用两个系统调用,所以效率肯定不如前者,但是最大的特点就是可以同时处理多个 connection。

    多说一句。所以,如果处理的连接数不是很高的话,使用 select/epoll 的 web server 不一定比使用 multi-threading + blocking IO 的 web server 性能更好,可能延迟还更大。select/epoll 的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。

    信号驱动式 I/O

    不常用,基本不会涉及到

    异步 I/O

    进行 aio_read 系统调用会立即返回, 应用进程继续执行, 不会被阻塞, 内核会在所有操作完成之后向应用进程发送信号。

    异步 I/O 与信号驱动 I/O 的区别在于, 异步 I/O 的信号是通知应用进程 I/O 完成,而信号驱动 I/O 的信号是通知应用进程可以开始 I/O。

    简单说就是,当用户应用进程请求数据时,不会进入阻塞,而是继续执行其他任务,等到该应用进程数据处理完毕,那么相应的系统会给用户进程传回一个信号,表示应用进程已经执行完毕,这是和信号驱动最大的不同,这个返回的信号是通知进程已经执行完毕,而信号驱动返回信号是通知进程可以开始执行。

    比较

    阻塞式和非阻塞式区别?同步异步区别?

    先说简单的,阻塞式和非阻塞式最大的区别就是阻塞式在等待数据阶段会进入阻塞,而非阻塞式不会,但是对于非阻塞式,在获得数据存在内核缓冲区后,将内核缓冲区中数据复制到应用程序缓冲区这个阶段是阻塞的。

    在说同步异步区别之前先要了解什么叫同步,什么叫异步?区别就是在进行 I/O 操作时候会将进程阻塞,根据这个定义就知道,阻塞式、非阻塞式、信号驱动式、I/O 复用式都属于同步,为什么非阻塞式也是呢?这就涉及到前面说的,虽然在开始是没有阻塞,但是后面将数据从内核到应用程序是阻塞的。

    引用博主中很好的一个例子来理解:

    最后,再举几个不是很恰当的例子来说明这四个IO Model: 有A,B,C,D四个人在钓鱼:
    A用的是最老式的鱼竿,所以呢,得一直守着,等到鱼上钩了再拉杆;
    B的鱼竿有个功能,能够显示是否有鱼上钩,所以呢,B就和旁边的MM聊天,隔会再看看有没有鱼上钩,有的话就迅速拉杆;
    C用的鱼竿和B差不多,但他想了一个好办法,就是同时放好几根鱼竿,然后守在旁边,一旦有显示说鱼上钩了,它就将对应的鱼竿拉起来;
    D是个有钱人,干脆雇了一个人帮他钓鱼,一旦那个人把鱼钓上来了,就给D发个短信

    面试必问

    select/poll/epoll 都是 I/O 多路复用的具体实现, select 出现的最早, 之后是 poll, 再是 epoll。

    select

    有三种类型的描述符类型: readset、 writeset、 exceptset, 分别对应读、 写、 异常 条件的描述符集合。 fd_set 使用数组实现, 数组大小使用 FD_SETSIZE 定义。

    timeout 为超时参数, 调用 select 会一直阻塞直到有描述符的事件到达或者等待的 时间超过 timeout。

    成功调用返回结果大于 0, 出错返回结果为 -1, 超时返回结果为 0。

    关键代码如下:

    fd_set fd_in, fd_out;
    struct timeval tv;
    // Reset the sets
    FD_ZERO( &fd_in );
    FD_ZERO( &fd_out );
    // Monitor sock1 for input events
    FD_SET( sock1, &fd_in );
    // Monitor sock2 for output events
    FD_SET( sock2, &fd_out );
    // Find out which socket has the largest numeric value as select requires it
    int largest_sock = sock1 > sock2 ? sock1 : sock2;
    // Wait up to 10 seconds
    tv.tv_sec = 10;
    tv.tv_usec = 0;
    // Call the select
    int ret = select( largest_sock + 1, &fd_in, &fd_out, NULL, &tv ); 
    // Check if select actually succeed
    if ( ret == -1 )
        // report error and abort
    else if ( ret == 0 )
        // timeout; no event detected
    else
    {
        if ( FD_ISSET( sock1, &fd_in ) )
            // input event on sock1
        if ( FD_ISSET( sock2, &fd_out ) )
            // output event on sock2
    }
    复制代码

    select 详细过程:

    当用户 process 调用 select 的时候,select 会将需要监控的 readfds 集合拷贝到内核空间(假设监控的仅仅是 socket 可读),然后遍历自己监控的 socket sk,挨个调用 sk 的 poll 逻辑以便检查该 sk 是否有可读事件,遍历完所有的 sk 后,如果没有任何一个 sk 可读,那 select 会调用 schedule_timeout 进入 schedule 循环,使得 process 进入睡眠。如果在 timeout 时间内某个 sk 上有数据可读了,或者等待 timeout 了,则调用 select 的 process 会被唤醒,接下来 select 就是遍历监控的 sk 集合,挨个收集可读事件并返回给用户了

    到这里,我们有三个问题需要解决:

    (1)被监控的fds集合限制为1024,1024太小了,我们希望能够有个比较大的可监控fds集合

    (2)fds集合需要从用户空间拷贝到内核空间的问题,我们希望不需要拷贝

    (3)当被监控的fds中某些有数据可读的时候,我们希望通知更加精细一点,就是我们希望能够从通知中得到有可读事件的fds列表,而不是需要遍历整个fds来收集。

    poll

    poll 的机制与 select 类似,与 select 在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是 poll 没有最大文件描述符数量的限制。poll改变了fds集合的描述方式,使用了pollfd结构而不是select的fd_set结构,使得poll支持的fds集合限制远大于select的1024。其中 pollfd 使用链表实现

    int poll(struct pollfd *fds, unsigned int nfds, int timeout);
    复制代码

    select poll 比较

    1. 功能

    实现大致相同,但是一些细节还是存在不同:

    • select 的描述符类型使用数组实现,FD_SETSIZE 默认大小为 1024,不过这个值可以改变,如果需要修改的话要重新编译;而 poll 使用链表实现,没有描述符大小的限制
    • poll 提供更多的事件类型,并且对描述符的重复利用比 selec 高
    • 如果一个线程对某个描述符调用了 selec 或者 poll,另一个线程关闭了该描述符,会导致调用结果不确定。
    1. 速度

    速度都很慢

    • 共同的就是在调用时都需要将全部描述符从应用进程缓冲区复制到内核缓冲区
    • 两者返回结果中没有声明哪些描述符已经准备好,所以如果返回值大于 0 时,应用进程都需要使用轮询的方式来找到 I/O 完成的描述符
    1. 可移植性

    select 出现比较早,所以基本上所有的系统都支持,而只有比较新的系统才支持 poll

    epoll(太强了)

    epoll_ctl() 用于向内核注册新的描述符或者是改变某个文件描述符的状态。 已注册的描述符在内核中会被维护在一棵红黑树上, 通过回调函数内核会将 I/O 准备好的描述符加入到一个链表中管理, 进程调用 epoll_wait() 便可以得到事件完成的描述符。

    从上面的描述可以看出, epoll 只需要将描述符从进程缓冲区向内核缓冲区拷贝一次, 并且进程不需要通过轮询来获得事件完成的描述符。

    epoll 仅适用于 Linux OS。

    epoll 比 select 和 poll 更加灵活而且没有描述符数量限制。

    epoll 对多线程编程更有友好, 一个线程调用了 epoll_wait() 另一个线程关闭了同一个描述符也不会产生像 select 和 poll 的不确定情况。

    epoll 工作模式

    epoll 的描述符事件有两种触发模式: LT( level trigger) 和 ET( edge trigger)

    1. LT 模式

    当 epoll_wait() 检测到描述符事件到达时,将此时间通知进程,进程可以不立即处理该事件,下次调用 epoll_wait() 时会再次通知进程,这是默认一种模式,并且同时支持阻塞和非阻塞

    1. ET 模式

    和 LT 模式不同的是,通知之后必须立即处理事件,下次再调用 epoll_wait() 不会再得到时间到达的通知。

    减少了 epoll 事件被重复触发的次数,因此效率比 LT 高,只支持非阻塞式,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。

    应用场景

    通过上面的对比,很容易理解是既然 epoll 这么强大,那么都使用 epoll 不就够了?实际上不是这样的,其实都各自有各自的使用场景

    1. select 使用场景
    • select 的 timeout 精度为 1ns,而其他两种为 1ms,所以 select 更适用于实时要求很高的场景,比如核反应堆的控制
    • select 可移植性好,几乎被所有主流平台支持
    1. poll 使用场景
    • poll 与 select 相比没有最大描述符数量的限制,并且如果平台对实时性要求不是很高,一般使用poll
    • 需要同时监控小于 1000 个描述符,就没必要使用 epoll,因为这个应用场景下并不能体现 epoll 的优势
    • 需要监控的描述符状态变化多,而且都是非常短暂的,也没有必要使用 epoll,因为 epoll 中的所有描述符都是存储在内核中,造成每次对描述符状态的改变都需要通过系统调用,频繁系统调用肯定会降低效率,并且 epoll 的描述符存储在内核中不容易调试
    1. epoll 使用场景

    只需要运行在 Linux 平台,并且有非常大量的描述符需要同时轮询,而且这些连接最好是长连接

    参考

    CS-Notes

    IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)

    大话 Select、Poll、Epoll

    Linux下I/O多路复用系统调用(select, poll, epoll)介绍

    转载于:https://juejin.im/post/5c9dd8e6f265da30ae313a01

    展开全文
  • 复用

    2020-07-04 17:00:09
    LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。 类型替换: ①子类型只能增加而不能删除方法 ②子类型需要...
  • Java设计模式——合成/聚合复用原则

    万次阅读 多人点赞 2015-04-12 10:06:25
    一、什么是合成/聚合复用原则? 合成/聚合复用原则是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。 简述为:要尽量使用合成/聚合,尽量...
  • 文章目录时分复用TDM存在的问题频分复用FDM与波分复用WDM关系码分多址的原理(CDMA)ADSL含义,采用什么复用形式 时分复用TDM存在的问题 频分复用FDM与波分复用WDM关系 码分多址的原理(CDMA) 码分多址(CDMA)的...
  • Android AdapterView View的复用机制 分析

    万次阅读 多人点赞 2014-04-23 00:21:09
    重写个BaseView,实现对于的几个方法,然后就完成了我们的界面展示,并且在大部分情况下,我们加载特别多的Item也不会发生OOM,大家也都明白内部有缓存机制,都遇到过ItemView复用带来的一些问题,比如异步加载图片...
  • 时分复用,频分复用

    千次阅读 2017-01-02 20:17:50
    频分复用的所有用户在同样的时间占用不同的带宽资源(请注意,这里的“带宽”是频率带宽而不是数据的发送速率)。 无线电广播通信也是采用FDM的例子,多个广播电台频分复用自由空间这个传输介质,每个电台占用一个...
  • 代码复用性的理解

    万次阅读 2018-12-25 12:14:24
    最近的开发工作主要是把某C++业务代码翻译成Lua版本,这个过程相当枯燥,期间吐槽不少这块业务代码的整洁性,在测试Lua版本的业务代码时,因翻译时求快心理,有些复杂算法的翻译出现纰漏,且类似的算法在业务的多处...
  • 频分复用复用的是时隙、空间和码,划分的是载波带宽(频率上区分信道),即在同一时隙、同一空间、同一个正交码的情况下,将一个载波带宽划分为相互区别的、多个不同频点的子信道,分别传送不同的信号。 时分复用...
  • ListView复用和优化详解

    万次阅读 多人点赞 2016-11-09 17:09:34
    我们每一个Android开发人员对ListView的使用肯定是很熟悉的,然而多少人能真正的懂ListView的缓存机制呢,说白了就是ListView为了提高效率而内部实现的一种优化,而这种优化就需要复用ItemView(也就是item对应的View)....
  • 【计算机网络】信道复用技术

    万次阅读 2016-12-05 18:06:26
    复用(multiplexing),合用,共用,是通信技术中的基本概念。频分复用(FDM) 是按频率分割多路信号的方法,即将信道的可用频带分成若干互不交叠的频段,每路信号占据其中的一个频段。 在接收端用适当的滤波器将多路...
  • 导语 As we all know-众所周知,RecycleView 在展示数据列表的页面替换Listview的趋势已然出现,现在网络上关于它的资料也是铺天盖地,我就不再介绍如何使用了。但是,我对RecycleView的Adapter还是比较感兴趣的...
  • DDR复用,CPU复用视频,非常好用,一看就懂,讲得非常的详细非常的好,确实是一个好资料哦,大家可以看看
  • 端口复用

    千次阅读 2018-04-17 17:38:54
    实际上,默认的情况下,如果一个网络应用程序的一个套接字 绑定了一个端口( 占用了 8000 ),这时候,别的套接字就无法使用这个端口( 8000 ), 验证例子如下:[cpp] view plain copy#include &...
  • 合成复用原则

    2019-10-28 15:27:41
    一、什么是合成/聚合复用原则? 合成/聚合复用原则是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。 简述为:要尽量使用合成/聚合,尽量...
  • 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.简介希望通过这...
  • 复用

    千次阅读 2012-05-29 12:11:37
    数字高清晰度电视(High Definition Television)简称HDTV,是继黑白电视和彩色电视之后的第三代电视系统。其图像细腻逼真,质量与35 mm电影相当,再配以环绕音响,使收视效果大幅度提高。它将成为21世纪的主要电视...
  • 利用Vlan实现家庭网络单线复用

    万次阅读 多人点赞 2018-11-26 14:14:34
    VLAN 学习以及家庭网络优化 家里装修时没有注意网络布线,户外光猫到户内弱电箱只有一根网线。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点...
1 2 3 4 5 ... 20
收藏数 572,280
精华内容 228,912
关键字:

复用