大概又看了一下unp的几章比较有意思的章节。加深了对unix对操作符包括文件操作符和socket的操作的理解。
下面主要是把unp第六章的那一节贴出来。因为这五种模型应该是涵盖了我们网络编程中大多数的模型吧。
1. 阻塞I/O模型
例如UDP函数recvfrom的内核到应用层、应用层到内核的调用过程是这样的:首先把描述符、接受数据缓冲地址、大小传递给内核,但是如果此时该与该套接口相应的缓冲区没有数据,这个时候就recvfrom就会卡(阻塞)在这里,知道数据到来的时候,再把数据拷贝到应用层,也就是传进来的地址空间,如果没有数据到来,就会使该函数阻塞在那里,这就叫做阻塞I/O模型,如下图:
2. 非阻塞I/O模型
如果recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接给我返回,并且返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询,就是一直在检查这个状态,看内核是不是有数据到来调用,过程如下图:
3. I/O复用模型
设置一组套接字,如果这些套接字有一个以上出现了可读、可写、或者异常,select都会返回,这个时候,可以检查室哪个套接字状态达到了,因为select函数的套接字集是 值=结果 的,当select返回的时候,集合中的套接字是变化的,这个返回的套接字是满足要求的,通常程序的做法是,对想要了解的套接字,进行分开处理。使用select的好处是:能够等待多个套接字准备好。
4. 信号驱动I/O模型
当内核为我们准备好数据的时候,就会发送 SIGIO 信号,我们 【Linux公社 】 可以调用 sigaction 安装 SIGIO 信号的处理函数,这个时候就可以在 SIGIO 信号处理函数中进行 recvfrom 函数来接受数据报:
5. 异步I/O模型
是让内核拷贝完之后通知我们。信号驱动I/O是当内核准备好数据的时候,通知我们可以调用recvfrom了,而异步I/O模型是内核通知我们I/O操作完成的时候通知我们:
在网络编程世界里,一定要知道select函数。目前比较高级的应用中epoll是最强大的。