【发布时间】:2012-11-07 16:48:29
【问题描述】:
如果一个进程执行大小(和对齐)S(例如 8KB)的 write(),那么另一个进程是否有可能执行读取(大小和对齐 S 以及同一文件)看到混合旧数据和新数据?
写入过程为每个数据块添加校验和,我想知道是否可以使用读取过程在后台验证校验和。如果读者可以看到部分写入,那么它将错误地指示损坏。
这里适用哪些标准或文件?有没有一种可移植的方式来避免这里的问题,最好不要引入大量的锁定?
【问题讨论】:
-
这是一个经典的多用户数据库问题,像oracle这样的产品通过大量的锁定和其他操作来保持并发。简单回答是不。没有任何保证。您必须实施互斥锁或文件锁定或任何您认为合理的保证。某种具有内核持久性的通用对象将解决问题 - 互斥体、信号量、锁定文件等。
-
澄清:我的问题不在于写入是否真正进入磁盘,而在于其他进程是否可以在系统完全在线时看到部分写入。所以,如果崩溃后有撕裂的页面也没关系,我只是不想错误地断定当另一个进程在 write() 调用过程中存在损坏。
-
在 windows 和 unix 中,写入和读取通常会命中文件缓存。 whamma 在下面更清楚地解释它。
标签: windows unix concurrency operating-system filesystems