调用recv(int sockfd, void *buf, size_t len, int flags)的过程中,一共进行了几次内存复制操作?

1.首先知道网卡接收数据,网卡收到网线传来的数据之后,经过硬件电路传输,会将数据写入内存的某个地址上。(这之间会涉及DMA、IO通路选择等知识)。这一步不重要,需要知道网卡会把数据写入内存即可。(理解为内核缓冲区)
2.网卡向CPU发出中断信号,通知系统有新数据到来。CPU执行中断程序,将之前写入内存的数据写入对应的socket的接收缓冲区里。
3.唤醒阻塞在recv上的进程,recv将socket的接收缓冲区内数据拷贝到用户定义的缓冲区buf中。

在内存上的复制操作应该是指:内核缓冲区->socket接收缓冲区->用户定义的buf缓冲区。
全部评论

相关推荐

面向对象的火龙果很爱...:去吃一顿炸鸡就走
点赞 评论 收藏
分享
06-26 22:20
门头沟学院 Java
码农索隆:让你把简历发给她,她说一些套话,然后让你加一个人,说这个人给你改简历,然后开始卖课
我的求职精神状态
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务