当前位置: 首页 > news >正文

嵌入式Linux:空洞文件

空洞文件(Sparse File)是一种在磁盘上并非完全分配存储空间的文件。它包含了一些逻辑上存在但物理上并未存储的数据。

空洞文件在多线程共同操作文件时具有极大的优势。当创建一个巨大的文件时,单个线程逐步构建文件会耗费大量时间。一种优化思路是将文件划分为多个段,利用多线程同时操作,每个线程负责写入其中一段数据。这类似于现实生活中修路的场景,如修建高速公路时,单个施工队的进度可能较慢,但通过安排多个施工队,每个队负责修建一段,最终将它们连接起来,大大提高了效率。

空洞文件在实际应用中有两个典型场景:

1、在使用迅雷下载文件时,尚未完全下载时文件已经占据整个文件大小的空间,这就是空洞文件的应用。如果没有空洞文件,多线程下载时只能从一个位置写入,无法充分发挥多线程的优势。有了空洞文件,不同地址可以同时写入,发挥了多线程的优势。

2在创建虚拟机时,如果一开始就分配了100GB的磁盘空间,而实际上系统安装完成后可能只使用了3、4GB的空间,这就是空洞文件的应用。通过空洞文件,可以避免一开始就分配过多的资源,节约了存储空间的浪费。

在 Linux 中,可以通过使用 lseek 和 write 系统调用来创建空洞文件。以下是一个简单的例子:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>int main(void) {// 打开或创建一个文件(如果不存在)int fd = open("sparse_file.txt", O_WRONLY | O_CREAT, 0666);if (fd == -1) {perror("open");return 1;}// 将文件指针移动到第 1024 个字节处if (lseek(fd, 1024, SEEK_SET) == -1) {perror("lseek");close(fd);return 1;}// 写入一个字节数据到文件(创建空洞)if (write(fd, "A", 1) == -1) {perror("write");close(fd);return 1;}// 关闭文件close(fd);printf("Sparse file created successfully.\n");return 0;
}

在这个例子中,通过 lseek 将文件指针移动到第 1024 个字节处,然后使用 write 写入一个字节的数据。由于文件指针跳过的区域并未实际写入数据,因此在磁盘上创建了一个空洞。

可以使用 du 命令查看文件占用的磁盘空间,以验证是否为稀疏文件。例如:

du -h sparse_file.txt

这将显示文件的磁盘使用情况,如果文件是空洞文件,它会显示实际使用的磁盘空间较小。

在文件系统中,读取空洞文件时,操作系统会将空洞部分的数据补充为0,使得读取的文件内容包含完整的文件大小。

举例说明:如果一个文件大小为1GB,但只有其中的100MB是实际写入数据,其余部分是空洞,读取该文件时,系统会自动将空洞的部分填充为0,以确保读取的文件内容总大小为1GB。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 已注册的商标别忘了续展,新注可能难下证!
  • SQL IN 参数超过2100的解决方案
  • 隐私计算实训营学习三:隐私计算框架的架构和技术要点
  • C语言例4-15:从键盘输入一个整数,求其绝对值并输出。
  • mysql服务
  • 【Linux】详解进程终止进程等待
  • Qt5.14.2 全面解锁Qt5事件处理的精髓
  • Partisia Blockchain:如何做到兼顾隐私、高性能和可拓展?
  • PHP页面如何实现设置独立访问密码
  • tewa-707e光猫超级密码获取方法
  • Lua热更新(xlua)
  • 今日讲讲路由配置
  • Docker搭建LNMP环境实战(04):安装VMwareTools共享文件夹
  • Unity 计算两个日期的时间差(含绝对值计算方法)
  • Linux相关命令(1)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • CentOS7简单部署NFS
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript设计模式与开发实践系列之策略模式
  • Java的Interrupt与线程中断
  • Laravel 菜鸟晋级之路
  • LeetCode29.两数相除 JavaScript
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 给第三方使用接口的 URL 签名实现
  • 记录:CentOS7.2配置LNMP环境记录
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 事件委托的小应用
  • HanLP分词命名实体提取详解
  • Java总结 - String - 这篇请使劲喷我
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (3)选择元素——(17)练习(Exercises)
  • (4)事件处理——(7)简单事件(Simple events)
  • (独孤九剑)--文件系统
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (黑马点评)二、短信登录功能实现
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (十三)Flink SQL
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (一)Java算法:二分查找
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)Oracle 9i 数据库设计指引全集(1)
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .bat批处理出现中文乱码的情况
  • .NET Core 版本不支持的问题
  • .Net Core 笔试1
  • .Net Core 中间件验签
  • .NET Framework 4.6.2改进了WPF和安全性
  • .Net mvc总结