Google File System里面有一小节关于文件追加模式是原子操作,笔者不得其解:
l例如现在有两个独立的进程A和B同时append 数据到一个文件里,添加文件必须收lseek文件的末尾的位置,找准位置后才能添加数据:
首先进程A,seek到位置1500byte的位置是文件的末尾
同时进程B,也seek到1500byte
第三,进程B写入100byte的数据,此时文件末尾变成1600byte
第四,调度到A进程时,write数据,由于第一次Alseek到的位置是1500tye,因此A和B写入数据时,实际上已经产生了互相覆盖的可能
1。O_APPEND的含义
是在每次写之前,都讲标志位移动到文件的末端。表面上读这句话可能会有误解,提出一个问题:当在O_APPEND打开后,然后用
lseek移动到其他的位置,然后再用write写,这个时候,请问你数据写到哪里去了?是在末端,还是lseek移动到得位置。答案是在末端,因为
O_APPEND打开后,是一个原子操作:移动到末端,写数据。这是O_APPEND打开的作用。中间的插入是无效的。例如 : int fd =
open("test.txt",RDWR O_APPEND); lseek(fd,10,SEEK_SET);
if(write(fd,buffer,strlen(buffer)) !=strlen(buffer)){ perror("write
error"); exit(1); }
read(fd,buffer,20);这里lseek是没有用的,write的写入是到末端的。在write写完后,标志位是在文件末端的,这个时候的
读是不会读的,所以以前的lseek是没有用的,除非你读之前再lseek一次。 这里的read将不会读出
任何数据,因为在末尾。它还是保持原来的写入的数据。
2
在read读出数据的时候,要明白一个问题。read读出的数据大部分情况下,不是以0结尾的。这样就造成了一种情况,你要输出读出数据的时候,就会出现
问题,因为puts,printf函数都是以0作为输出结束符的。就出出现前面的字符是你想看到的,后面的大部分是乱码.而对于fgets等函数,会在末
尾自动加0
很明显可以看出O_APPEND提供了无锁的文件追加方式,这个机制为并发append,提供了好的内核级别的底层支持,因此GFs的原子记录增加的描述是正确的
- 大小: 47.9 KB
分享到:
相关推荐
5. **并发操作**:GFS需要高效地处理大量客户端同时向同一文件的追加操作,确保语义的正确执行。 **系统接口** GFS提供了类似文件系统的用户界面,但并未完全遵循POSIX标准API。文件以目录结构组织,通过路径名...
- **文件写入模式**:大部分文件的写入操作采用的是在文件尾部追加数据的方式,而非覆盖原有数据。此外,GFS中的文件在创建后通常只进行读取操作,特别是顺序读取。这一特点使得客户端缓存变得不那么必要,并促使...
在实验环境下,GFS文件系统统一安装到了redhat linux7。2下,(最好不要使用redhat 7.1,因为GFS安装成功后,可能会使系统启动失败)因为GFS5。0要求linux的内核必须是2.4.16以上。所以在安装GFS文件系统之前,需要...
### GFS(Google 文件系统)相关知识点 #### 一、引言与背景 Google File System (GFS) 是由Google设计并实现的一种可扩展的分布式文件系统,旨在为大规模的数据密集型应用程序提供支持。该系统在运行于廉价的商用...
GFS2(Global File System 2)是一种高可用性文件系统,能够提供高性能和高可用性的存储解决方案。在GBase 8s SSC集群中,GFS2用于提供高可用性的存储服务。 RHCS设置 RHCS(Red Hat Cluster Suite)是一种集群...
GFS2文件系统,作为Red Hat全球文件系统(Global File System)的第二代版本,是专为Red Hat Enterprise Linux 5设计的一款集群文件系统。它为运行多个节点的集群环境提供高性能、高稳定性的共享存储解决方案。在...
基于GFS2共享模式搭建GBase 8s SSC集群-1
GFS,全称为Google File System,是一个分布式文件系统,由Google设计用于支持大规模的数据处理。在本文中,我们将深入探讨如何在Red Hat Enterprise Linux (RHEL) 5.1上配置GFS,这个版本的内核已经内置了对GFS的...
3. **追加写入为主的文件操作**:GFS中绝大多数文件的修改是通过在文件尾部追加数据来完成的,而不是替换原有的数据。这意味着客户端不需要缓存数据块,同时也简化了文件系统的设计。 4. **应用程序与文件系统API的...
Chunk-server上的文件块大小被设计为64MB,以减少磁盘碎片,并采用追加写入而非随机写入,优化I/O性能。TCP长连接的使用也提升了数据传输效率。 在保证系统可靠性方面,GFS采取了多种措施。每次元数据更改都会先...
标题中的“GFS资料下载工具”指的是一个基于VC++编程语言开发的应用程序,主要用于下载GFS(Global Forecast System)相关的数据。GFS是由美国国家环境预报中心(NCEP)运行的一个全球数值天气预报模型,提供了对...
**GFS分布式文件系统实验包** GFS,全称为Google File System,是Google开发的一款分布式文件系统,主要用于处理大规模的数据存储和处理任务。这个实验包是针对GFS的一个学习资源,旨在帮助用户理解和掌握分布式...
基于 GFS2 共享模式搭建 GBase8s SSC 集群 本文档主要介绍了基于 GFS2 共享模式搭建 GBase8s SSC 集群的步骤和配置过程。该集群需要在管理节点和高可用节点上进行配置,以实现高可用的集群环境。 一、管理节点配置...
Linux环境下使用GFS文件系统 GFS(Global File System)是一种日志文件系统,通常用于多台计算机共享同一存储设备。在Linux环境下使用GFS文件系统,可以带来许多好处,如日志文件系统带来的高性能、可靠性和可扩展...
由于处理的数据量巨大,GFS避免了管理大量小型文件的复杂性,而是以大块I/O操作为主,优化了数据追加和顺序读取的性能。 第三,文件的修改主要通过追加操作完成,而非覆盖。这是因为许多Google应用产生的数据流具有...
3. 追加操作的重要性:由于许多应用的工作负载特性,GFS特别优化了追加操作的性能和原子性,允许多个客户端并发地向同一文件追加数据,这对于生产者-消费者队列和多路合并操作至关重要。 4. 系统设计考虑:GFS设计...