高并发IO读写基础原理

用户程序的IO读写,依赖于底层的IO读写,基本上就会用到底层的read&write两大系统调用。在不同的操作系统中,IO读写的系统调用的名称可能完全不一样,但是基本功能都是一样的。

read系统调用,并不是直接从物理设备把数据读取到内存中;write系统调用,也不是直接将数据写入到物理设备。上层应用无论是调用操作系统的read,还是调用操作系统的write,都会涉及缓冲区.具体来说,调用系统的read,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区

也就是说,上层程序的IO操作,实际上不是物理设备级别的读写,而是缓存的复制。read&write两大系统调用,都不负责数据在内核缓冲区和物理设备(如磁盘)之间的交换,这项底层的读写交换,是由操作系统内核(Kernel)来完成的。

用户程序中,无论是Socket的IO,还是文件IO的操作,都是属于上层应用的开发,它们的输入(input)和输出(output)的处理,在编程的流程上,都是一致的。

内核缓冲区与进程缓冲区

为什么要设置那么多的缓冲区呢?缓冲区的目的,是为了减少频繁地与设备之间的物理交换。外部设备的直接读写,涉及到操作系统的中断。发生系统中断需要保存之前的进程数据和状态等信息,而结束中断之后,还需要回复之前的进程数据和状态等信息。为了减少这种底层系统的时间损耗、性能损耗,于是出现了内核缓冲区。

有了内核缓冲区,上层应用使用read系统调用时,仅仅把数据从内核缓冲区复制到上层的缓冲区(进程缓冲区);上层应用使用write系统调用时,仅仅把数据从进程缓缓从去复制到内核缓冲区中。底层操作系统会对内核缓冲区进行监控,等待缓冲区达到一定数量的时候,再进行IO设备的中断处理,集中执行物理设备的实际IO操作,这种机制提升了系统的性能。至于什么时候中断(读中断和写中断),都是由操作系统的内核来决定,用户程序不需要关心而且也无法处理。

从数量上来说,在Linux系统中,操作系统内核只有一个内核缓冲区。而每个用户程序(进程),都有自己的独立的缓冲区,叫做进程缓冲区,所以,用户程序的IO读写,在大多情况下,并没有进行实际的IO操作,而是在进程缓冲区和内核缓冲区之间进行数据的交换

详解系统调用流程

用户程序所使用的系统调用read&write,它们不等价于数据在内核缓冲区和磁盘之间的交换。read把数据从内核缓冲区复制到进程缓冲区,write把数据从进程缓冲区复制到内核缓冲区。
read调用流程如下所示:
高并发IO读写基础原理_第1张图片
write调用流程如下所示:
高并发IO读写基础原理_第2张图片

你可能感兴趣的:(io)