Linux设备驱动中的阻塞和非阻塞I/0,简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式。...非阻塞操作:在不能进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直到可以进行操作。...非阻塞应用程序通常使用select系统调用查询是否可以对设备进行无阻塞的访问最终会引发设备驱动中 poll 函数执行。...|O_NONBLOCK); //O_NONBLOCK 非阻塞标识 ..... while(read(fd,&buf,1)!...非阻塞I/O的操作在应用层通常会用到select()和poll()系统调用查询是否可对设备进行无阻塞访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被调用。
当一个异步过程调用发出后,*被调用者*通过状态,通知来通知*调用者*,或者通过回调函数处理这个调用 2.阻塞和非阻塞 # 阻塞和非阻塞关注的是程序在等待调用结果时的状态 # 阻塞调用是指调用结果返回之前...调用线程只有在得到结果之后才返回 # 非阻塞调用是指在不能立即得到结果之前,该调用不会阻塞当前线程 通俗例子一: #老张爱喝茶 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn
非阻塞connect详情介绍可以参见文章:https://blog.csdn.net/qq_41453285/article/details/89890429 一、非阻塞connect概述 man手册...解析文档,非阻塞connect如何使用: ①当我们将sock设置为非阻塞之后,使用connect去连接服务端,即使服务端开启了,connect系统调用也不会连接成功,connect而是以失败告终,并返回错误...②但是非阻塞connect返回的错误是有讲究的: 如果非阻塞connect返回的错误是EINPROGRESS,代表不是connect系统调用出错了,而是connect可能会在后面才会建立完整地连接(...,进一步来等待非阻塞connect客户端与服务端建立完整地连接,在等待的过程中,如果非阻塞connect建立成功了,客户端的sock_fd就会变成可写的(这个在本人的IO复用文章中介绍过,见下图) ④当非阻塞...于是在后面的select中等待非阻塞connect建立成功并且客户端fd变为可写的。
网络编程之同步,阻塞,异步,非阻塞 同步:函数没有执行完不返回,线程被挂起 阻塞:没有收完数据函数不返回,线程也被挂起 异步:函数立即返回,通过事件或是信号通知调用者 非阻塞:函数立即返回,通过select...通知调用者 这样看来异步和非阻塞有什么区别呢?...回答:同步、异步、阻塞和非阻塞的概念在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。这些方式彼此概念并不好理解。 下面是我对这些术语的理解。...如果执行部 件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重 的错误)。...阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状 态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。
从Java1.4开始,为了替代Java IO和网络相关的API,提高程序的运行速度,Java提供了新的IO操作非阻塞的API即Java NIO。...ServerSocketChannel的核心方法accept()方法,如果通道处于非阻塞模式,那么如果没有挂起的连接,该方法将立即返回null,实际使用中必须检查返回的SocketChannel是否为null...核心代码示例片段: // 创建网络服务端 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); // 设置为非阻塞模式...Selector实现一个线程处理多个通道的核心在于事件驱动机制,非阻塞的网络通道下,开发者通过Selector注册对于通道感兴趣的事件类型,线程通过监听事件来触发相应的代码执行。...服务端代码示例: // 结合Selector实现的非阻塞服务端(放弃对channel的轮询,借助消息通知机制) public class NIOServer { public static void
简介 什么叫阻塞和非阻塞 select fd_set类型的变量相关宏定义 fcntl 实例 select总是返回1的问题。...什么叫阻塞和非阻塞 阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回。...使用Select就可以完成非阻塞(所谓非阻塞方式non- block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同...NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态。...一定等到监视文件描述符集合中某个文件描述符发生变化为止 若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值 timeout
阻塞IO与非阻塞IO 我觉得光解释不行的,你得撸上代码去体验 阻塞IO【阻塞的文件描述符】: 执行系统调用【读写请求】时不会立即返回,需要等待就绪事件【读写事件】发生,操作系统会让程序挂起来【SLEEPING...】 非阻塞IO: 执行系统调用后,程序会立即返回,如果事件没有发生会返回-1,同时会带有出错信息如EAGAIN,EWOULDBLOCK,EINPROGRESS 那我们下面来写一个非阻塞的TCP服务 非阻塞的...IO【非阻塞的文件描述符】 设置非阻塞的函数 ps:在c语言里一般用fcntl去控制文件描述符 socket_set_nonblock($socket); stream_set_blocking( resource...sleep(1); } } } socket_close($sockefd); socket_close($connfd); 测试的结果【非常建议动手撸,不然没法体会阻塞与非阻塞...同样的我们不设置为非阻塞模式时,它默认是阻塞IO
Java NIO ---- 始于 Java1.4,提供了新的 JAVA IO 操作非阻塞 API。用意是替代 Java IO 和 Java Networking 相关的 API。...可以非阻塞读取和写入通道。 通道始终读取和写入缓冲区。 2. SocketChannel SocketChannel 用于建立 TCP 网络连接,类似 java.net.Socket。...serverSocketChannel.accept():如果该通道处于非阻塞状态,那么如果没有挂起的连接,该方法将立即返回 null。必须检查返回的 SocketChannel 是否为 null。...非阻塞的网络通道下,开发者通过 Selector 注册对于通道感兴趣的事件类型,线程通过监听事件来触发相应的代码执行。(扩展:更底层是操作系统的多路复用机制) ? 5....结合 Selector 实现非阻塞服务器 /** * 结合 Selector 实现的非阻塞服务器(放弃对 Channel 的轮询,借助消息通知机制) */ public class NIOServer3
因为只有SelectableChannel的子类才能被设置为非阻塞模式。 4....但在通道注册到选择器之前,它必须处于非阻塞模式: ? 也就是说,我们不能让FileChannel去注册到选择器上,因为它们不能切换到非阻塞模式。...此方法阻塞,直到至少一个通道准备好进行操作。 返回的整数表示其通道已准备好进行操作的key的整数。 接下来,我们通常检索所选的key们进行处理: ?...记住我们之前说过,在将通道注册到选择器之前,我们必须首先将其设置为非阻塞模式。接下来我们这样做,然后将通道注册到选择器。...我们将其设置为非阻塞模式,并将其注册到选择器上,专门用于READ操作。 在接下来选择(selections)之一期间,此新通道将变为只读状态,而且是就绪状态。
SocketServer简化了网络服务器的编写。它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramS...
大部分高性能网络框架采用的是非阻塞模式。笔者这次就从linux源码的角度来阐述socket阻塞(block)和非阻塞(non_block)的区别。...本文源码均来自采用Linux-2.6.24内核版本。...一个TCP非阻塞client端简单的例子 如果我们要产生一个非阻塞的socket,在C语言中如下代码所示: // 创建socket int sock_fd = socket(AF_INET, SOCK_STREAM...\非阻塞状态 我们用fcntl修改socket的阻塞\非阻塞状态。...希望笔者这篇文章能帮助到阅读linux网络协议栈代码的人。
为什么需要进行进程等待 进程等待是多进程编程中至关重要的一部分,主要原因是为了让父进程正确管理子进程生命周期并避免各种问题。...(查看进程是否是正常退出) WEXISTATUS(status):如果WIFEXIED非0,提取子进程退出码。...else { //father int status = 0; pid_t ret = 0; do { ret = waitpid(-1,&status,WNOHANG);//非阻塞等待...3.解释堵塞与非堵塞 阻塞场景:打电话等朋友接听 你拨打朋友的电话,直到朋友接通之前你什么都做不了。这就像阻塞调用,你必须等着事情完成。...非阻塞场景:发消息等待回复 你给朋友发了个消息,等他们回你。你不用一直盯着手机看,而是可以去做别的事情,等收到消息后再查看。这就像非阻塞调用,你不需要等着完成才能做其他事情。
什么是阻塞和非阻塞 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。...阻塞与非阻塞:针对函数(程序)运行的方式,在IO未就绪时,是等待就绪还是直接返回(执行别的操作)。...阻塞与非阻塞的区别: 阻塞是程序在调用系统函数IO时,在系统执行系统调用时由CPU通过轮询等方式来实现数据的IO。 非阻塞是在程序级别通过轮询/信号/事件的机制,去查看IO数据是否就绪。...可以是阻塞或非阻塞,阻塞则一直在等待内核/应用程序把IO数据准备好,非阻塞则是直接返回内核/应用程序是否已经准备好数据。 应用程序框架:同步或异步。...IO多路复用,同步,异步,阻塞和非阻塞 区别 关于异步,同步,阻塞与非阻塞 解读I/O多路复用技术
阻塞与非阻塞 应用进程请求I/O操作时,如果数据未准备好,如果请求立即返回就是非阻塞,不立即返回就是阻塞。简单说就是做一件事如果不能立即获得返回,需要等待,就是阻塞,否则就可以理解为非阻塞。...阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同的。...非阻塞 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...同步/异步与阻塞/非阻塞的组合 同步阻塞形式: 等待执行结果是一直等待,执行时线程挂起(未对fd 设置O_NONBLOCK 标志位的read/write 操作) 同步非阻塞形式:等待执行结果是一直等待,...异步非阻塞形式:在处理消息是不等待,在执行消息是也不等待。
以调用函数为例, 同步指的是调用方主动查询返回结果,异步是等待被调用方通知查询结果 阻塞是等待返回结果的时间内挂起,非阻塞是等待返回结果的时间内可以干其他事情....同步和阻塞完全不是一件事,是否同步指的是获取返回结果的方式,是否阻塞指的是等待获取结果的时间内是否可以干其他事情
这里讲的都是基于IO的 阻塞、非阻塞、同步、异步 ---- 一个典型的IO操作包括了两个阶段,数据准备和数据读写。比如说现在要使用 recv 执行一个读操作,数据就绪就是远端是否有数据可读。...当IO工作在阻塞状态下的时候,如果数据没有就绪,recv就会阻塞当前线程;如果说IO工作在非阻塞状态下,会立即返回。...返回值-1的话,就说明连接出现问题,连接异常;如果返回值是0,且errno是EAGIN的话,就说明这是一个正常的非阻塞,返回数据未就绪状态。...一个同步IO接口的示例: char buf[1024]; int sz = recv(sockfd,buf,1024,0); //阻塞:一直在这儿死等 //非阻塞:时不时的回来问一下 if(sz>0)...---- 五种IO模型 阻塞: 非阻塞: 多路IO复用 信号驱动: 这里就完全放飞自我了 异步: ---- Reactor反应堆模型 One loop per thread
从linux源码看socket的阻塞和非阻塞 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。 大部分高性能网络框架采用的是非阻塞模式。...笔者这次就从linux源码的角度来阐述socket阻塞(block)和非阻塞(non_block)的区别。 本文源码均来自采用Linux-2.6.24内核版本。...一个TCP非阻塞client端简单的例子 如果我们要产生一个非阻塞的socket,在C语言中如下代码所示: // 创建socket int sock_fd = socket(AF_INET, SOCK_STREAM...\非阻塞状态 我们用fcntl修改socket的阻塞\非阻塞状态。...阻塞后什么时候恢复运行呢 情况1:有对应的网络数据到来 首先我们看下网络分组到来的内核路径,网卡发起中断后调用netif_rx将事件挂入CPU的等待队列,并唤起软中断(soft_irq),再通过linux
同步、异步、阻塞和非阻塞(网络编程) 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。...如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重的错误)。...非阻塞 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。...阻塞/非阻塞则是小明的等待方式,或者说 API 调用者的等待方式。 在不同的场景下,同步/异步、阻塞/非阻塞的四种组合都有应用。
阻塞。 好吧,再来一点营养。阻塞是啥意思呢? 就是水管堵住了!扭开水龙头没有水出来。...这个道理跟Linux下读取慢速设备(主要指管道和套接字)数据的情形非常相似,例如当我们在读取一个管道时,如果管道里面没有数据,那么我们什么都读不出来,于是就进入了所谓的“阻塞”状态了,说白了阻塞就是使得当前进程或者线程睡眠了的意思...那么再进一步,什么时候会阻塞呢?下面的表格简单描述了这些清空: ? 其中,读者指的是对管道文件拥有读权限的进程或线程(注意不是正在读),写者指的是对管道文件拥有写权限的进程或线程(注意不是正在写)。...除此之外,其实open()函数也会发生阻塞,比如用只读或者只写open一个管道文件的时候。因为一根只有出口或者只有入口的水管,是无法使用的呀!其实就是生活常识。嘿嘿!
简单点说: 阻塞就是干不完不准回来, 非阻塞就是你先干,我现看看有其他事没有,完了告诉我一声 我们拿最常用的send和recv两个函数来说吧… 比如你调用send函数发送一定的Byte,在系统内部...:耗费着系统资源….对于非阻塞模式的socket该函数会马上返回,然后告诉你:WSAEWOULDDBLOCK—“现在没有数据,回头在来看看” 扩展: 在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式...如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循 环去检查某个变量的值,这其实是一种很严重的错误)。...非阻塞 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。
领取专属 10元无门槛券
手把手带您无忧上云