recvfrom()
系统函数接收网卡上的数据。在阻塞I/O下,调用
recvfrom()
将造成进程阻塞,直到数据接收完毕。 内存空间有系统空间和用户空间,并且都有相应的缓冲区:
- 第一阶段(wait for data等待数据准备):进程阻塞,内核接管,复制数据到系统空间里的数据缓冲区(当然是能够从网卡上接收到数据)。接收完毕后,则数据准备完毕(datagram ready)。
- 第二阶段(copy data from kernel to user从内核拷贝数据到用户缓冲区):这时候进程仍然阻塞,内核将系统空间内缓冲区ready的数据复制到用户空间里的用户自己定义的缓冲区。拷贝完毕则唤醒进程。 整个阶段,进程都是阻塞的,直到数据读取到用户缓冲区内。
非阻塞I/O
recvfrom()
系统函数,并且设置了Socket为non-blocking非阻塞。 这时我们调用系统函数
recvfrom()
则不阻塞进程,如果数据没有在系统空间的缓冲区内准备好,则立即返回一个error,直接得到一个结果,这时候进程可以做点其他任务而不用阻塞在这里。但是如果数据在系统空间内的缓冲区准备好了,则将开始从系统空间拷贝数据到用户空间。
I/O 多路复用(IO multiplexing)
select()
也是一个系统调用,如果一个进程调用了
select()
那么这个进程也会被阻塞。 第一阶段:应用程序进程调用
select()
,这时该进程阻塞,不过内核会监视应用程序向select注册的所有Socket。如果注册的Socket中有数据以及在系统空间缓冲区里准备好了的,则该进程被唤醒。 第二阶段:从
select()
的阻塞中返回,应用程序进程只能知道向select注册的Socket里有数据准备好的Socket,但是并不知道具体是哪个Socket数据准备好了。所以,应用程序需要自己遍历Socket,找出数据准备好的Socket,然后调用
recvfrom()
函数将系统空间缓冲区内数据复制到用户空间缓冲区内。
信号驱动 I/O(signal driven IO)
recvfrom()
函数),然后数据则直接拷贝到用户空间缓冲区内。异步I/O则是调用系统函数,传入了用户空间缓冲区的地址指针。调用后进程不会被阻塞,则可以做其他事情,内核会在将数据复制到系统空间缓冲区,然后再将数据复制到用户提供的用户缓冲区地址中。都做完了后,则内核发送一个signal通知应用程序read完成了。这时应用程序之前提供的回调函数,由该进程来执行。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 能量视角下的GAN模型(三):生成模型=能量模型
- 提高模型准确率:组合模型
- JVM内存模型 与 JMM内存模型
- Golang并发模型:轻松入门流水线模型
- C++11 中的内存模型(上):内存模型基础
- 机器学习中的判别式模型和生成式模型
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
鸟哥的Linux私房菜
鸟哥 / 人民邮电出版社 / 2010-6-28 / 88.00元
本书是最具知名度的Linux入门书《鸟哥的Linux私房菜基础学习篇》的最新版,全面而详细地介绍了Linux操作系统。全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linux的文件系统、文件、目录与磁盘的管理;第三部分介绍文字模式接口 shell和管理系统的好帮手shell脚本,另外还介绍了文字编辑器vi和vim的使用方法;第四部分介绍了对于系......一起来看看 《鸟哥的Linux私房菜》 这本书的介绍吧!