非阻塞流有哪些,什么叫非阻塞IO

1,什么叫非阻塞IO比如进程A要从网络收一个包 , 如果没有包就等待,这就是阻塞 。不等待,去做别的事情,等包来了再处理就是不阻塞 。就是io不阻塞即使没有数据可读,或者空间可写时 。异步io都返回,不管如何情况 。简单点的意思就是进程不会阻塞在你读写调用异步io系统调用的时候 。所以你的执行流可以去做其它的事情,当你确实要确认数据读写成功的时候
2 , JAVA 非阻塞通信NIO相比普通socket通信非阻塞表现在哪里0,重连,重新再来过一次呗 。1,NIO 本身是提供非阻塞式的网络访问,使用 selector 来轮询事件,因此用 selector 才能改进性能,一个 selector 可以用在多个 socket 通信中而不像以前传统的一个线程一个 socket 流这么麻烦地管理它们 。2,客户端与服务端是互不影响的,完全不相关 。我们完全不需要关心对方是C++ / VB 还是 Java ,只要双方使用的都是 TCP 协议就行了 。NIO 是在与操作系统的模块打交道,尽量提高性能,所有的真实过程其实都是在 JVM 的 native 代码与操作系统中处理了 , 对我们应用程序来说 , 使用什么方法并没有区别 。1客户端和服务器肯定是用的自己的selecot , 这个是单独的 , 一边一个,没有关系 。2write不需要注册事件,注册事件是为了程序不阻塞,write方法不是阻塞的,啥时候写都没问题,读需要因为读是阻塞的 , 如果直接read , 没有信息来,就会阻塞,为了不阻塞,nio就是为了这个 , 所以又了监听,只有知道有数据来了,再去读,那么肯定就能读 。这个监听只是提供了一个触发机制,“(不太明白这里我还没注册write事件怎么就可以写了)”其实你都不注册,读写也是可以进行的 , 不过,内样读就是阻塞的,不是nio的机制了 。最后的这个只看你说的不知道原因 , 方便的话 , 可以给代码看看吗【非阻塞流有哪些,什么叫非阻塞IO】
3,Socket阻塞模式和非阻塞模式的区别阻塞阻塞调用是指调用结果返回之前,当前线程会被挂起 。函数只有在得到结果之后才会返回 。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的 。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已 。例如 , 我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回 。而此时,当前线程还会继续处理各种各样的消息 。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新 。socket接收数据的另外一个函数recv则是一个阻塞调用的例子 。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止 。非阻塞非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回 。对象的阻塞模式和阻塞函数调用对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性 , 但是并不是一一对应的 。阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞 。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用 。函数select就是这样的一个例子 。1、阻塞:一般的i/o操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到来.这个行为叫阻塞.accept()方法将会阻塞服务器线程直到一个呼叫到来.当5个连接处理完闭之后,服务器退出.任何的在队列中的呼叫将会被取消.2、非阻塞:非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回 。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上 。在实际windows网络通信软件开发中,异步非阻塞套接字是用的最多的 。平常所说的c/s(客户端/服务器)结构的软件就是异步非阻塞模式的 。简单点说:阻塞就是干不完不准回来 , 非组赛就是你先干 , 我现看看有其他事没有 , 完了告诉我一声
4,网络编程中阻塞和非阻塞socket的区别阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到来.这个行为叫阻塞.accept()方法将会阻塞服务器线程直到一个呼叫到来.当5个连接处理完闭之后,服务器退出.任何的在队列中的呼叫将会被取消.非阻塞:非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功 , 都立即返回 。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回 , 而不会一直挂在此函数调用上 。在实际Windows网络通信软件开发中,异步非阻塞套接字是用的最多的 。平常所说的C/S(客户端/服务器)结构的软件就是异步非阻塞模式的读操作对于阻塞的socket,当socket的接收缓冲区中没有数据时,read调用会一直阻塞住,直到有数据到来才返回 。当socket缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数 。当sockt的接收缓冲区中的数据大于期望读取的字节数时,读取期望读取的字节数,返回实际读取的长度 。对于非阻塞socket而言,socket的接收缓冲区中有没有数据,read调用都会立刻返回 。接收缓冲区中有数据时,与阻塞socket有数据的情况是一样的,如果接收缓冲区中没有数据,则返回错误号为ewouldblock,表示该操作本来应该阻塞的,但是由于本socket为非阻塞的socket,因此立刻返回,遇到这样的情况,可以在下次接着去尝试读取 。如果返回值是其它负值,则表明读取错误 。因此,非阻塞的rea调用一般这样写:if ((nread = read(sock_fd, buffer, len)) < 0)if (errno == ewouldblock)return 0; //表示没有读到数据}else return -1; //表示读取失败}else return nread;读到数据长度写操作对于写操作write,原理是类似的,非阻塞socket在发送缓冲区没有空间时会直接返回错误号ewouldblock,表示没有空间可写数据,如果错误号是别的值 , 则表明发送失败 。如果发送缓冲区中有足够空间或者是不足以拷贝所有待发送数据的空间的话,则拷贝前面n个能够容纳的数据,返回实际拷贝的字节数 。而对于阻塞socket而言,如果发送缓冲区没有空间或者空间不足的话,write操作会直接阻塞住 , 如果有足够空间,则拷贝所有数据到发送缓冲区,然后返回.非阻塞的write操作一般写法是:int write_pos = 0;int nleft = nlen;while (nleft > 0)int nwrite = 0;if ((nwrite = write(sock_fd, data + write_pos, nleft)) <= 0)if (errno == ewouldblock)nwrite = 0;}else return -1; //表示写失败}nleft -= nwrite;write_pos += nwrite;}return nlen;建立连接阻塞方式下,connect首先发送syn请求道服务器,当客户端收到服务器返回的syn的确认时,则connect返回.否则的话一直阻塞.非阻塞方式,connect将启用tcp协议的三次握手,但是connect函数并不等待连接建立好才返回,而是立即返回 。返回的错误码为einprogress,表示正在进行某种过程.接收连接对于阻塞方式的倾听socket,accept在连接队列中没有建立好的连接时将阻塞 , 直到有可用的连接,才返回 。非阻塞倾听socket,在有没有连接时都立即返回,没有连接时,返回的错误码为ewouldblock,表示本来应该阻塞 。无阻塞的设置方法方法一:fcntlint flag;if (flag = fcntl(fd, f_getfl, 0) <0) perror("get flag");flag |= o_nonblock;if (fcntl(fd, f_setfl, flag) < 0)perror("set flag");方法二:ioctlint b_on = 1;ioctl (fd, fionbio, &b_on);5,verilog中的阻塞语句和非阻塞语句什么区别般说always@()括号边沿敏信号always块使用阻塞赋值always @()括号电平敏信号always块使用非阻塞赋值并绝般情况SR赋值的类型的选择取决于建模的逻辑类型在时序块的rtl代码中使用非阻塞赋值 。非阻塞赋值在块结束后才完成赋值操作,此赋值方式可以避免在仿真出现冒险和竞争现象 。在组合的rtl代码中使用阻塞赋值 。使用阻塞方式对一个变量进行赋值时,此变量的值在在赋值语句执行完后就立即改变 。使用非阻塞赋值方式进行赋值时,各个赋值语句同步执行;因此,通常在一个时钟沿对临时变量进行赋值,而在另一个时钟沿对其进行采样 。下面的模块综合为触发器 , 其中采用了阻塞赋值方式:modulebloc(clk,a,b);inputclk,a;outputb;regb;regy;always@(posedgeclk)beginy=a;b=y;endendmodule下面的模块综合为两个触发器,其中采用了非阻塞赋值方式:modulenonbloc(clk,a,b);inputclk,a;outputb;regb;regy;always@(posedgeclk)beginy<=a;b<=y;endendmodule上面的两个例子的综合的结果不同,左边的例子使用了阻塞赋值方式,综合器将其综合为一个触发器 。右边的例子使用了非阻塞赋值方式,综合器将其综合为两个触发器,y将出现在综合列表中,作为第二个触发器的输入 。非阻塞过程赋值moduleswap_vals;rega,b,clk;initialbegin过程赋值有两类a=0;b=1;clk=0;阻塞过程赋值endalways#5clk=~clk;非阻塞过程赋值always@(posedgeclk)begina<=b;//非阻塞过程赋值b<=a;//交换a和b值endendmodule阻塞过程赋值执行完成后再执行在顺序块内下一条语句 。非阻塞赋值不阻塞过程流,仿真器读入一条赋值语句并对它进行调度之后,就可以处理下一条赋值语句 。若过程块中的所有赋值都是非阻塞的 , 赋值按两步进行:1.仿真器计算所有rhs表达式的值,保存结果,并进行调度在时序控制指定时间的赋值 。2.在经过相应的延迟后 , 仿真器通过将保存的值赋给lhs表达式完成赋值 。非阻塞过程赋值(续)阻塞与非阻塞赋值语句行为差别举例1modulenon_block1;输出结果:rega,b,c,d,e,f;initialbegin//blockingassignments0a=xb=xc=xd=xe=xf=xa=#101;//time102a=xb=xc=xd=xe=0f=xb=#20;//time12c=#41;//time164a=xb=xc=xd=xe=0f=1endinitialbegin//non-blockingassignments10a=1b=xc=xd=1e=0f=1d<=#101;//time1012a=1b=0c=xd=1e=0f=1e<=#20;//time2f<=#41;//time416a=1b=0c=1d=1e=0f=1endinitialbegin$monitor($time,,"a=%bb=%bc=%bd=%be=%bf=%b",a,b,c,d,e,f);#100$finish;endendmodule非阻塞过程赋值(续)阻塞与非阻塞赋值语句行为差别举例2modulepipemult(product,mplier,mcand,go,clock);inputgo,clock;input[7:0]mplier,mcand;output[15:0]product;reg[15:0]product;always@(posedgego)product=repeat(4)@(posedgeclock)mplier*mcand;endmodulemodulepipemult(product,mplier,mcand,go,clock);inputgo,clock;input[7:0]mplier,mcand;output[15:0]product;reg[15:0]product;always@(posedgego)product<=repeat(4)@(posedgeclock)mplier*mcand;endmodule

    推荐阅读