unix通信基本框架

来源:互联网 发布:三星游戏优化器 编辑:程序博客网 时间:2024/06/08 19:11

I/O模型

分类:

阻塞式I/O模型

非阻塞式I/O模型

I/O复用模型(select and poll)

信号驱动式模型(SIGIO)

异步I/O模型(POSIX 的aio_系列函数)

同步IO与异步IO对比

同步IO操作,导致请求进程阻塞,直到IO操作完成

异步IO操作,不导致请求进程阻塞

五中模型的比较

非阻塞式IO ()

关于阻塞的一些基本知识:

套接字的默认状态时阻塞的。这意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待其他操作完成。可能阻塞套接字的调用分为以下四类:

输入操作

包括read、readv、recv、recvrom、和recvmsg五个函数。如果某进程对一个阻塞的TCP套接字调用这些输入函数之一,而且该套接字的接受缓冲区没有数据可读,该进程将被投入睡眠,直到有数据到来。

TCP,唤醒条件:单字节或是完整的TCP分字节的数据;可设定等待固定数目的数据(readn、或者指定MSG_WAITALL)

UDP,唤醒条件:UDP数据报到来。

输出操作

包括write、writev、send、sendto、和senmsg五个函数。内核将从应用进程的缓冲区到该套接字的发送缓冲区复制数据。,对于阻塞的套接字,如果发送缓冲区不为空,,进程将被投入睡眠,直到有空间为止。

TCP,发送缓冲区不为空,立即返回WOULDBLOCK错误;发送缓冲区有部分空间,返回值是内核能够复制到该缓冲区的字节数。

UDP,不存在真正的发送缓冲区,内核只是复制应用进程数据并把它沿协议栈向下传送,并加上UDP、IP首部。

接受外来数据

Accept函数

阻塞套接字,调用accept,并且无新的连接到来,调用进程将被投入睡眠。

非阻塞式套接字,调用accept,并无新的连接到来,调用进程将返回一个WOULDBLOCK错误。

发起外出连接

用于TCP的connect函数。(UDP可用connect,但只是使内核保存对端的IP与端口号)

TCP,连接的建立涉及三路握手过程,connect要等到收到客户对SYN的ACK确认为止。所以,TCP每个connect都会阻塞进程至少一个RTT时间。

非阻塞TCP,调用connect时,连接不能立即建立时,连接的建立会照样发起,但会返回EINPROGRESS错误。

,当服务器与客户处于同一个主机的情况下,即使对于非阻塞connect,connect也可能正常返回。



0 0
原创粉丝点击