嵌入式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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Soft Robotics:两栖环境下螃蟹仿生机器人的行走控制

传统水陆两栖机器人依靠轮胎或履带与表面的接触及摩擦产生推进力&#xff0c;这种对于表面接触的依赖性限制了现有水陆两栖机器人在低重力环境下&#xff08;如水中&#xff09;的机动性。利用生物自身的推进机制&#xff0c;人为激发生物运动行为&#xff0c;由活体生物与微机…

P1923 【深基9.例4】求第 k 小的数 Python 并未AC的一题

【深基9.例4】求第 k 小的数 题目描述 输入 n n n&#xff08; 1 ≤ n < 5000000 1 \le n < 5000000 1≤n<5000000 且 n n n 为奇数&#xff09;个数字 a i a_i ai​&#xff08; 1 ≤ a i < 10 9 1 \le a_i < {10}^9 1≤ai​<109&#xff09;&#xff…

电阻的妙用:限流、分压、滤波,助力电路设计!

电阻可以降低电压&#xff0c;这是通过电阻的分压来实现的。事实上&#xff0c;利用电阻来降低电压只是电阻的多种功能之一。电路中的电阻与其他元件&#xff08;电容、电感&#xff09;结合用于限流、滤波等。&#xff08;本文素材来源&#xff1a;https://www.icdhs.com/news…

AKShare 快速入门

AKShare 快速入门 查看数据 AKShare 快速入门 具体函数使用详情, 请查看 AKShare 文档 每个接口的示例代码 AKShare 数据接口一览 交易所期货数据 “get_cffex_daily”, # 中国金融期货交易所每日交易数据 “get_cffex_rank_table”, # 中国金融期货交易所前20会员持仓…

简明 Python 教程(第9章 面向对象编程)

本章开始介绍Python的面向对象编程&#xff0c;Python这种动态语言的面向对象和很多强类型语言如JAVA&#xff0c;C#&#xff0c;C等语法上区别还是比较大的&#xff0c;但总体思路基本还是相通的。面向对象编程是一种编程范式&#xff0c;它使用对象来表示现实世界中的实体&am…

C++ :STL中vector扩容机制

vector是STL提供的动态数组&#xff0c;它会在内部空间不够用时动态的调整自身的大小&#xff0c;调整过程中会有大量的数据拷贝&#xff0c;为了减少数据拷贝的次数vector会在调整空间的时候尽量多申请一些空间&#xff0c;这些预留出的空间可以很大程度上减少拷贝的发生。 在…

适合新手小白的wordpress详细安装教程

1、下载程序 到wordpress官方网站下载wordpress程序&#xff0c;官方下载地址&#xff1a;Download | WordPress.org China 简体中文。 下载最新版的wordpress程序 https://cn.wordpress.org/latest-zh_CN.zip 2、上传程序 上传程序前先确认主机是否符合安装的环境要求&…

文件压缩与解压命令

(1)tar 打包或解包 tar 将文件打包tar cvf xxxx.tar(打包好的名字) 需要打包的所有文件名 各参数的意义如下: c:创建包文件 f:指定目标为文件而不是设备; v:显示详细过程; t:显示包中的内容而不释放; x:释放包中的内容 z:GNU版本新加的,使得tar有压缩和解压的功能; 解…

爬虫基础训练题

1.抓取imooc网站实战课程部分的课程名称&#xff08;所有课程大概7页&#xff0c;抓取1到5页&#xff09;&#xff0c;并把所有课程名称存储为txt文件第一页地址 2.设置一个请求头&#xff08;headers&#xff09;&#xff0c;这是一个字典&#xff0c;用于在HTTP请求中设置请…

wordpress搬家修改前缀后台无法访问

wordpress更换域名后&#xff0c;后台不能访问&#xff0c;出现以下提示&#xff1a;Sorry, you are not allowed to access this page. 出现这种情况一般是因为更改了数据表的前缀了&#xff0c;比如&#xff0c;由原来的wp_改为了wp_louyuwu_ 解决办法&#xff1a; 1、打开…

【C++】 switch 语句case后面可以跟 string变量吗? case后面可以怎么跟 string变量?

文章目录 在 C 中&#xff0c;case 语句通常是用于 switch 语句中&#xff0c;用来匹配整数或枚举类型的常量。在标准的 C 中&#xff0c;case 语句后面不能直接跟字符串变量&#xff0c;因为 case 语句要求其后面是一个常量表达式。 如果想在 switch 语句中匹配字符串&#x…

职场人必备!效率翻倍的多微信号必备管理工具大揭秘

在职场中&#xff0c;高效率的工作方式是非常重要的。而为了提高工作效率&#xff0c;合理运用一些工作神器也是必不可少的。今天给大家分享一个多微信号管理工具——微信管理系统&#xff0c;它能够帮助职场人员管理多个微信号&#xff0c;让工作变得更加高效。 首先&#xf…

mamba的学习记录

最近新出了一种很火的架构mamba&#xff0c;听说吊打transformer&#xff0c;特此学习一下&#xff0c;总结一下学习的内容。 state-spaces/mamba (github.com)3个月8Kstar&#xff0c;确实有点受欢迎。 目录 1.先验 RNN​ LSTM ​2.mamba State Space Models​ Selecti…

Django 自定义中间件(IP限制频率、用户权限)

【一】用户权限 &#xff08;1&#xff09;要求 不同的用户&#xff0c;有不同的操作权限比如 超级管理员&#xff0c;拥有所有权限管理员可以增加、查询、修改普通用户只能查询 &#xff08;2&#xff09;逻辑梳理 理论来说&#xff0c;这个权限需要保存在数据库中 但是这…

React和Vue.js的有什么区别

在当今前端开发领域&#xff0c;React 和 Vue.js 作为两大热门的前端框架备受开发者关注。它们各自拥有独特的特点和优势&#xff0c;在实际项目中有着广泛的运用。本文将深入探讨 React 和 Vue.js 之间的区别&#xff0c;从组件化方式、数据绑定、模板语法以及生态系统和工具支…

案例 | 华院计算x第一财经:我和我的数智人唱双簧

创新关乎命运&#xff0c;科技引领未来。生成式人工智能(AIGC)给传媒行业发展带来严峻挑战的同时&#xff0c;也带来千载难逢的重大发展机遇。2024年政府工作报告中提出&#xff0c;要深化大数据、人工智能等研发应用&#xff0c;开展“人工智能”行动&#xff0c;打造具有国际…

俚语加密漫谈

俚语加密是一种古老而有效的通信方式&#xff0c;将特定词语或短语在群体内赋予特殊含义&#xff0c;从而隐藏真实信息。类似于方言&#xff0c;它在历史上的应用不可忽视。随着计算机时代的到来&#xff0c;现代密码学通过数学运算编织密语&#xff0c;使得加密变得更加高深莫…

【win10 win11添加右键】git bash

打开注册表编辑器。 按下Win键 R&#xff0c;然后输入”regedit”并按下回车键来打开注册表编辑器。计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\git_bash\command2. 导航到注册表路径&#xff1a;依次展开”HKEY_CLASSES_ROOT\Directory\Background\shell”。右键…

【数据结构】 HashMap源码分析(常量+构造方法+方法)

文章目录 HashMap源码分析一、成员常量二、构造方法三、方法1.此时假定为进行了无参构造&#xff0c;没有分配内存2.当发生有参构造时&#xff0c;完成对容量的大小判断后&#xff0c;将容量大小&#xff0c;传进tableSizeFor方法中&#xff1a; HashMap源码分析 一、成员常量…

iptables笔记

简介&#xff1a; iptables的前身叫ipfirewall &#xff08;内核1.x时代&#xff0c;当内核发展到2.x系列的时候&#xff0c;软件更名为ipchains&#xff0c;现在更名iptables&#xff0c;可以将规则组成一个列表&#xff0c;实现绝对详细的访问控制功能。 工作在用户空间中&…