精华内容
下载资源
问答
  • 阻抗匹配是什么意思?阻抗匹配原理详解

    万次阅读 多人点赞 2019-06-12 20:00:53
    阻抗匹配是什么意思_阻抗匹配原理详解 -------本文轉載自<...  本文主要详解什么是阻抗匹配,首先介绍了输入及输出阻抗是什么,其次介绍了阻抗匹配的原理,最后阐述了阻抗匹...

                           阻抗匹配是什么意思_阻抗匹配原理详解

                                             -------本文轉載自<http://m.elecfans.com/article/671550.html>

      本文主要详解什么是阻抗匹配,首先介绍了输入及输出阻抗是什么,其次介绍了阻抗匹配的原理,最后阐述了阻抗匹配的应用领域,具体的跟随小编一起来了解一下吧。

      一、输入阻抗

      输入阻抗是指一个电路输入端的等效阻抗。在输入端上加上一个电压源U,测量输入端的电流I,则输入阻抗Rin就是U/I。你可以把输入端想象成一个电阻的两端,这个电阻的阻值,就是输入阻抗。

      输入阻抗跟一个普通的电抗元件没什么两样,它反映了对电流阻碍作用的大小。对于电压驱动的电路,输入阻抗越大,则对电压源的负载就越轻,因而就越容易驱动,也不会对信号源有影响;而对于电流驱动型的电路,输入阻抗越小,则对电流源的负载就越轻。因此,我们可以这样认为:如果是用电压源来驱动的,则输入阻抗越大越好;如果是用电流源来驱动的,则阻抗越小越好(注:只适合于低频电路,在高频电路中,还要考虑阻抗匹配问题),另外如果要获取最大输出功率时,也要考虑 阻抗匹配问题

      二、输出阻抗

      无论信号源或放大器还有电源,都有输出阻抗的问题。输出阻抗就是一个信号源的内阻。本来,对于一个理想的电压源(包括电源),内阻应该为0,或理想电流源的阻抗应当为无穷大。但现实中的电压源,则不能做到这一点。我们常用一个理想电压源串联一个电阻r的方式来等效一个实际的电压源。这个跟理想电压源串联的电阻r,就是(信号源/放大器输出/电源)内阻了。当这个电压源给负载供电时,就会有电流 I 从这个负载上流过,并在这个电阻上产生 I×r 的电压降。这将导致电源输出电压的下降,从而限制了最大输出功率(关于为什么会限制最大输出功率,请看后面的“阻抗匹配”一问)。同样的,一个理想的电流源,输出阻抗应该是无穷大,但实际的电路是不可能的。

      三、阻抗匹配

      阻抗匹配是指信号源或者传输线跟负载之间的一种合适的搭配方式。阻抗匹配分为低频和高频两种情况讨论。 我们先从直流电压源驱动一个负载入手。由于实际的电压源,总是有内阻的,我们可以把一个实际电压源,等效成一个理想的电压源跟一个电阻r串联的模型。假设负载电阻为R,电源电动势为U,内阻为r,那么我们可以计算出流过电阻R的电流为:I=U/(R+r),可以看出,负载电阻R越小,则输出电流越大。负载R上的电压为:Uo=IR=U/[1+(r/R)],可以看出,负载电阻R越大,则输出电压Uo越高。再来计算一下电阻R消耗的功率为:

      

      对于一个给定的信号源,其内阻r是固定的,而负载电阻R则是由我们来选择的。注意式中[(R-r)2/R],当R=r时,[(R-r)2/R]可取得最小值0,这时负载电阻R上可获得最大输出功率Pmax=U2/(4×r)。即,当负载电阻跟信号源内阻相等时,负载可获得最大输出功率,这就是我们常说的阻抗匹配之一。此结论同样适用于低频电路及高频电路。当交流电路中含有容性或感性阻抗时,结论有所改变,就是需要信号源与负载阻抗的的实部相等,虚部互为相反数,这叫做共扼匹配。在低频电路中,我们一般不考虑传输线的匹配问题,只考虑信号源跟负载之间的情况,因为低频信号的波长相对于传输线来说很长,传输线可以看成是“短线”,反射可以不考虑(可以这么理解:因为线短,即使反射回来,跟原信号还是一样的)。从以上分析我们可以得出结论:如果我们需要输出电流大,则选择小的负载R;如果我们需要输出电压大,则选择大的负载R;如果我们需要输出功率最大,则选择跟信号源内阻匹配的电阻R。有时阻抗不匹配还有另外一层意思,例如一些仪器输出端是在特定的负载条件下设计的,如果负载条件改变了,则可能达不到原来的性能,这时我们也会叫做阻抗失配。

      在高频电路中,我们还必须考虑反射的问题。当信号的频率很高时,则信号的波长就很短,当波长短得跟传输线长度可以比拟时,反射信号叠加在原信号上将会改变原信号的形状。如果传输线的特征阻抗跟负载阻抗不相等(即不匹配)时,在负载端就会产生反射。为什么阻抗不匹配时会产生反射以及特征阻抗的求解方法,牵涉到二阶偏微分方程的求解,在这里我们不细说了,有兴趣的可参看电磁场与微波方面书籍中的传输线理论。传输线的特征阻抗(也叫做特性阻抗)是由传输线的结构以及材料决定的,而与传输线的长度,以及信号的幅度、频率等均无关。例如,常用的闭路电视同轴电缆特性阻抗为75Ω,而一些射频设备上则常用特征阻抗为50Ω的同轴电缆。另外还有一种常见的传输线是特性阻抗为300Ω的扁平平行线,这在农村使用的电视天线架上比较常见,用来做八木天线的馈线。因为电视机的射频输入端输入阻抗为75Ω,所以300Ω的馈线将与其不能匹配。

      实际中是如何解决这个问题的呢?不知道大家有没有留意到,电视机的附件中,有一个300Ω到75Ω的阻抗转换器(一个塑料封装的,一端有一个圆形的插头的那个东东,大概有两个大拇指那么大)。它里面其实就是一个传输线变压器,将300Ω的阻抗,变换成75Ω的,这样就可以匹配起来了。这里需要强调一点的是,特性阻抗跟我们通常理解的电阻不是一个概念,它与传输线的长度无关,也不能通过使用欧姆表来测量。影響特征電阻的因素有很多,比如倒顯得材料和導線與地板之間的距離。为了不产生反射,负载阻抗跟传输线的特征阻抗应该相等,这就是传输线的阻抗匹配,如果阻抗不匹配会有什么不良后果呢?如果不匹配,则会形成反射,能量传递不过去,降低效率;会在传输线上形成驻波(简单的理解,就是有些地方信号强,有些地方信号弱),导致传输线的有效功率容量降低;功率发射不出去,甚至会损坏发射设备。如果是电路板上的高速信号线与负载阻抗不匹配时,会产生震荡,辐射干扰等。

      当阻抗不匹配时,有哪些办法让它匹配呢?第一,可以考虑使用变压器来做阻抗转换,就像上面所说的电视机中的那个例子那样。第二,可以考虑使用串联/并联电容或电感的办法,这在调试射频电路时常使用。第三,可以考虑使用串联/并联电阻的办法。一些驱动器的阻抗比较低,可以串联一个合适的电阻来跟传输线匹配,例如高速信号线,有时会串联一个几十欧的电阻。而一些接收器的输入阻抗则比较高,可以使用并联电阻的方法,来跟传输线匹配,例如,485总线接收器,常在数据线终端并联120欧的匹配电阻。(始端串联匹配,终端并联匹配)

      为了帮助大家理解阻抗不匹配时的反射问题,我来举两个例子:假设你在练习拳击——打沙包。如果是一个重量合适的、硬度合适的沙包,你打上去会感觉很舒服。但是,如果哪一天我把沙包做了手脚,例如,里面换成了铁沙,你还是用以前的力打上去,你的手可能就会受不了了——这就是负载过重的情况,会产生很大的反弹力。相反,如果我把里面换成了很轻很轻的东西,你一出拳,则可能会扑空,手也可能会受不了——这就是负载过轻的情况

      四、阻抗匹配的原理

      阻抗匹配的基本原理:

      1、纯电阻电路

      在中学物理电学中曾讲述这样一个问题:把一个电阻为R的用电器,接在一个电动势为E、内阻为r的电池组上,在什么条件下电源输出的功率最大呢?当外电阻等于内电阻时,电源对外电路输出的功率最大,这就是纯电阻电路的功率匹配。假如换成交流电路,同样也必须满足R=r这个条件电路才能匹配。

                                                   

       2、电抗电路

      电抗电路要比纯电阻电路复杂,电路中除了电阻外还有电容和电感。元件,并工作于低频或高频交流电路。在交流电路中,电阻、电容和电感对交流电的阻碍作用叫阻抗,用字母Z表示其中,电容和电感对交流电的阻碍作用,分别称为容抗及和感抗而。容抗和感抗的值除了与电容和电感本身大小有关之外,还与所工作的交流电的频率有关。值得注意的是,在电抗电路中,电阻R,感抗而与容抗双的值不能用简单的算术相加,而常用阻抗三角形法来计算(见图 2)。因而电抗电路要做到匹配比纯电阻电路要复杂一些,除了输人和输出电路中的电阻成分要求相等外,还要求电抗成分大小相等符号相反(共轭匹配);或者电阻成分和电抗成分均分别相等(无反射匹配)。这里指的电抗X即感抗XL和容抗XC之差(仅指串联电路来讲,若并联电路则 计算更为复杂)。满足上述条件即称为阻抗匹配,负载即能得到最大的功率。

      阻抗匹配的关键是前级的输出阻抗与后级的输人阻抗相等。而输人阻抗与输出阻抗广泛 存在于各级电子电路、各类测量仪器及各种电子元器件中。那么什么是输人阻抗和输出阻抗呢?输人阻抗是指电路对着信号源讲的阻抗。如图3所示的放大器,它的输人阻抗就是去掉信号源E及内电阻r时,从AB两端看进去的等效阻抗。其值为Z=UI/I1, 即输人电压与输人电流之比。对于信号源来讲,放大器成为其负载。从数值上看,放大器的等效负载值即为输人阻抗值。输人阻抗值的大小,对于不同的电路要求不 一样。

      例如:万用表中电压挡的输人阻抗(称为电压灵敏度)越高,对被测电路的分流就越小,测量误差也就小。而电流挡的输人阻抗越低,对被测电路的分压就越 小,因而测量误差也越小。对于功率放大器,当信号源的输出阻抗与放大电路的输人阻抗相等时即称阻抗匹配,这时放大电路就能在输出端获得最大功率。输出阻抗 是指电路对着负载讲的阻抗。如图4中,将电路输人端的电源短路,输出端去掉负载后,从输出端CD看进去的等效阻抗称为输出阻抗。如果负载阻抗与输出阻抗不相等,称阻抗不匹配,负载就不能获得最大的功率输出。输出电压U2和输出电流I2之 比即称为输出阻抗。输出阻抗的大小视不同的电路有不同的要求。

      例如:电压源要求输出阻抗要低,而电流源的输出阻抗要高。对于放大电路来讲,输出阻抗的值表 示其承担负载的能力。通常输出阻抗小,承担负载的能力就强。如果输出阻抗与负载不能匹配时,可加接变压器或网络电路来达到匹配。例如:晶体管放大器与扬声 器之间通常接有输出变压器,放大器的输出阻抗与变压器的初级阻抗相匹配,变压器的次级阻抗与扬声器的阻抗相匹配。而变压器通过初次级绕组的匝数比来变换阻 抗比。在实际的电子电路中,常会遇到信号源与放大电路或放大电路与负载的阻抗不相等的情况,因而不能把它们直接相连。解决的办法是在它们之间加人一个匹配 电路或匹配网络。最后要说明一点,阻抗匹配仅适用于电子电路。因为电子电路中传输的信号功率本身较弱,需用匹配来提高输出功率。而在电工电路中一般不考虑 匹配,否则会导致输出电流过大,损坏用电器。

      五、阻抗匹配的应用

      对于一般的高频信号领域,比如时钟信号,总线信号,甚至高达几百兆的DDR信号等,一般器件的收发端的感抗和容抗都比较小,相对电阻(即阻抗中的实部) 来说可以忽略不记,这时,阻抗匹配就只需要考虑实数部分就可以了。

      在射频领域,很多器件如天线,功放等其输入输出阻抗是非实数的(非纯电阻),并且其虚部(容抗或者感抗) 很大以至于不可忽略,这时就要采用共轭匹配的方法。

                                                                                                           

    展开全文
  • 什么是金字塔原理

    千次阅读 2021-02-22 15:29:57
    一、金字塔原理什么? 金字塔原理简单来说就是:我们在写作、思考、表达、解决问题的时候,要像金字塔结构一样,既突出重点,又有层次性和逻辑性。 金字塔通常可以分为“塔尖、塔身、塔基”三个部分。塔尖就是你...

    https://pic1.zhimg.com/v2-57a621c751f9de4efe04feaaa09b0215_1440w.jpg?source=172ae18b

    一、金字塔原理是什么?

    金字塔原理简单来说就是:我们在写作、思考、表达、解决问题的时候,要像金字塔结构一样,既突出重点,又有层次性和逻辑性。

    金字塔通常可以分为“塔尖、塔身、塔基”三个部分。塔尖就是你要表达的总的论点、结论、你要干什么,塔身就是你的分论点,塔基就是支撑你论点的论据。

    当我们把自己的思考或工作成果向他人阐述时(比如给老板汇报你的方案),要“自上而下”地讲(先塔尖,然后塔身、塔基),先说结论,然后再“逐步分层次展开”你的想法、分析、计划等具体内容。先说结论,就等于是先给对方吃一颗定心丸,给对方确定性,这样对方才能听懂你要说什么;分层次的逐步展开,对方才能一步步的跟着你进入到你的细节里面去。

    因为你的听众或者受众的时间和精力都是相对有限的,他们可能没时间,或者没心情去耐心的等你的结论、或者猜你要说什么。

    二、如何运用金字塔原理,逻辑清晰的思考、表达和解决问题?

    1、用“序言”打磨塔尖

    结论先行也是要讲究技巧的,你不能没头没脑地就说一个结论,或者赤裸裸的说一个结论。就像书籍有序言一样,作报告、写文章、阐述观点时也需要一个序言。比如做一下包装、找一个由头、用一些引导的句子,这样才能引起对方的兴趣,让对方听了以后能够听进去。

    具体要如何做好序言呢?有四个关键:背景、冲突、疑问和回答。

    ①背景。背景指的是跟你主题有关,不需要深入论述,别人也不会产生异议的内容。比如,我这篇文章开头段落的第一句话就是一个简单的背景。

    ②冲突。冲突就是背景信息里面存在的矛盾,或推动故事情节的转折点。比如:背景是......的,但是......;......是现在存在的威胁、阻碍,但也是一个机会,我们只要......就能......。这就是冲突。

    ③疑问。疑问就是用较为清楚的语言把矛盾揭露出来。比如我开头说的“如何才能逻辑清晰、层次分明的表达或解决问题呢?”

    ④回答。答案就是结论,就是回答上面的问题,同时引出你的中心思想。比如我问题后面的解决方案:你需要学习金字塔原理。

    https://pic1.zhimg.com/80/v2-f56af8b05c2e56710b6127efe585bd2c_720w.jpg

    总结一下“背景、冲突、疑问、答案”这个序言四段论:首先是背景,告诉读者或听众已知、没有疑问、对方感兴趣的东西;然后是冲突,在背景信息之间找到潜在的矛盾、冲突;再然后,把这个冲突用一句话概括出来,提出疑问;最后是答案,给出一个结论或解决方法。背景、冲突、疑问、答案,这就叫序言四段论。

    当然,这个序言四段论不是完全固化的,它**可以根据具体的语境、对象、需要,打乱次序、自由调换。**比如:开门见山的方式,先说答案,然后说背景,再说冲突和疑问;或者突出忧虑的方式,先说冲突,再说背景,再说答案;或者先给出一个问题,然后说背景,冲突,最后给出答案。

    2、用“金字塔结构”组织内容

    金字塔结构包括纵向结构和横向结构,用金字塔结构组织内容,简单来讲就是:从金字塔顶端的一个核心观点开始,自上而下,从左往右,沿着各个分支,把你的内容一层一层呈现给别人。这样就能让你的思想变得既有条理又好记。

    (1)金字塔的纵向结构

    金字塔包含塔尖、塔身、塔基三个部分,纵向结构就是梳理好这三者之间的结构、层次。

    运用金字塔纵向结构的方法:

    **首先要结论先行。**比如在给领导汇报工作、或写文案、文章时,应该把你想表达的观点、结论先说出来,而不是说了一大堆事实,然后等着听众或读者来猜。

    **其次要以上统下。**就是上一层的内容必须是对下一层内容的总结概括。比如你希望老板给你加薪,根据以上统下的原则,你应该:先用序言的方法提出你要加薪的想法(塔尖),然后列举说出你为什么想加薪,也就是理由(塔身),最后用事实和数据支撑你加薪的理由(塔基)。

    结论先行是为了突出重点,以上统下是为了划分层次。有了重点有了层次,表达自然会变得清晰分明。

     

    (2)金字塔的横向结构

    金字塔的横向结构说的是塔身和塔身,塔基和塔基之间的逻辑。

    运用金字塔横向结构的方法:

    **首先要进行归类分组,保证每一组的内容属于同一个范畴,同时给每个范畴起个名字。**这个很好理解,就像你整理文件夹的时候,把类似的一些内容整理到一个文件夹中,然后再给这个文件夹贴个标签,命个名。再比如我们熟知的“马斯洛需求理论、时间四象限法、SWOT分析、SMART原则、PDCA循环”等等。把具体的、杂乱的一些内容,进行归纳分组后,既方便我们自身理解和表达,也能让他人更好的理解和接受。

    **其次要遵循逻辑递进的原则,对每组的具体内容按照一定的逻辑顺序进行分解、拆分、排列。**常见的逻辑顺序有三种:一是时间顺序(比如第一步做什么,第二步做什么);二是结构顺序(比如从整体到部分的分解);三是程度顺序(比如“时间四象限法”中处理事情的顺序:先紧急且重要,接着重要但不紧急,再到紧急但不重要,最后不紧急不重要)

    **做归类分组和排列顺序的时候,要符合MECC法则。**MECE法则的意思是“相互独立,完全穷尽”。相互独立说的是拆分的子问题要没有交叉(比如把人分为男人和已婚的人,就有了重叠交叉),完全穷尽说的是拆分的子问题要尽可能周密和面面俱到,不能有遗漏。当然,这是一种理想状态,具体用的时候根据实际情况和自身的需求来细分就可以了。

    我简单举个例子,假如你想“提高自己看书阅读时的速度”,就可以按照MECC的法则对问题进行拆分,分析阻碍阅读速度的原因,然后根据原因有针对性的去调整和练习,从而提高阅读速度。

     

    原文链接: https://zhuanlan.zhihu.com/p/158564217

    展开全文
  • 什么是NIO?NIO的原理是什么机制?

    万次阅读 多人点赞 2018-07-31 18:16:54
    NIO和IO到底有什么区别?有什么关系? 首先说一下核心区别: NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的。所以在效率上的话,肯定是NIO效率比IO效率会高出很多。 NIO不在是和IO一样...

    NIO和IO到底有什么区别?有什么关系?

    首先说一下核心区别:

    1. NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的。所以在效率上的话,肯定是NIO效率比IO效率会高出很多。
    2. NIO不在是和IO一样用OutputStream和InputStream 输入流的形式来进行处理数据的,但是又是基于这种流的形式,而是采用了通道和缓冲区的形式来进行处理数据的。
    3. 还有一点就是NIO的通道是可以双向的,但是IO中的流只能是单向的。
    4. 还有就是NIO的缓冲区(其实也就是一个字节数组)还可以进行分片,可以建立只读缓冲区、直接缓冲区和间接缓冲区,只读缓冲区很明显就是字面意思,直接缓冲区是为加快 I/O 速度,而以一种特殊的方式分配其内存的缓冲区。
    5. 补充一点:NIO比传统的BIO核心区别就是,NIO采用的是多路复用的IO模型,普通的IO用的是阻塞的IO模型,两个之间的效率肯定是多路复用效率更高

    先了解一下什么是通道,什么是缓冲区的概念

    通道是个什么意思?

    1. 通道是对原 I/O 包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象(通道)。一个 Buffer 实质上是一个容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中。 Channel是一个对象,可以通过它读取和写入数据。拿 NIO 与原来的 I/O 做个比较,通道就像是流。
    2. 正如前面提到的,所有数据都通过 Buffer 对象来处理。您永远不会将字节直接写入通道中,相反,您是将数据写入包含一个或者多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。

    缓冲区是什么意思:

    1. Buffer 是一个对象, 它包含一些要写入或者刚读出的数据。 在 NIO 中加入 Buffer 对象,体现了新库与原 I/O 的一个重要区别。在面向流的 I/O 中,您将数据直接写入或者将数据直接读到 Stream 对象中
    2. 在 NIO 库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问 NIO 中的数据,您都是将它放到缓冲区中。
    3. 缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不 仅仅 是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程

    缓冲区的类型:

    ByteBuffer
    CharBuffer
    ShortBuffer
    IntBuffer
    LongBuffer
    FloatBuffer
    DoubleBuffer
    

    NIO的底层工作原理

    先来了解一下buffer的工作机制:

    capacity 缓冲区数组的总长度
    position 下一个要操作的数据元素的位置
    limit 缓冲区数组中不可操作的下一个元素的位置,limit<=capacity
    mark 用于记录当前 position 的前一个位置或者默认是 0

    1.这一步其实是当我们刚开始初始化这个buffer数组的时候,开始默认是这样的
    这里写图片描述
    2、但是当你往buffer数组中开始写入的时候几个字节的时候就会变成下面的图,position会移动你数据的结束的下一个位置,这个时候你需要把buffer中的数据写到channel管道中,所以此时我们就需要用这个buffer.flip();方法,
    这里写图片描述

    3、当你调用完2中的方法时,这个时候就会变成下面的图了,这样的话其实就可以知道你刚刚写到buffer中的数据是在position---->limit之间,然后下一步调用clear();

    这里写图片描述
    4、这时底层操作系统就可以从缓冲区中正确读取这 5 个字节数据发送出去了。在下一次写数据之前我们在调一下 clear() 方法。缓冲区的索引状态又回到初始位置。(其实这一步有点像IO中的把转运字节数组 char[] buf = new char[1024]; 不足1024字节的部分给强制刷新出去的意思)

    补充:

    1、这里还要说明一下 mark,当我们调用 mark() 时,它将记录当前 position 的前一个位置,当我们调用 reset 时,position 将恢复 mark 记录下来的值

    2. clear()方法会:清空整个缓冲区。position将被设回0,limit被设置成 capacity的值(这个个人的理解就是当你在flip()方法的基础上已经记住你写入了多少字节数据,直接把position到limit之间的也就是你写入已经记住的数据给“复制”到管道中)

    3 . 当你把缓冲区的数局写入到管道中的时候,你需要调用flip()方法将Buffer从写模式切换到读模式,调用flip()方法会将position设回0,并将limit设置成之前position的值。buf.flip();(其实我个人理解的就相当于先记住缓冲区缓冲了多少数据)

    这里写图片描述

    NIO其实就是主要利用缓冲区来进行传输字节:

    (客户端和服务端又是怎么进行通信和传输的,以后再来更新)

    NIO 工作代码示例

    public void selector() throws IOException {
    //先给缓冲区申请内存空间
            ByteBuffer buffer = ByteBuffer.allocate(1024);
         //打开Selector为了它可以轮询每个 Channel 的状态
            Selector selector = Selector.open();
            ServerSocketChannel ssc = ServerSocketChannel.open();
            ssc.configureBlocking(false);//设置为非阻塞方式
            ssc.socket().bind(new InetSocketAddress(8080));
            ssc.register(selector, SelectionKey.OP_ACCEPT);//注册监听的事件
            while (true) {
                Set selectedKeys = selector.selectedKeys();//取得所有key集合
                Iterator it = selectedKeys.iterator();
                while (it.hasNext()) {
                    SelectionKey key = (SelectionKey) it.next();
                    if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {
                        ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel();
                     SocketChannel sc = ssChannel.accept();//接受到服务端的请求
                        sc.configureBlocking(false);
                        sc.register(selector, SelectionKey.OP_READ);
                        it.remove();
                    } else if 
                    ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
                        SocketChannel sc = (SocketChannel) key.channel();
                        while (true) {
                            buffer.clear();
                            int n = sc.read(buffer);//读取数据
                            if (n <= 0) {
                                break;
                            }
                            buffer.flip();
                        }
                        it.remove();
                    }
                }
            }
    }
    

    最后给大家看一下整体的NIO的示意图

    这里写图片描述

    补充一下:NIO和Netty的工作模型对比?

    (1)NIO的工作流程步骤:

    1. 首先是先创建ServerSocketChannel 对象,和真正处理业务的线程池
    2. 然后给刚刚创建的ServerSocketChannel 对象进行绑定一个对应的端口,然后设置为非阻塞
    3. 然后创建Selector对象并打开,然后把这Selector对象注册到ServerSocketChannel 中,并设置好监听的事件,监听 SelectionKey.OP_ACCEPT
    4. 接着就是Selector对象进行死循环监听每一个Channel通道的事件,循环执行 Selector.select() 方法,轮询就绪的 Channel
    5. 从Selector中获取所有的SelectorKey(这个就可以看成是不同的事件),如果SelectorKey是处于 OP_ACCEPT 状态,说明是新的客户端接入,调用 ServerSocketChannel.accept 接收新的客户端。
    6. 然后对这个把这个接受的新客户端的Channel通道注册到ServerSocketChannel上,并且把之前的OP_ACCEPT 状态改为SelectionKey.OP_READ读取事件状态,并且设置为非阻塞的,然后把当前的这个SelectorKey给移除掉,说明这个事件完成了
    7. 如果第5步的时候过来的事件不是OP_ACCEPT 状态,那就是OP_READ读取数据的事件状态,然后调用本文章的上面的那个读取数据的机制就可以了

    (2)Netty的工作流程步骤:

    1. 创建 NIO 线程组 EventLoopGroup 和 ServerBootstrap。
    2. 设置 ServerBootstrap 的属性:线程组、SO_BACKLOG 选项,设置 NioServerSocketChannel 为 Channel,设置业务处理 Handler
    3. 绑定端口,启动服务器程序。
    4. 在业务处理 TimeServerHandler 中,读取客户端发送的数据,并给出响应

    (3)两者之间的区别:

    1. OP_ACCEPT 的处理被简化,因为对于 accept 操作的处理在不同业务上都是一致的。
    2. 在 NIO 中需要自己构建 ByteBuffer 从 Channel 中读取数据,而 Netty 中数据是直接读取完成存放在 ByteBuf 中的。相当于省略了用户进程从内核中复制数据的过程。
    3. 在 Netty 中,我们看到有使用一个解码器 FixedLengthFrameDecoder,可以用于处理定长消息的问题,能够解决 TCP 粘包读半包问题,十分方便。
    展开全文
  • IOC:Inversion of Control控制反转,也叫(Dependency Injection)依赖注入。IoC 不是一种技术,只是一种思想。它能指导我们如何设计出松耦合、更...依赖注入还有另一层意思:就是依赖第三方工具完成注入的操作。依...

    IOC:Inversion of Control控制反转,也叫(Dependency Injection)依赖注入。IoC 不是一种技术,只是一种思想。它能指导我们如何设计出松耦合、更优良的程序。比如在程序中,依赖注入就是利用某种工具,将依赖注入到需要的位置。就好比:

    药物注入就是利用注射器,将药物注入到需要的人体中,就是药物注入。

    依赖注入还有另一层意思:就是依赖第三方工具完成注入的操作。依赖注入的核心原理是注解和反射。
    优点是

    1. 内存控制:统一管理对象,避免对象乱创建导致额外的内存开销。便于内存的优化。
    2. 降低耦合度:便于项目的扩展、易于维护。如果IoC+接口情况下,删除任意实现类都不会导致程序编译出错。虽然运行到特定得代码会报错,但是其他代码在使用时不会有问题-----从侧面也反应出是松耦合。

    AOP(Aspect-Oriented Programming): 面向切面编程
    AOP的主要原理:动态代理。
    代理模式:静态代理和动态代理(JDK动态代理、CGLib动态代理)。
    静态代理:针对每个具体类分别编写代理类;针对一个接口编写一个代理类;
    动态代理的原理:反射。
    AOP优点是:

    1. AOP实现日志管理:方法的开始记录入参,方法结束需要记录返回值和运行时间。
    2. AOP比IoC更简单,直白点说就是实现调用某个方法之前或/和之后,自动执行一系列自定义的语句。

    spring 的AOP和IOC都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。
    注:

    [CGLib采用ASM字节码框架将被代理类的字节码重组,产生成一个新的类,从而实现的代理,ASM是Java的一个字节码框架]
    展开全文
  • FPGA 之 DDS简易 原理阐述

    千次阅读 2018-05-29 09:14:59
    DDS(Direct Digital Synthesizer) 即数字合成器 ,可以通过修改...其原理图如下图所示 下面以代码的形式来解释此图的原理 假设Clk 时钟频率为100MHZ 周期为10ns ,假设 data 可以组成32点正弦波信号 always@...
  • 那么,Banner是什么意思,网站banner设计与广告怎么做? 根据以往个人网站推广的经验,我们将通过如下内容阐述: Banner是什么意思? 简单理解:banner基于网站的角度来讲,它主要是指页面中
  • 【编译原理】编译原理简单介绍

    万次阅读 多人点赞 2017-05-07 13:27:20
    编译原理简单介绍编译原理简单介绍 什么叫编译程序 翻译程序 编译程序 翻译和编译的区别 编译的过程 词法分析 语法分析 语义分析和中间代码的产生 优化 目标代码生成 编译程序的结构 编译程序总框 表格与表格的管理 ...
  • 编译原理基本概念和术语

    千次阅读 2020-03-26 21:00:25
    它的形式化定义是一个四元组,即 : 下面我们先给出一个自然语言的例子,然后借此来解释四元组的各个成分都是什么。 <句子> → <主语> <谓语> <主语> → <代词> | <名词> <谓语> → <动词> <代词> → 你 | 我 | 他 ...
  • “广播”指的是在不同维度的数组之间进行算术运算的一...下面,我们看看这个机制的原理是怎么样的,从而可以帮助我们更好的利用“广播”这个强大的功能。  首先,我们对“广播”进行一个大概的理解。顾名思义,“...
  • * 过滤器 Filter 的工作原理 */ public class FilterTest implements Filter { public void destroy () { System.out.println( "----Filter销毁----" ); } public void doFilter...
  • 什么是这样?在昨天的分享中,我们已经提到了,比特币是区块链的前身实现,区块链是比特币的后期提炼,两者的逻辑关系决定了比特币是个绕不开的家伙;如果大家是初次接触比特币,当你想和别人交流的时候,面对的第...
  • 难理解的是步骤二,因为不知道为什么20根地址线的存储器容量是1MB,这跟存储器的构造有关,但是这部分内容就考察这么多,不建议大家过多了解。 2.运算器(后面章节会讲,先了解有这么个东西) 大部分ALU都可以完成...
  • 图解LVS的工作原理

    万次阅读 多人点赞 2018-05-14 22:46:30
    LVS工作原理 NAT模式 DR模式 内核参数详解 arp_ignore arp_announce TUN工作模式 full-nat模式 LVS调度算法介绍 ipvsadm使用指南 NAT和DR模式的实现 NAT模式的实现 DR模式的实现 调度器配置 WEB后端服务器配置 实验...
  • 比特币基本原理系列

    万次阅读 2019-05-13 18:41:17
    我们说”不可更改性“时,通常的意思是,它在实践是哦那个是不可更改的,而不是绝对不可更改的(译者注:即在技术上不可更改)。即便黄金,加入足够多的能量也会熔化。 作者注3:其中一种办法是权益证明(Proof-...
  • 拜托!面试请不要再问我Spring Cloud底层原理

    万次阅读 多人点赞 2019-02-27 14:53:23
    以上就是我们通过一个电商业务场景,阐述了Spring Cloud微服务架构几个核心组件的底层原理。   文字总结还不够直观?没问题! 我们将Spring Cloud的5个核心组件通过一张图串联起来,再来直观的感受一下其...
  • 广播风暴的产生原因和原理什么?

    千次阅读 2013-01-18 17:31:00
    广播风暴的产生原因和原理什么?  网吧行业竞争的加剧,出现了一些规模比较大的网吧。目前在网吧行业内,百台以上的网吧已经随处可见了。由于网吧在进行网络建设时,缺乏专业的网络技术支持,使得网吧的网络故障...
  • style 标签属性 scoped 的作用和原理

    千次阅读 2021-01-22 11:07:31
    2、原理 通过使用postCss来实现转换,给dom增加一个动态属性,然后css属性也额外添加对应的属性来选择该dom,达到该样式只作用于含有该属性的dom,实现组件样式的模块化。 转换前: <templete> <
  • pwm的工作原理

    千次阅读 2015-07-22 23:43:00
    3、然后设置脉冲的具体宽度,它的基本原理是通过寄存器TCNTBn来对寄存器TCNTn(内部寄存器)进行配置计数,TCNTn是递减的,如果减到零,则它又会重新装载TCNTBn里的数,重新开始计数,而寄存器TCMPBn作为比较寄存器...
  • 本文主要是关于13001和13003的相关介绍,并着重对13001和13003的管脚进行了详尽的阐述。 三极管 三极管,全称应为半导体三极管,也称双极型晶体管、晶体三极管,是一种控制电流的半导体器件其作用是把微弱信号放大...
  • HDFS原理详解: 产生背景 以文件为基本存储单位的缺点 1、文件大小不同,难以实现负载均衡。 2、处理一个文件时,只能利用一个节点资源,无法动用集群。 HFDS的定义 ...
  • MapReduce工作原理详解(学习笔记)

    千次阅读 2019-02-26 11:16:56
    归并的意思:生成key和对应的value-list。 在Map任务全部结束之前进行归并,归并得到一个大的文件,放在本地磁盘。  合并(Combine)和归并(Merge)的区别:  两个键值对<“a”,1>和<“a”,1>,如果合并,会...
  • (尊重劳动成果,转载请注明出处:https://yangwenqiang.blog.csdn.net/article/details/91345678冷血之心的博客) 关注微信公众号(文强的技术小屋),学习更多技术...MySQL原理与实践(二):一条update语句引...
  • 傅里叶变换原理精讲

    千次阅读 多人点赞 2019-06-11 13:34:16
    一、什么是频域 从我们出生,我们看到的世界都以时间贯穿,股票的走势、人的身高、汽车的轨迹都会随着时间发生改变。这种以时间作为参照来观察动态世界的方法我们称其为时域分析。而我们也想当然的认为,世间万物...
  • 先从有监督问题谈起,形式上,无论解析还是非解析,有监督问题都可看作根据已知数据在全体映射空间F中寻找最优映射f*(x)=y,其中x为...不知道大家是否考虑过凭什么“每次增1”是规律,而“先增三次1然后保持不变然后再.
  • 20170709_简述ARP的工作原理

    万次阅读 2017-07-09 14:38:58
    简述ARP的工作原理
  • 单片机入门——单片机的基本构成及工作原理(1)

    万次阅读 多人点赞 2018-03-31 11:30:21
    在单片机入门系列讲座中,首先学习单片机的基本构成和工作原理、以及外围功能电路,然后,挑战一个实际单片机的运行。单片机是控制电子产品的大脑现如今,我们生活中的许多电器都使用了单片机。例如:手机、电视机、...
  • 前端必经之路:浏览器底层工作原理

    千次阅读 多人点赞 2019-06-27 16:48:45
    今天要写的是一篇关于浏览器底层工作原理的技术科普文,作为一个前端爱好者,在平时的日常工作中,最常打交道的莫过于浏览器了。不过,大多数人并不知道,在我们打开浏览器并浏览一个网页时,浏览器底层具体进行了...
  • 计算机最最最底层的 工作原理是怎么运行的

    万次阅读 多人点赞 2018-05-12 15:45:59
    我很想知道最最基本的工作原理,但是大学里好多课程,数字逻辑,计算机组成原理,只是从不同层次上解释了计算机的工作原理,很可惜的是,我并没有把知识穿起来。看了很多人的回答,大家也只是解释了一部分问题,没有...
  • 关键词是什么意思

    千次阅读 2018-11-09 08:17:14
    关键词是什么意思? 用户只有通过关键词搜索,才能找到满足自己需求的结果。关键词优化的好与坏,关系到seoer最关注的排名的好与坏,关系到需求...本文从多个角度阐述关键词是什么意思。 一:什么是关键词? 从百科...
  • 又如,句子“一个空洞,没有内涵的作品”和“一个不空洞而且有内涵的作品”的BOW相似度很高,但实际上它们的意思很不一样。 在本教程中,我们所要介绍的深度学习模型克服了BOW表示的上述缺陷,它在考虑词顺序的基础...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,409
精华内容 11,363
关键字:

原理阐述是什么意思