相关引用
-
文件描述符
文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统
-
缓存I/O
又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间;
缺点:数据在传输过程中需要在应用程序地址空间和内核进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的;
I/O模式
对于一次IO访问(以read操作为例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,它会经历两个阶段:
1. 数据准备阶段,即将数据读到缓冲区;
2. 数据复制阶段,即将数据从内核缓存区拷贝到进程中;
因此,有以下5种模式
阻塞
默认所有socket都是阻塞的,其流程大概为:
-
当用户进程发出recvfrom系统调用后,进行进入第1个阶段即数据准备阶段(对于网络IO来说,可能是需要等待数据的到来),此时进程阻塞;
-
当kernel数据准备完成,就开始第2个阶段即数据复制阶段完成后kernel返回结果,用户进程解除block的状态,重新运行起来;
即用户进程在2个阶段都是阻塞的;
非阻塞
- 当进程调用recvfrom系统调用后,如果kernel没有准备好数据,则立刻返回一个error,这样用户程序检测返回结果是error后,然后再次发送系统recvfrom调用,此时进程可以理解为非阻塞,因为可以理解返回;
- 当kernel准备好数据之后,同时再次收到recvfrom调用,就开启第2阶段,即将数据复制到用户内存,此时进程是阻塞的,需要等待复制完毕;
即用户进程在第1阶段非阻塞(其实还是阻塞,因为需要循环检测),第2阶段阻塞;
多路复用
从图可以看出,以select为例,select过程即第1阶段是非阻塞的,之后发出recffrom系统该调用之后是阻塞的;
异步
当用户进程发出异步的read命令后,kernel会完成准备和复制阶段之通知用户进程,这段时间用户进程是异步的;
信号驱动
不常用,略