系统调用
在讲解io之前,先介绍下系统调用。系统调用是操作系统内核提供给外部访问的最小接口,运行在内核态,如果应用层需要访问cpu、内存、io等资源时,则需要访问系统调用进行一些系统操作。比如c库函数malloc需要分配内存,则需要从操作系统的用户态切换到内核态调用sbrk系统调用。系统调用需要在用户态和内核态之间来回切换,开销较大,因此,如果程序频繁进行系统调用,那么对性能的消耗可想而知。
非缓冲io
根据《UNIX环境高级编程》一书中的解释:不带缓冲io指的是每个read和write都调用内核中的一个系统调用。可以看出,非缓冲io每次都会进行系统io,那么对于io密集型的程序,会进行频繁的系统调用,性能极低。同时,需要理解,这里的缓冲指的是应用层面上的缓冲,在操作系统这层其实是有缓冲的,读写都会经过内核缓冲区。
缓冲io
缓冲io相对于非缓冲io,在应用层添加了缓冲区,应用程序在进行读写时,会一次性读满或者写满缓冲区,减少系统调用次数,极大提高程序性能。