Ch 14 高级IO

记录锁

用于确保一个进程在单独写一个文件。当第一个进程在读或者修改文件的某部分时,使用记录锁可以阻止其他进程修改同一文件区。有点类似于数据库中的范围间隙锁

POSIX.1 的 fcntl 锁结构 包含了

  • 锁类型:共享读锁、独占性写锁、解锁一个区域
  • 加锁或者解锁区域的起始字节偏移量
  • 区域字节长度

注意: 区域范围可以越过尾端,但是不能超过文件开头 共享读锁和独占写锁的互斥关系与数据库中的锁高度类似

在加解锁的时候系统会对区间进行自动地分裂或者合并 文件 close 掉之后会自动释放锁

fork 产生的子进程不继承父进程所设置的锁,需要调用 fcntl 获取它自己的锁,防止父子进程能够同时写文件

exec 的新程序可以继承原执行程序的锁,但是设置了执行时关闭的文件描述符会自动释放这些锁

系统文本编辑器

一般的系统编辑器不使用记录锁,它们读取完文件之后就会 close 掉,因此它不能支持多个用户对每个文件的并发读写

IO多路转接

select 函数

参数:关心的描述符,每个描述符关心的条件,等待时长,已准备好的描述符总数量

返回值:-1出错,0没有描述符准备好,正的返回值说明已经准备好的描述符的数量

poll 函数

类似于 select,不同的是 poll 会构造一个 pollfd 结构的数组,每个元素指定描述符的编号以及感兴趣的条件

POSIX 异步 IO

它对不同类型的文件进行异步IO提供了一套一致的方法,使用 aiocb 结构(AIO控制块)来描述 IO 操作

异步IO操作必须显式地指定偏移量 sigevent 结构描述IO事件完成后如何通知应用程序

先初始化异步控制块,然后使用 aio_read 函数异步读,aio_write 异步写。当这些函数返回成功时,异步请求便已经被操作系统放入等待处理的队列中了。

等待时必须注意 AIO 控制块和数据库缓冲区保持稳定;对应的那段内存必须始终是合法的,除非IO操作完成,否则不能被复用

存储映射 IO mmap

将一个磁盘文件映射到存储空间中的一个缓冲区上,写缓冲区时相应字节就自动写入文件,可以再不使用 write 的情况下执行 IO,read 同理

mmap 不能适用于设备(网络或终端)之间的复制