10.2 文件预读
对于文件请求,Linux内核提供了预读策略,比要求长度多读一些,存储在page cache里,后续读是顺序的,马上可以利用page cache的数据返回,不必再次读硬盘。对于硬盘这种慢速设备而言,利用缓存数据大大提升I/O效率。
struct backing_dev_info default_backing_dev_info = {
.ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE,
.state = 0,
.capabilities = BDI_CAP_MAP_COPY,
.unplug_io_fn = default_unplug_io_fn,
};
EXPORT_SYMBOL_GPL(default_backing_dev_info);
a
10.3 文件锁
读写调用之间没有同步,可能导致 读进程 读取到 被破坏或者不完整的数据。
--建议锁:
应用层实现,内核只提供程序接口,不参与锁的控制和协调,也不对读写操作做内部检查和强制。
如果有进程不检查文件是否有建议锁 就写入数据,内核不加以阻拦。建议锁要求进程遵守规则;建议锁可以对整个文件进行加锁,也可以对文件的一部分进行加锁。
--强制锁:
由内核强制实施。只要进程调用读写操作,内核都会检查与存在的锁是否冲突,如果冲突,内核会加以阻拦。
根据访问方式的不同,文件锁又分为 读锁 、 写锁 。
--读锁 :
允许多个进程同时进行读操作,称为共享锁。文件加了读锁就不能再设置写锁,但允许其他进程再同一区域在设置读锁。
--写锁 :
主要目的是隔离文件,是所写的内容不被其他进程的 读写 干扰,以保证数据的完整性。 写锁一旦加上,只有上锁的人可以操作,其他进程无论读还是写都只能等待写锁释放后才能执行,故写锁又称 互斥锁。
如果一个文件已经被加上了读锁,其他进程再对这个文件进行写 操作就会被内核阻止
如果一个文件已经被加上了写锁,其他进程再对这个文件进行 读取 或者 写操作 就会被内核阻止