今天,我尝试将 Microsoft Word 文档文件从一个位置移动到另一个位置,当时它是在 Microsoft Word 中打开的。但随后系统提示无法移动,因为它是在 Microsoft Word 中打开的。同样,当我们尝试移动正在媒体播放器中播放的 MP3 文件时,也会发生同样的事情。我想还有很多其他类似的情况。
但为什么在任何程序中打开文件时都无法移动它们?这背后的根本思想是什么?
答案1
你所问的概念叫做并发和同步控制,指的是一组防止同时发生的技术(并且可能产生冲突)对多个进程可访问的数据进行更改。
这概念的教科书范例是一对夫妻,他们有一张共同的借记卡,账户中有 1000 美元。如果他们在城镇两端的 ATM 机上,同时提取 1000 美元,并且没有并发控制,银行将总共提取 2000 美元,这显然是不对的。甚至有可能两台 ATM 机都会将金额减为 0,而不是每台都减去 1000 美元,因此银行可能甚至没有注意到他们被骗了。
进一步来说,并发指的是多件事同时发生的情况(以及可能随之而来的问题),而同步是一组避免并发问题的技术,通常通过使用锁来控制谁可以在任何给定时间更改数据。
要解决并发问题,您需要几个组件:
- 系统必须实现多个进程或线程(通常是为了支持多个用户,但这不是严格的要求。)
- 进程/线程/用户必须能够访问他们可以更改的共享数据。
在这种情况下,文件就是数据,两个进程就是访问文件的副本和编辑器/播放器。
文件系统处理文件并发是任何现代操作系统的基本功能。MS 文件系统 API (.dll) 通过创建同步来处理这种情况文件上的锁当进程打开它们时。当一个进程或另一个进程正在更改数据时,锁会阻止对文件的其他操作。对于普通内容文件,当第一个进程打开文件进行读/写时,它会建立一个写锁,以防止所有其他进程更改文件。此外,当该文件正在被主动写入时,会建立一个读锁,这样如果另一个进程试图读取数据,它就不会得到更改前的部分和更改后的部分。这些读锁在文件写入后几乎立即释放,但写锁会一直存在,直到文件关闭。当进程读取数据时也会建立读锁,以防止在读取过程中更改文件。一般的想法是,在存在读锁的情况下您无法写入,并且任何给定时间最多只能有一个写锁,因此只有在没有锁或只有一个由执行写入的进程拥有的写锁的情况下才能写入文件。
通常,内容文件是通过 MS 所称的“单写多读语义“,这通常会允许复制相关文件,因为复制过程不需要写锁。我不确定你的 MP3 播放器为什么会锁定 mp3,但我的直觉是它与播放器内置的元数据编辑器有关。无论哪种方式,重要的是要注意进程本身对于建立哪些锁有一定的控制权,而且也没有很好的方法来判断程序员在想什么。
一些 MS Office 文档使问题更加复杂,因为它们创建临时文件用于编辑(主要是 Word 和 PowerPoint),这可能允许多个编辑者同时更改他们自己的副本,并使用特殊技术试图阻止用户 2 保存文档,并覆盖用户 1 在用户 2 打开文件后保存的更改。然而,Excel 和 Access 可能阻止对 User2 的写访问,并弹出一个窗口询问您是否希望在用户 1 退出文件时收到通知,或允许文件以只读模式打开供用户 2 使用。MS Office 版本对这些问题的处理方式不同。例如,使用 Office '07 时,我必须先关闭文档,然后才能将其附加到电子邮件中。在 2010/2013 中,我不需要这样做。文档是在本地访问还是通过网络共享访问也有所不同。
这是一组极其复杂的主题,它们以无数种方式对多进程/多用户系统产生巨大影响,因此针对每种情况使用的策略都是多种多样的。我在这篇文章中甚至还没有触及表面。处理多线程 IO 算法和数据库并发控制时会变得非常有趣。此处的链接应该可以为您提供一个很好的起点,以根据您的需求和好奇心探索任何深度的概念。
祝你好运
答案2
Frank 的回答很完整,但很长。原因很简单。您无法移动该文件,因为程序(Office 或 MP3 Player)正在使用它。移动文件会复制它,然后删除原始文件。不允许删除正在使用的文件。
Unix 系统似乎允许你删除正在使用的文件。这里的窍门是,文件实际上并未被删除直到所有程序停止使用它。该文件不可见,但仍在磁盘上。但 Windows 只是说“不!”