进程间文件交换:效率和竞争条件

Ada*_*ker 9 java filesystems operating-system ipc file

故事:
几天前,我在考虑基于文件交换的进程间通信.假设进程A在其工作期间创建了几个文件,然后进程B读取这些文件.为确保正确写入所有文件,创建一个特殊文件会很方便,该文件的存在将表明所有操作都已完成.

简单的工作流程:
进程A创建文件"file1.txt"
进程A创建文件"file2.txt"
进程A创建文件"processA.ready"

进程B正在等待文件"processA.ready"出现,然后读取file1和file2.

怀疑:
文件操作由操作系统执行,特别是由文件子系统执行.由于Unix,Windows或MacOS的实现可能不同,我不确定文件交换进程间通信的可靠性.即使操作系统能够保证这种一致性,Java中的JIT编译器也可以重新排序程序指令.

问题:
1.操作系统中的文件操作是否有任何实际规范?
2. JIT是否真的允许为单个程序线程重新排序文件操作程序指令?
3.文件交换现在仍然是进程间通信的相关选项,还是无条件地更好地选择TCP/HTTP /等?

小智 2

  1. 您可以使用 Java 中的文件观察器 (WatchService) 在 .ready 文件出现时接收信号。

  2. 可以进行重新排序,但在这种情况下它不会损害您的应用程序逻辑 - 请参阅以下链接: https ://assylias.wordpress.com/2013/02/01/java-memory-model-and-reordering/

  3. 我不知道您的数据大小,但我觉得在这种情况下使用消息队列(MQ)解决方案仍然会更好。使用文件 IO 是一个相对较慢的操作,可能会降低系统速度。