美文网首页
多个进程同时访问某个文件

多个进程同时访问某个文件

作者: 北风知我意 | 来源:发表于2019-06-22 22:32 被阅读0次

因为业务需求需要多个进程同时访问某个文件并进行读写操作的需求,因为文件并不是被同一个进程访问,而且极大可能会发生多进程争抢文件句柄的情况,如果在同一个进程里不同的线程访问,或许还能使用线程锁的方式控制,但是跨进程时就无法解决。网上询问解决方法基本上都类似Linux里日志文件服务一样,建立一个独立的文件操作服务,由文件操作服务来控制不同进程对同一个文件的访问。但是这样改动量就比较大,而且因为不同的程序可能是由不同的语言编写的,比如JAVA和C#。而不同的语言访问window服务可能都有局限性(部署更是个大问题因为window服务需要最高的system权限运行),更重要的是如果一个程序需要平凡读写文件,每次读写前必须绕一层服务效率上大打折扣,所以此方法并未采纳。

        为了解决不同开发工具开发和效率所带来的问题,我不得不设计一种较简单实现,又不用太过修改代码的方法。参考vss想到,为什么不能在每次文件读写前先将文件签出?但是如何保证签出后的文件其他进程无法都写呢?一个方法是建立一个签出服务,这个不行原因前面已经提过。于是考虑最简单的方法,也就是每次读写文件前先改文件的扩展名。

        改扩展名的方法非常简单,也不难实现。现在程序访问文件前,都必须用原文件名改名为包含签出扩展名的新文件名(现实中会将文件扩展名改为.ck),其他进程只会访问那些不是.ck为扩展名的文件。

流程:

1)  程序首先得到需要访问的原文件名(比如Test.xml)

2)  使用原文件名作为基础,改名为签出文件名(比如Test.ck)

3)  因为同一时间只可能有一个进程能够修改文件名,所以当一个进程抢先与另一个进程修改了文件,那另一个进程再次使用原文件名(Test.xml)将无法访问到这个文件(因为文件名已经被修改为Test.ck)而报错(可以屏蔽这个错误),如果修改成功则表示文件已经被你签出。你可以继续使用新的文件名对文件进行修改。其他进程如果使用原文件名将无法访问这个文件。

4)  处理完数据后将文件扩展名改回原文件名(Test.xml)

        原理和写数据库时抢锁类似,每次访问文件前都必须首先改名(抢锁),只有抢到锁的进程才能进行后续操作。否则则等待其他进程释放锁。

相关文章

  • 多个进程同时访问某个文件

    因为业务需求需要多个进程同时访问某个文件并进行读写操作的需求,因为文件并不是被同一个进程访问,而且极大可能会发生多...

  • 操作系统2.20

    读者进程不会改变数据 因此可以多个读者进程同时访问共享文件 而写者进程 会改变数据 是不可以和其他进程同时访问共享...

  • 2018-08-06:04-使用zookeeper实现分布式锁

    分布式锁含义:分布式锁是指在多个进程中对A资源进行访问控制。需要保证多个进程访问A资源时必须是有序访问,不能同时访...

  • 跨进程文件锁 - FileChannel

    背景 当有多个进程或者多个应用同时操作文件时 , 会并行往文件中写入字节 , 如何保证多个进程中文件写入或者操作当...

  • Linux编程--文件原子操作

    当多个进程同时访问一个文件的时候,普通的write/read在执行的时候,无法保证操作的原子性,可能会导致文件被污...

  • 操作系统内存小结

    概念1.虚拟地址:两个进程同时访问地址为2000的数据,后来的进程会覆盖前一个进程中数据。为了解决多个进程访问时的...

  • 本地localhost访问和本地配置虚拟主机访问

    本地localhost访问: 本地WWW文件下可能存放多个项目.直接localhost到WWW目录.再访问某个项目...

  • 5.redis缓存击穿、redis事务、删除策略、淘汰策略

    1.缓存击穿是什么?当某个缓存失效后,多个线程同时访问,同时判断缓存是失效的,那就会多个线程都访问数据库查询,并多...

  • 进程间通信

    进程的读写 写文件的进程只能单个运行(写的时候禁止读),读文件的进程可以同时有多个,读写的互斥锁wsem,rsem...

  • 8.3 经典进程同步问题-读写者问题

    问题描述 有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写...

网友评论

      本文标题:多个进程同时访问某个文件

      本文链接:https://www.haomeiwen.com/subject/getvgftx.html