作者 | 阿辉
来源 | Andy阿辉
思考:
作为程序员的我们,在编写软件进行文件读取,网络收发数据时,是不关心其具体的内部数据传输的。只关心把数据传输到缓冲区或及时从缓冲区读取数据。那么内部究竟是如何实现的呢,今天这篇文章就和大家一起学习了解下,希望对大家有帮助。
IO读写的基础
用户程序进行IO读写,依赖于底层的IO读写,都会调用底层的read/write两个系统调用。不同的操作系统其系统调用的名称不同。但是基本功能都是一样的。
首先在操作系统层面是有非常多的缓冲区的,比如进程缓冲区和内核缓冲区。
Read系统调用并不是直接从物理设备(硬盘)把数据读取到内存中的。Write系统调用也不是直接把内存中的数据写进物理设备。这两个调用方式都不直接和物理设备进行数据的传输。它们都在和内核缓冲区打交道。当进行Read系统调用时数据是从内核缓冲区被复制到线程缓冲区的,而当Write系统调用时,数据是从线程缓冲区被复制到内核缓冲区的。
那么朋友们读到这里是不是就有疑问,那么数据在内核缓冲区是如何实现数据的读写到物理设备上呢?这块就不是我们程序员朋友所关心的问题了,它是由操作系统内核来完成的。
可以这么理解:上层程序的IO操作,实际上不是物理设备级别的读写,而是缓存的复制。在我们平时的用户程序中,无论是Socket的IO、还是文件IO操作,都属于上层应用,它们的输入输出的处理,在编程流程上都是一致的。
内核缓冲区和进程缓冲区
缓冲区的目的:为了减少频繁地与设备之间的物理交换。
我们知道外部设备的读写在操作系统层面是需要不停的产生中断来实现的,而发生中断过程中,对于操作系统来说开销太大了。中断前,操作系统需要保存之前进程的数据和状态等信息,结束中断后,继而需要恢复之前的进程数据和状态等信息。之所以有了内核缓冲区就是为了减少这种底层系统的时间损耗,性能损耗。
操作系统内核对于内核缓冲区的使用是有一定的规则的。在操作系统层面,底层操作会对内核缓冲区进行监控,等待缓冲区到达一定数量的时候,在进行IO设备的中断处理,集中执行物理设备的实际IO操作。(这种机制在一定程度上提升了系统的性能)。
至于什么时候读写中断,是由操作系统内核决定的,用户程序不需要关心。
上层应用使用Read系统调用时,仅仅是把数据从内核缓冲区复制到上层应用的缓冲区(进程缓冲区),而当使用Write系统调用时,是把数据从进程缓冲区复制到内核缓冲区中。
往期推荐
如果让你来设计网络
Docker:从入门到实战过程全记录
浅述 Docker 的容器编排
如何在 Kubernetes Pod 内进行网络抓包
点分享
点收藏
点点赞
点在看