调用recv(int sockfd, void *buf, size_t len, int flags)的过程中,一共进行了几次内存复制操作?
1.首先知道网卡接收数据,网卡收到网线传来的数据之后,经过硬件电路传输,会将数据写入内存的某个地址上。(这之间会涉及DMA、IO通路选择等知识)。这一步不重要,需要知道网卡会把数据写入内存即可。(理解为内核缓冲区)
2.网卡向CPU发出中断信号,通知系统有新数据到来。CPU执行中断程序,将之前写入内存的数据写入对应的socket的接收缓冲区里。
3.唤醒阻塞在recv上的进程,recv将socket的接收缓冲区内数据拷贝到用户定义的缓冲区buf中。
在内存上的复制操作应该是指:内核缓冲区->socket接收缓冲区->用户定义的buf缓冲区。
1.首先知道网卡接收数据,网卡收到网线传来的数据之后,经过硬件电路传输,会将数据写入内存的某个地址上。(这之间会涉及DMA、IO通路选择等知识)。这一步不重要,需要知道网卡会把数据写入内存即可。(理解为内核缓冲区)
2.网卡向CPU发出中断信号,通知系统有新数据到来。CPU执行中断程序,将之前写入内存的数据写入对应的socket的接收缓冲区里。
3.唤醒阻塞在recv上的进程,recv将socket的接收缓冲区内数据拷贝到用户定义的缓冲区buf中。
在内存上的复制操作应该是指:内核缓冲区->socket接收缓冲区->用户定义的buf缓冲区。
全部评论
相关推荐
11-26 18:05
中国人民大学 Unity3D客户端 点赞 评论 收藏
分享