首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

网络IO之阻塞、非阻塞、同步、异步总结

1、前言   在网络编程中,阻塞、非阻塞、同步、异步经常被提到。unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解。...2、数据流向   网络IO操作实际过程涉及到内核和调用这个IO操作的进程。...3、网络IO模型详细分析   常见的IO模型有阻塞、非阻塞、IO多路复用,异步。以一个生动形象的例子来说明这四个概念。周末我和女友去逛街,中午饿了,我们准备去吃饭。...这就是典型的阻塞网络中IO阻塞如下图所示: ?   (2)我女友不甘心白白在这等,又想去逛商场,又担心饭好了。所以我们逛一会,回来询问服务员饭好了没有,来来回回好多次,饭都还没吃都快累死了啦。...这就是非阻塞。需要不断的询问,是否准备好了。网络IO非阻塞如下图所示: ?

1.1K50

网络编程 同步,阻塞,异步,非阻塞之区别

网络编程之同步,阻塞,异步,非阻塞 同步:函数没有执行完不返回,线程被挂起 阻塞:没有收完数据函数不返回,线程也被挂起 异步:函数立即返回,通过事件或是信号通知调用者 非阻塞:函数立即返回,通过select...异步=非阻塞? 同步是在操作系统层面上,阻塞是在套接字上 Reactor是同步 Proactor是异步?...回答:同步、异步、阻塞和非阻塞的概念在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。这些方式彼此概念并不好理解。 下面是我对这些术语的理解。...非阻塞阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。对象的阻塞模式和阻塞函数调用对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。...阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状 态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。

35720
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java|网络IO之同步、异步、阻塞、非阻塞

    一、网络IO操作过程 对于一个网络IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的过程process (or thread),另一个就是系统内核(kernel)。...二、网络IO模型详细分析 常见的网络IO模型有blocking IO(阻塞)、nonblocking IO(非阻塞)、IO multiplexing(IO多路复用)、signal driven IO(...这就是典型的阻塞网络中IO阻塞如下图所示: blocking IO(阻塞) 当用户进程调用了recvfrom这个系统调用,内核就开始了IO的第一个阶段:准备数据。...对于网络IO来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候内核就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。...网络IO非阻塞如下图所示: nonblocking IO(非阻塞) 从图中可以看出,当用户进程发出read操作时,如果内核中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error

    2.9K80

    网络IO(NIO)之阻塞、非阻塞、同步、异步总结

    网络IO之阻塞、非阻塞、同步、异步总结 1、前言   在网络编程中,阻塞、非阻塞、同步、异步经常被提到。...2、数据流向   网络IO操作实际过程涉及到内核和调用这个IO操作的进程。...3、网络IO模型详细分析   常见的IO模型有阻塞、非阻塞、IO多路复用,异步。以一个生动形象的例子来说明这四个概念。周末我和女友去逛街,中午饿了,我们准备去吃饭。...这就是典型的阻塞网络中IO阻塞如下图所示: ?   (2)我女友不甘心白白在这等,又想去逛商场,又担心饭好了。...这就是非阻塞。需要不断的询问,是否准备好了。网络IO非阻塞如下图所示: ?

    82440

    玩转 PHP 网络编程全套阻塞与非阻塞 IO

    ok,以上通信没问题 现在用telent工具来折腾下它 启动服务时 我们看到客户端与服务器端是可以正常来往通信的,我们看到服务器运行时它是处于accept阻塞进程的。 连接服务时 ?...阻塞IO与非阻塞IO 我觉得光解释不行的,你得撸上代码去体验 阻塞IO【阻塞的文件描述符】: 执行系统调用【读写请求】时不会立即返回,需要等待就绪事件【读写事件】发生,操作系统会让程序挂起来【SLEEPING...】 非阻塞IO: 执行系统调用后,程序会立即返回,如果事件没有发生会返回-1,同时会带有出错信息如EAGAIN,EWOULDBLOCK,EINPROGRESS 那我们下面来写一个非阻塞的TCP服务 非阻塞的...IO【非阻塞的文件描述符】 设置非阻塞的函数 ps:在c语言里一般用fcntl去控制文件描述符 socket_set_nonblock($socket); stream_set_blocking( resource...同样的我们不设置为非阻塞模式时,它默认是阻塞IO

    1.4K20

    Java网络编程--NIO非阻塞网络编程

    从Java1.4开始,为了替代Java IO和网络相关的API,提高程序的运行速度,Java提供了新的IO操作非阻塞的API即Java NIO。...有两种创建SocketChannel的形式,一个是客户端主动发起和服务器的连接,还有一个就是服务端获取的新连接。...核心代码示例片段: // 创建网络服务端 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); // 设置为非阻塞模式...Selector实现一个线程处理多个通道的核心在于事件驱动机制,非阻塞网络通道下,开发者通过Selector注册对于通道感兴趣的事件类型,线程通过监听事件来触发相应的代码执行。...Tomcat8中已经完全移除了BIO相关的网络处理代码,默认采用NIO进行网络处理。

    89820

    Java网络编程--BIO阻塞网络编程

    阻塞IO的含义 阻塞(blocking)IO :阻塞是指结果返回之前,线程会被挂起,函数只有在得到结果之后(或超时)才会返回 非阻塞(non-blocking)IO :非阻塞阻塞的概念相对应,指在不能立刻得到结果之前...BIO网络编程 首先我们来看一段最基础的Java网络编程代码示例: 服务器端代码示例: public class BIOServerV1 { public static void main(String...outputStream.write(message.getBytes(Charset.forName("UTF-8"))); scanner.close(); socket.close(); } } 这个版本服务器端的代码同一时刻只能支持一个网络连接...BIO网络编程处理浏览器请求 在了解了HTTP协议的内容之后我们就可以依据HTTP协议的内容编写程序来处理浏览器请求。...使用的比较多的是Java NIO网络编程,该部分内容我们将在下一部分继续。

    96930

    Java网络编程——BIO阻塞IO

    BIO(Blocking IO)也就是阻塞IO,当服务端和客户端交互时,如果服务端接收了一个客户端请求,就要为这个客户端一直服务直到结束,否则无法为下一个客户端服务。BIO就属于同步阻塞IO。...BIO单线程处理请求 BIO服务器端: @Slf4j public class BIOServer { @SneakyThrows public static void main(String...[] buffer=new byte[64]; socket.getInputStream().read(buffer); // 如果没有读取到当前客户端发送的数据,会阻塞在这里...但又带来了新的问题:每接收一个客户端就用一个线程去处理,如果创建的线程过多,会消耗大量的服务器资源,即使用线程池的方式来限制线程数量和上下文切换,如果多个客户端连接成功后都等待,也会导致服务端的线程都阻塞...---- 转载请注明出处——胡玉洋 《Java网络编程——BIO阻塞IO》

    30310

    BIO 阻塞网络编程

    4xx(请求错误):这些状态代码表示请求可能出错,妨碍了服务器的处理。 5xx(服务器错误):这些状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。...阻塞 IO 的含义 阻塞(blocking) IO:资源不可用时,IO 请求一直阻塞,直到反馈结果(有数据或者超时)。...阻塞/非阻塞是获取资源的方式,同步/异步是程序如何处理资源的逻辑设计。 代码中使用的 API:ServerSocket#accept、InputStream#read 都是阻塞的 API。...操作系统底层 API 中,默认 Socket 操作都是 Blocking 型,send/recv 等接口都是阻塞的。 阻塞导致在处理网络I/O时,一个线程只能处理一个网络连接。 3....BIO 网络编程 1.

    33910

    NIO 非阻塞网络编程

    可以非阻塞读取和写入通道。 通道始终读取和写入缓冲区。 2. SocketChannel SocketChannel 用于建立 TCP 网络连接,类似 java.net.Socket。...非阻塞网络通道下,开发者通过 Selector 注册对于通道感兴趣的事件类型,线程通过监听事件来触发相应的代码执行。(扩展:更底层是操作系统的多路复用机制) ? 5....服务器端代码 /** * 直接基于非阻塞的写法 */ public class NIOServer1 { public static void main(String[] args) throws...IOException { // 创建网络服务器 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open...结合 Selector 实现非阻塞服务器 /** * 结合 Selector 实现的非阻塞服务器(放弃对 Channel 的轮询,借助消息通知机制) */ public class NIOServer3

    39620

    服务器模型——从单线程阻塞到多线程非阻塞(上)

    该系列分成三部分: 单线程/多线程阻塞I/O模型 单线程非阻塞I/O模型 多线程非阻塞I/O模型,Reactor及其改进 前言 这里探讨的服务器模型主要指的是服务器端对I/O的处理模型。...从不同维度可以有不同的分类,这里从I/O的阻塞与非阻塞、I/O处理的单线程与多线程角度探讨服务器模型。 对于I/O,可以分成阻塞I/O与非阻塞I/O两大类型。...单线程阻塞I/O模型 单线程阻塞I/O模型是最简单的一种服务器模型,几乎所有程序员在刚开始接触网络编程时都从这个简单的模型开始。...而阻塞I/O是指服务器在读写数据时是阻塞的,读取客户端数据时要等待客户端发送数据并且把操作系统内核复制到用户进程中,这时才解除阻塞状态。...这种阻塞网络编程带来了一个问题,服务器必须要等到客户端成功接收才能继续往下处理另外一个客户端的请求,在此期间线程将无法响应任何客户端请求。

    1.5K50

    python 网络编程学习 非阻塞soc

    主要学习服务器的异步使用 SocketServer简化了网络服务器的编写。它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。...创建服务器的步骤 创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()方法。 实例化一个服务器类,传入服务器的地址和请求处理程序类。...daemon_threads指示服务器是否要等待线程终止,要是线程互相独立,必须要设置为True,默认是False。...                                                                                                                                                                        可以看到基本套路都差不多,就是替换了一些处理类 而在大型网络服务器应用中...这里可以了解一下,select,poll ,epoll三个模块 link 先用select的select模块编写一个聊天室服务器

    1K20

    阻塞阻塞读写总结、tcp网络编程的本质、muduo::Buffer设计简介

    但如果 socket文件描述符有 O_NONBLOCK标志,则 write不阻塞,直接返回 20;此时非阻塞地read 也直接返回20。.../usr/include/i386-linux-gnu/bits/socket.h     MSG_WAITALL = 0x100 5、在多线程环境中,某个线程的阻塞不会引起进程的阻塞,除非进程中的所有线程都被阻塞...(pthread) 二、TCP网络编程的本质 TCP网络编程最本质是的处理三个半事件(来自:muduo manual.pdf) 1....这是最为重要的一个事件,对它的处理方式决定了网络编程的风格(阻塞还是非阻塞,如何处理分包,应用层的缓冲如何设计等等)。 3.5 消息发送完毕,这算半个。...参考: 《UNP》 muduo manual.pdf 《linux 多线程服务器编程:使用muduo c++网络库》

    3.4K20

    最全服务器模型详解——从单线程阻塞到多线程非阻塞

    该系列分成三部分: 单线程/多线程阻塞I/O模型 单线程非阻塞I/O模型 多线程非阻塞I/O模型,Reactor及其改进 前言 这里探讨的服务器模型主要指的是服务器端对I/O的处理模型。...从不同维度可以有不同的分类,这里从I/O的阻塞与非阻塞、I/O处理的单线程与多线程角度探讨服务器模型。 对于I/O,可以分成阻塞I/O与非阻塞I/O两大类型。...单线程阻塞I/O模型 单线程阻塞I/O模型是最简单的一种服务器模型,几乎所有程序员在刚开始接触网络编程时都从这个简单的模型开始。...而阻塞I/O是指服务器在读写数据时是阻塞的,读取客户端数据时要等待客户端发送数据并且把操作系统内核复制到用户进程中,这时才解除阻塞状态。...这种阻塞网络编程带来了一个问题,服务器必须要等到客户端成功接收才能继续往下处理另外一个客户端的请求,在此期间线程将无法响应任何客户端请求。

    2.8K50

    同步、异步、阻塞、非阻塞

    阻塞与非阻塞   应用进程请求I/O操作时,如果数据未准备好,如果请求立即返回就是非阻塞,不立即返回就是阻塞。简单说就是做一件事如果不能立即获得返回,需要等待,就是阻塞,否则就可以理解为非阻塞。...阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同的。...socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。...非阻塞阻塞阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...同步/异步与阻塞/非阻塞的组合 同步阻塞形式: 等待执行结果是一直等待,执行时线程挂起(未对fd 设置O_NONBLOCK 标志位的read/write 操作) 同步非阻塞形式:等待执行结果是一直等待,

    3K40

    同步异步,阻塞阻塞

    什么是阻塞和非阻塞 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。...阻塞与非阻塞的区别: 阻塞是程序在调用系统函数IO时,在系统执行系统调用时由CPU通过轮询等方式来实现数据的IO。 非阻塞是在程序级别通过轮询/信号/事件的机制,去查看IO数据是否就绪。...一个网络包从应用程序A发到另一台电脑上的应用程序B,需要经历: 从A的业务代码到A的软件框架 从A的软件框架到计算机的操作系统内核 从A所在计算机的内核到网卡 从网卡经过网线发到交换机等设备,层层转发,...可以是阻塞或非阻塞阻塞则一直在等待内核/应用程序把IO数据准备好,非阻塞则是直接返回内核/应用程序是否已经准备好数据。 应用程序框架:同步或异步。...IO多路复用,同步,异步,阻塞和非阻塞 区别 关于异步,同步,阻塞与非阻塞 解读I/O多路复用技术

    3.2K60
    领券