socket IO读写原理
时间:2021-05-24 22:34:57
收藏:0
阅读:28
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操作,这种机制提升了系统的性能。至于什么时候中断(读中断、写中断),由操作系统的内核来决定,用户程序则不需要关心。
原文:https://www.cnblogs.com/BlueBlueSea/p/14805680.html
评论(0)