首页 > 其他 > 详细

socket IO读写原理

时间:2021-05-24 22:34:57      阅读:28      评论:0      收藏:0      [点我收藏+]

1.send和recv函数只复制数据

https://blog.csdn.net/stpeace/article/details/43719449

技术分享图片

 

 

 假设A(客户端)向B(服务端)发送数据:

  •  在应用程序Program A中, 我们定义一个数组char szBuf[100] = "tcp"; 那么这个szBuf就是应用程序缓冲区(对应上图的橙色Program A中的某块内存)。
  • send函数对应上面蓝色的Socket API, 内核缓冲区对应上面的黄色部分。 
  • send函数的作用是把应用程序缓冲区中的数据拷贝到内核缓冲区, 仅此而已。
  • 然后,内核缓冲区中的数据经过网卡, 经历网络传到B端的网卡(TCP协议), 然后进入B的内核缓冲区, 然后由recv函数剪切/复制到Program B的应用程序缓冲区。

2.IO读写原理

https://blog.csdn.net/qq_31815507/article/details/115673210

用户程序进行IO读写,依赖于操作系统底层的IO读写,基本上会用到底层的read&write两大系统调用。read系统调用,并不是直接从物理设备把数据读取到内存中,write系统调用,也不是把数据直接写入到物理设备。

上层应用无论是调用操作系统的read,还是调用操作系统的write,都会涉及缓冲区。具体来说,调用操作系统的read,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区

技术分享图片

 

 上图显示了块数据如何从外部源(例如硬盘)移动到正在运行的进程(例如RAM)内部的存储区的简化“逻辑”图。

  • 首先,该进程通过进行read()系统调用来填充其缓冲区。(首先是进程的读数据的I/O系统调用)
  • read读取调用会导致内核向磁盘控制器硬件发出命令以从磁盘获取数据。
  • 磁盘控制器通过DMA将数据直接写入内核内存缓冲区。(DMA,直接存储器存取(direct memory access))
  • 磁盘控制器完成缓冲区的填充后,内核将数据从内核空间中的临时缓冲区复制到进程指定的缓冲区中。之后内核会向应用程序发出信号、或者调用回调函数、或者是不阻塞了。

所以,用户程序的IO读写程序,在大多数情况下,并没有进行实际的IO操作,而是在进程缓冲区和内核缓冲区之间直接进行数据的交换。

底层操作会对内核缓冲区进行监控,等待缓冲区达到一定数量的时候,再进行IO设备的中断处理,集中执行物理设备的实际IO操作,这种机制提升了系统的性能。至于什么时候中断(读中断、写中断),由操作系统的内核来决定,用户程序则不需要关心。

 

socket IO读写原理

原文:https://www.cnblogs.com/BlueBlueSea/p/14805680.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!