“Let us build ourselves a city, with a tower that reaches to the heavens, so that we may make a name for ourselves; otherwise we will be scattered over the face of the whole earth.”
文件描述符
文件描述符是一个整数, 表示了进程可读写的一个对象,文件描述符的一个很重要的作用是进行抽象,使得文件、管道或者设备都能够以相同的方式(byte流)进行操作。每一个进程都有一个私有的从0开始的文件描述符空间,其中有三个常开的fd,分别为:
- 0:标准输入(读)
- 1:标准输出(写)
- 2:标准错误(写)
IO 设备
IO设备分类
按照使用特性
- 人机交互
- 存储设备
- 网络通信
- 低速、中速和高速
按照信息交换单位
- 块设备:如磁盘等
- 字符设备:打印机等
IO使用
IO多路复用机制
IO复用共有三种方式,即select、poll和epoll下面将针对这三种方式进行总结:
(1) select:时间复杂度为$O(n)$
select 仅仅知道有IO事件发生,但是不确定是哪几个流,我们只能无差别对所有流进行轮询,找出能读出数据或写入数据的流,对他们进行操作。
(2) poll:时间复杂度为$O(n)$
poll 本质和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,但是他没有最大连接限制,原因是基于链表存储。
(3) epoll:时间复杂度$O(1)$
epoll会把哪个流发生了什么样的IO事件通知我们,所以epoll实际上是事件驱动的,此时我们对这些流的操作都是有意义的。epoll是一种通过函数回调进行通知的机制。