美文网首页network
阻塞模式和非阻塞模式

阻塞模式和非阻塞模式

作者: helinyu | 来源:发表于2016-12-24 17:20 被阅读193次

使用socket编程实现数据传输的过程中,通常的默认设置假设套接字是阻塞的。每个TCP套接字有一个发送缓冲区,当应用进程调用write操作的时候,内核从应用进程的缓冲区中复制数据到套接字的发送缓冲区中。

如果套接字的发送缓冲区无法完全的容纳应用的应用程序所发送的数据,即应用程序的缓冲区大于套接字发送缓冲区或套接字缓冲区还有其他数据,应用进程将会被挂起并。内核将不从write系统条用返回,直到应用进程缓冲区中的所有数据都复制到套接字发送缓冲区。
所以,从写一个tcp套接字的write调用成功返回仅仅表示可以重新使用应用进程的缓冲区,并不表示对端的应用进程已经接收到了数据。

下面是发送和接收两个方面说明“阻塞”和“非阻塞”模式的区别:

(1)发送操作:write 、writev、send、sendto、sendmsg

对于tcp套接字,内核将从应用进程的缓冲区向该套接字的的发送缓冲区复制数据。对于阻塞的套接字,如果其发送缓冲区中没有空间,进程将挂起,直到有空间为止。
对于一个非阻塞的tcp套接字,如果其发送缓冲区中根本就没有空间,发送函数调用将立即返回一个EWOULDBLOCK错误。如果其缓冲区中有一些空间,返回值将是内核能够复制到该缓冲区中的字节数。

对于UDP套接字,不存在真正的发送缓冲区。内核只是复制应用进程数据并把它沿协议栈向下传送,一次加上UDP头部和IP头部。因此,对一个阻塞的UDP套接字,发送函数调用将不会因为与TCP套接字一样的原因而阻塞,不过有可能会因为其他原因而阻塞。

(2)接受操作 read readv recv recvfrom recvmsg
如果某个进程对一个阻塞的TCP套接字调用这些输入函数之一,而该套接字的接受缓冲区没有数据可以读,该进程将被挂起,直到到达一些数据。tcp是字节流协议,只要到达一些数据,该进程就会被唤醒,这些数据既可能是单个字节,也可以是一个完整的TCP分节中的数据。

UDP是数据包协议,如果一个阻塞的UDP套接字的接受缓冲区为空,对它调用接收函数的进程将被挂起,直到到达一个UDP数据报。

对于非阻塞的套接字,如果接收操作不能被满足(对于UDP套接字即有一个完整的数据报可读),相应的调用将立即返回一个EWOULDBLOCK错误。

相关文章

  • 阻塞模式和非阻塞模式

    使用socket编程实现数据传输的过程中,通常的默认设置假设套接字是阻塞的。每个TCP套接字有一个发送缓冲区,当应...

  • IO通信模型(二)同步非阻塞模式NIO(NonBlocking

    同步非阻塞模式(NonBlocking IO) 在非阻塞模式中,发出Socket的accept()和read()操...

  • 非阻塞connect和accept

    1 非阻塞connect 1.1 阻塞模式与非阻塞 调用connect会发起三次连接。 阻塞模式下,connect...

  • netty(四)nio之网络编程

    一、阻塞与非阻塞 1.1 阻塞 1.1.1 阻塞模式会存在哪些问题? 1)在阻塞模式下,以下的方法都会导致线程暂停...

  • 操作系统 JVM

    非阻塞IO和异步IO(NIO、AIO) 非阻塞 IO 说完了阻塞模式的使用及其缺点以后,我们这里就可以介绍非阻塞 ...

  • channel 和阻塞模式和非阻塞模式(1)

    最近一直又被问到chan 的阻塞和非阻塞模式有什么区别,他们分别在什么场景下使用,写个日记记录下 阻塞模式 示例代...

  • Python实现socket的非阻塞式编程

    阻塞模式与非阻塞模式 阻塞模式 程序碰到了一些耗时操作,无法继续向下走。 例如在socket编程中,例如在send...

  • BIO-NIO-AIO

    BIO (Blocking I/O):同步阻塞I/O模式。 NIO (New I/O):同步非阻塞模式。 AIO ...

  • 面试(二)

    1.非阻塞IO和阻塞IO的区别 在阻塞模式下,若从网络流读取不到指定大小的数据量,阻塞IO就在那里阻塞着。非阻塞I...

  • epoll的提高--工作模式

    水平触发模式 -- 默认就是这种模式(如上一篇所写) 边沿阻塞触发模式 边沿非阻塞工作模式 -- 效率最高 先来个...

网友评论

    本文标题:阻塞模式和非阻塞模式

    本文链接:https://www.haomeiwen.com/subject/ehtrvttx.html