I/O模型初探(以*nix为例)

I/O模型初探(以*nix为例)

I/O(Everything is a File)

在 Unix-like 的世界里一切皆文件,无论 Socket, FIFO,管道或是终端都是文件。文件的本质是一串二进制的字节流。

正是因为一切皆文件,也同时因为文件的本质是一串二进制的字节流,所以对流进行的收发操作即为I/O操作。

与此同时计算机系统中存在了很多流,如何来知道应该使用哪个流会变得十分棘手。因此在内核中提供了文件描述符(File descriptor)进行操作。文件描述符的取值范围是非负整数,因此实际上的I/O操作是对这个非负整数的操作。

模型

同步/异步 阻塞/非阻塞

在某乎高赞回答中有一段描述:

『所谓同步,就是在发出一个调用时,在没有得到结果之前, 该调用就不返回。异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。』

这段描述可以简单总结为:

  1. 同步/异步关注的是消息通信机制
  2. 阻塞/非阻塞关注的是程序在等待调用结果

这种表述是不完全的,以下的例子节选自《操作系统概念》 86页:

进程间的通信通过发送和接收两种基本操作完成的,通信时的过程可能是阻塞的也可能是非阻塞的

即进程通讯可能存在的情况有以下四种:

  1. 阻塞式发送
  2. 非阻塞式发送
  3. 阻塞式接收
  4. 非阻塞式接收

综上,在进程通讯的维度上,阻塞就是同步,非阻塞就是异步。此时是否还记得我们之前达成的统一『Everything is a File』?

本文链接:

https://jamchoi.cc/archives/io.html
1 + 7 =
快来做第一个评论的人吧~