Linux系统环境下关于多进程并发写同一个文件的讨论.pdf

Linux系统环境下关于多进程并发写同一个文件的讨论.pdf

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux系统环境下关于多进程并发写同一个文件的讨论.pdf

讨论关于并发环境下,多个进程对同一文件写入的问题,我们会涉及到文件共享的知识。在开始之 前,我们先讨论一些有关文件共享的知识。 1. 文件共享 Unix系统支持在不同进程间共享打开的文件。为此,我们先介绍一下内核用于所有I/O的数据结构。 注意,下面的说明是概念性的,与特定的实现可能匹配,也可能不匹配。 内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个 进程可能产生的影响。 (1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,可将其视为一 个矢量,每个描述符占用一项。与每个文件描述符相关联的是: (a) 文件描述符标识(close_on_exec)。 (b)指向一个文件表项的指针。 (2)内核为所有的打开文件维持一张文件表。每个文件表项包含: (a)文件状态标志(读、写、添加、同步和非阻塞等)。 (b)当前文件偏移量。 (c)指向该文件v节点的指针。 (3)每个打开文件(或设备)都有一个v节点(v-node)结构。v节点包含了文件类型和对此文件 进行各种操作的函数的指针。对于大多数文件,v节点还包含了该文件的i节点(i-node,索引节点)。 这些信息是在打开文件时从磁盘上读入内存的,所以所有关于文件的信息都是快速可供使用的。例 如,i节点包含了文件的所有者,文件长度,文件所在的设备,指向文件实际数据块在磁盘上所在位置 的指针等等。 注意:Linux没有使用v节点,而是使用了通用i节点结构。虽然两种实现有所不同,但在概念上, v节点与i节点是一样的。两者都指向文件系统特有的i节点结构。 我们忽略了默写实现细节,但这并不影响我们的讨论。例如,打开文件描述符表可存放在用户控 件,而非进程表中。这些表也可以用于多种方式的实现,不必一定是数组;例如,可将它们实现为结 构的连接表。这些细节并不影响我们在文件共享方面的讨论。 图1显示了一个进程的三张表之间的关系。该进程有两个不同的打开文件:一个文件打开为标注输 入(文件描述符为0),另一个打开为标准输出(文件描述符为1)。从Unix系统的早期版本中 [Thompson 1978]以来,这三张表之间的基本关系一直保持至今。这种安排对于在不同进程之间共享文 件的方式非常重要。 图1 打开文件的内核数据结构 1. 注意:创建v节点结构的目的是对在一个计算机系统上的多文件系统类型提供支持。这一工作是有Peter Weihberger(贝尔实验室) 和Bill Joy(Sun公司)分别独立完成的。Sun称此种文件系统为虚拟文件系统(Virtual File System),称与文件系统类型无关的 i节点部分为v节点[Kleiman 1986].当哥哥制造商的实现增加了对Sun的网络文件系统(NFS)的支持时,它们都广泛采用了v节点结 构。在BSD系统中首先提供v节点的是4.3BSD Reno版本,其中加入了NFS。 2. 3. 在SVR4中,v节点代换了SVR3中与文件系统类型无关的i节点结构。Solaris是从SVR4发展而来的,他也是用了v节点。 4. 5. Linux没有将相关的数据结构分为i节点和v节点,而是采用了一个独立于文件系统的i节点和一个依赖于文件系统的i节点。 如果两个独立进程各自打开了同一个文件,则有图2中所示的安排。我们假设第一个进程在文件 描述符3上打开该文件,而另一个进程则在文件描述4上打开该文件。打开该文件的每一个进程都得到 一个文件表项,但对一个给定的文件只有一个v节点表项。每个进程都有自己的文件表项的一个理由 是:这种安排使每一个进程都有它自己的对该文件的当前偏移量。 图2 两个独立进程各自打开同一个文件 给出了这种数据结构后,现在对前面所描述的操作做进一步说明。 在完成每个write后,在文件表项中的当前文件偏移量即增加所写的字节数。如果当前文件偏移量超过 了当前文件长度,则在i节点表项中的当前文件长度被设置为当前文件的偏移量。 如果用O_APPEND标志打开了一个文件,则相应标志也被设置到文件表项的文件状态标志中。每次对这 种具有添写标志的文件执行写操作时,在文件表项中的当前文件偏移量首先被设置为i节点表项中的文 件长度。这就使得每次写的数据都添加到文件的当前尾端处。

文档评论(0)

tangtianxu1 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档