`

IO通信模型介绍(未完待续)

 
阅读更多

 

IO:程序中使用IO流,需要和操作系统的内核打交道,在Linux内核中,IO会被看做是一个描述符(FD:文件描述符,/SD:网络描述符),这个描述符会指向一个结构体

 

阻塞IO模型:传统的IO最大的缺点就是它是阻塞的,当某个客户端发送数据过来,当前的线程必须要等该链接将数据全部发送到系统buffer中,然后从系统的buffer空间移动到进程(应用程序)的buffer空间,在这段时间,线程只能傻傻的在等待,资源被严重浪费,一般情况下,一个请求就是一个链接,早起操作系统对线程连接数也有要求,所以,在处理高并发的时候,这个是一个瓶颈问题。

 

非阻塞IO模型:非阻塞模型主要是线程会轮询检查内核数据是否到来,如果到的话,就 处理,如果没有到的话,就返回,等待下次被轮询检查

 

 

IO多路复用模型:多路复用利用到了,Linux系统内核自带的select/poll/epoll技术,主要原理就是,将fd/sd注册给select/poll/epoll系统,阻塞会发生在这些系统上,select/poll/epoll会轮询检查注册在上面的fd的状态,如果就绪,就立即回调。select/poll:它们是顺序轮询fd/sd,而且最大注册数有限制,所以性能不能达到最好。epoll:使用事件驱动的方式进行轮询,最大注册数理论上是操作系统的最大文件句柄数。注意:java的NIO的Selector是基于epoll技术来实现的

     select/poll特点:

  • 由于在上面注册了很多fd的数据,是一个集合,但是实际上会存在很多空闲链路,但是这种顺序的轮询,会导致效率大幅下降
  • 最大注册数有限

      epoll特点:

  • 它只会针对非空闲链路进行轮询,效率大幅提高
  • 最大注册数不受限制,只受限于操作系统的最大文件句柄数

 

异步IO:用户进程向内核启动一个请求,然后就是内核帮助我们做完所有的事情,接受完数据并从操作系统内核缓冲区拷贝到用户缓冲区。特点是:帮助我们做完,才通知。

 

 

网络编程的模式:一般情况是服务端暴漏一个IP和端口地址,监听这个端口的请求,客户端根据这个地址,发送请求,先是进行TCP三次握手链接,然后进行通信。

 

BIO模型:服务端监听某个端口,有一个Acceptor线程专门监听客户端链接,如果有则创建一个新的线程与之通信,在通信完成之后,将销毁该工作线程。整个过程将创建大量的线程,消耗服务端大量的资源,在并发达到一定的量之后,系统会崩溃。

 

伪异步IO:本质上是在BIO模型的基础上,服务端加入了一个线程池的概念,客户端连接的请求时,服务端会从线程池中获取一个线程进行处理,但是如果并发量特别大的时候,客户端任务会被加入到队列任务中,长时间客户端没有接受到回复,会认为超时。

 

 

 

 

 线程切换:因为一个处理器同一时刻只能运行一个线程,所以多个线程只能是轮流执行,从执行某一个线程改为执行另一个线程的过程就是线程切换。

频繁切换是指创建了很多个线程,CPU要轮流执行这些线程,因为切换线程需要一定的时间,当线程数量较少时,切换的时间可以忽略不计,而线程数量很多(大约几百个,与物理内存容量有关)时,由于物理内存不足,切换线程需要从虚拟内存中交换数据,所以花费的时间大大增加,导致系统效能降低。

 

 

同步同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列

 

 

异步不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。

 

阻塞阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。函数只有在得到结果之后才会返回。

 

非阻塞非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加。增加的CPU执行时间能不能补偿系统的切换成本需要好好评估

 

 

非阻塞的一种解释:

In JavaScript, almost all I/O is non-blocking. This includes HTTP requests, database operations and disk reads and writes; the single thread of execution asks the runtime to perform an operation, providing a callback function and then moves on to do something else. When the operation has been completed, a message is enqueued along with the provided callback function. At some point in the future, the message is dequeued and the callback fired.

在js中,几乎所有的I/O都是非阻塞(译者注:简单的说就是在读文件或数据库时,程序不暂停等待结果,而是继续执行,等读到了结果后去执行)的.包括HTTP请求,数据库操作还是文件读写.线程执行了一个I/O操作时返回一个回调函数,然后继续执行其他程序.当那个操作完成时,一个携带着回调函数的(完成)消息被加到消息队列,在后来某个点,这个消息出队,相应的回调函数被执行.

 

 

 

 

分享到:
评论

相关推荐

    LinuxIO通信模型漫谈.pdf

    本文将从 Unix/Linux 接口出发,介绍几种常用的 IO 模型,并分析它们的优缺点。 阻塞型 IO 模型 阻塞型 IO 模型是最基本的 IO 模型,使用 listen()、send()、recv() 等接口来实现网络通信。这些接口在调用时都可能...

    Factory IO 电梯模型

    "Factory IO 电梯模型"是基于Factory IO软件的一个模拟案例,该软件主要用于工业自动化和流程控制系统的教学与设计。在Factory IO中,用户可以创建、模拟和测试各种工厂自动化环境,提升理解和操作技能。电梯模型...

    ABB变频器使用PROFINET IO通信协议时的输入和输出介绍.docx

    当ABB变频器采用PROFINET IO通信协议时,实现与PLC(可编程逻辑控制器)或其他设备的数据交互变得尤为重要。PROFINET IO是一种基于以太网的实时通讯标准,特别适用于自动化系统的高速数据传输。 首先,我们来看一下...

    windows网络通信IO模型 socket课件详细完整

    windows网络socket模型 异步通信模型 select模型 异步选择 异步事件 重叠IO 完成端口 详细介绍了区别 用法与实例

    网络编程IO模型源代码

    在IT领域,网络编程是构建分布式系统和网络应用的基础,而理解不同的IO(输入/输出)模型对于优化网络服务性能至关重要。本主题聚焦于“网络编程IO模型源代码”,特别是使用C++语言和Windows Socket(Winsock)API的...

    IO模型介绍,理解java常见的IO模型

    ### IO模型介绍与Java常见IO模型详解 #### 一、引言 在计算机科学领域,输入输出(Input/Output,简称IO)模型是系统中处理数据传输的关键技术之一。随着互联网的发展,网络通信的需求日益增长,传统的IO模型已经...

    重叠IO模型

    重叠IO模型是一种高效处理输入/输出(I/O)操作的机制,特别是在多任务和并发环境中。这种模型允许操作系统在进行I/O操作的同时处理其他任务,从而提高系统资源的利用率和程序的响应速度。在本文中,我们将深入探讨...

    IO模型介绍

    ### IO模型介绍 #### 一、IO概述 **IO**,即输入(Input)与输出(Output),是计算机系统中数据交互的基础。数据通过IO类库在内部表示与外部表示之间进行转换,这一过程涉及多种步骤和技术。 #### 二、内部表示与...

    S7-1500与ET200SP分布式IO进行Profinet_IO通信具体组态步骤.rar

    以下将详细介绍S7-1500与ET200SP进行Profinet IO通信的具体组态步骤。 首先,确保硬件准备就绪。拥有S7-1500 CPU、ET200SP I/O模块、Profinet电缆以及相关的电源和接线设施。确保所有设备都符合电源和电压要求,并...

    Linux下IO模型及epoll介绍

    Linux IO模型 epoll 多进程模型 Socket

    Socket IO模型介绍

    Socket IO模型是网络编程中用于实现进程间通信的关键技术,特别是在服务器端开发中扮演着重要角色。本文将详细探讨Windows平台下支持的六种Socket IO模型,并以生动的例子进行解释。 首先,我们来看第一种模型——`...

    ABB机器人的IO通信.doc

    ABB[a]-J-4ABB 机器人的 IO 通信 4.1 任务目标 ¬ 了解 ABB 机器人 I/O 通信的种类。 ¬ 掌握常用 ABB 标准 I/O 板的配置。 ¬ 掌握 Profibus 适配器与 PLC 进行通信的配置方法。 4.2 任务描述 ν 以 ABB 标准 I/O ...

    WinSock 异步IO模型

    WinSock异步IO模型是Windows Socket编程中一种高效的数据传输方式。它允许应用程序在等待数据传输完成时执行其他任务,从而提高系统资源利用率和程序响应性。与传统的同步IO模型不同,异步IO不会阻塞调用线程,而是...

    S7-200 SMART 之间 PROFINET IO 通信 附源码

    从而,两个 S7-200 SMART 之间可以进行 PROFINET IO 通信,一个 CPU 作 PROFINET IO 控制器,一个CPU 作PROFINET IO通信的设备。组态的时候有两种方法,一 种是通过硬件目录组态,另外一种是通过GSD文件组态。 ...

    ABB变频器使用PROFINET IO通信模块时的激活方法.docx

    ABB变频器与PROFINET IO通信模块的激活方法涉及到一系列步骤,主要目的是确保ABB变频器能够通过PROFINET IO接口与其它设备进行高效、可靠的通讯。PROFINET IO是一种基于工业以太网的实时通信标准,尤其适用于自动化...

    ABB机器人的IO通信.pdf

    ### ABB机器人的IO通信知识点...通过以上详细的介绍和分析,我们可以了解到ABB机器人IO通信的强大功能及其在工业自动化领域的广泛应用。这些技术不仅提升了机器人的灵活性和适应性,还极大地提高了生产线的整体效率。

    Winsockt_IO模型

    Winsockt_IO模型是Windows操作系统中用于网络编程的重要组件,它提供了一套接口,使得开发者可以利用TCP/IP协议栈进行网络通信。这个模型是基于Windows Socket API(通常简称为Winsock)的,允许应用程序进行高效的...

    IO模型编程实例

    在计算机科学中,IO(Input/Output)模型是处理数据输入和输出的关键方式。不同的IO模型决定了程序如何等待、处理和响应数据传输。本篇文章将深入探讨四种主要的IO模型:阻塞IO、无阻塞IO、多路复用IO(也称为选择器...

    PROFINET现场设备及通信模型

    PROFINET现场设备及通信模型的知识点可以分为几个部分来详细说明,包括PROFINET IO通信方式、特性、与PROFIBUS的比较以及在工业自动化中的应用。 首先,PROFINET IO是西门子提出的工业以太网通信协议,它基于工业...

    S7-300 PROFINET IO 通信快速入门.pdf

    在讨论S7-300 PROFINET IO通信快速入门时,必须首先理解PROFINET的基础知识。PROFINET是一种创新的、开放式的工业以太网标准,它符合IEC61158标准,广泛应用于工业自动化领域。它基于工业以太网技术,采用TCP/IP协议...

Global site tag (gtag.js) - Google Analytics