Linux下,一个应用程序调用操作系统提供的服务,主要的调用接口有如下三种:
1)直接调用Linux 内核(Kernel) 提供的系统调用(Sys call)接口
2) 调用glibc封装的api,glibc内部会调用kernel
3)调用其它第三方library的api,这些library 内部会调用kernel
Linux kernel 的代码,cpu以Ring0级别运行,运行空间叫做内核态(Kernel Mode);用户及library的代码,cpu以Ring3级别运行,运行空间叫做用户态(User Mode)。因此应用程序访问系统服务的过程中,cpu会在用户态和内核态之间进行来回切换,并copy所需要的内存数据。
I/O是我们编程中经常调用的Linux服务,就是按上述接口方式进行的。常见的场景是网络I/O和文件I/O。
Linux IO的整个过程中,应用程序与内核之间有不同的交互协作方式,可以从不同的角度将其划分为阻塞(Blocking)/非阻塞(Non-blocking)、同步(Sync)/异步(Async)。
本文以网络IO为例,理清这些概念背后的含义,并对Linux 的五种IO模型进行介绍。
阻塞(Blocking IO)是指:一旦应用程序调用API接口,应用程序的线程就会被卡住,一直到IO操作完成,这个API函数才返回,这时应用程序的线程才解除阻塞状态,可以继续向下执行。
阻塞IO,用下图说明:
Applic