文件相关概念

简介: 文件相关概念

文件相关概念


1、linux文件结构

在 linux 中,内核会根据不同的设备类型,封装出对应的不同的文件类型,以便顶层的应用进程快速识别底层中的设备,主要分为以下几种:

image.png

内核通过文件描述符来进行区分和引用特定的文件


文件描述符

 文件描述符是一个简单的整数,它是一个索引值,并指向内核中每个进程打开文件的记录表。当顶层的应用进程需要对底层的设备进行操作时,需要通过内核将设备对应的文件打开,同时内核会将打开的文件封装成文件描述符返回给用户进程。如果应用进程需要对对应的文件进行读写操作时,就会将文件描述符作为参传递给内核函数,进行操作。

一般情况下,当启动一个进程时,内核会自动为这个进程打开三个文件


分别为:

  • 标准输入(键盘),对应的文件描述符为 0,即宏 stdin
  • 标准输出(屏幕),对应的文件描述符为 1,即宏 stdout
  • 标准出错处理(屏幕),对应的文件描述符为 2,即宏 stder

(如果后面进程需要操作新的设备或者文件,则需要通过内核提供的功能函数先打开文件并返回文件描述符,才能进行各种功能操作,而这个文件描述总是从 3 开始递增分配,一个进程最多只能打开 1024 个。)

其中,进程是一个操作主体,文件是一个电路。


示例一:

两个进程打开相同的文件,得到的是相同的文件描述符。

image.png

结果:

image.png

示例二:

一个进程打开两个不同的文件会得到两个不同的1文件描述符

image.png

结果:

image.png


2、系统调用

用户空间是应用程序启动后执行时所处的地址空间。

内核空间是操作系统及其服务执行时所处的地址空间。

image.png

在有些情况下,用户空间进程需要获得一定的系统服务(调用内核的函数),这时操作系统需要提供一组封装好的“特殊接口”,以便用户进程通过这组接口,进入内核空

间访问内核函数,这时程序运行空间需要从用户空间进入内核空间,处理完之后再返回用户空间。

系统调用的函数会用一组系统调用号来区别。


例子:

int syscall(int number, ...)
number 是需要的函数的系统调用号


3、功能函数库

在 linux 操作中,特别是输入输出操作中,直接使用系统调用的效率非常低。

主要是原因是:

1)系统开销大

因为在执行系统调用的时,Linux 必须从用户态转换到内核态,还要返回用户态。

2)硬件对底层系统调用一次所能读写的数据块做出的限制

所以需要功能函数库配合系统调用来使用,因此以下图示的效率比较低。

image.png

应用进程在调用系统调用之前,通过调用一组已经实现的用户编程接口程序,对数据及操作进行加工处理,再调用内核提供的系统调用,可以在某种程序上避免出现以上问题

image.png

这个用户编程接口即应用空间实的功能函数封装库,例如 libc 库中,就实现了输入输出操作中的 open,read,write 等常用的库函数。通过这些封装好的库函数,我们可以更加快速、便捷地使用内核提供的系统调用。


下面是write系统调用过程分析图:

image.png

过程分析:

  1. 当我们需要向文件写入的时候,调用write函数
  2. write函数是实现的用户编程接口程序,对数据及操作进行加工处理。
  3. 接着,write函数会调用内核提供的系统调用syscall(int number, …),指明一个系统调用号。
  4. 然后这个系统调用号会与sys_write函数绑定,调用相关的驱动代码
  5. 驱动代码会处理底层的磁盘扇区(也就是当前想要处理的文件)

image.png

这两条语句是一样的。


非标准功能函数库的缺点:

但是此功能函数库与系统的关系还是比较大,与系统库是直接绑定的,与这个操作系统相关,只是一个简单的关系转换,这段代码就只能在固定这个系统的里面跑,就不能在其他的系统里面跑,没有跨平台性,会出现系统不兼容的问题,迁移到其他的系统就不能跑起来了。

用的库越高层,就有更好的兼容性。


4、文件的IO操作

有两套大类的操作方式:

1)不带缓存的文件 IO 操作(系统 IO 操作) — 调用非标准库函数实现的 IO 操作

不带缓存的 IO 操作,是通过调用 open、read、write、close 等 libc 库函数间接调用系统调用来实现 IO 操作。因为它们位于 C 标准库的 I/O 缓冲区的底层,所以称为无缓冲 I/O(Unbuffered I/O)。

这种操作方式,可以高效完成文件输入输出。它以文件标识符(整型)作为文件唯一性的判断依据。但是由于这种操作不是 ASCI 标准的,与系统有关,所以移植有一定的问题。当然,效率也是有问题的。

常用的非标准库实现的 IO 操作,主要有以下函数:Open/create/Close/Read/write/Lseek/


2)带缓存的文件 IO 操作 — 通过标准的 LIBC 库实现 IO 操作

带缓存的 IO 操作是在不带缓存的基础之上封装了一层,维护了一个输入输出缓冲区,使之能跨 OS,成为 ASCI 标准,称为标准 IO 库。

由于缓冲区的存在,使得不用频繁地调用系统调用,减少系统的开销,但是响应速度不够及时。移植性较好。

c 库中,常用的 IO 操作函数有 fopen,fwrite,fread 等等。

目录
相关文章
|
JavaScript 开发者
解释 Vue 的组件化开发模式及其优势。
解释 Vue 的组件化开发模式及其优势。
438 0
|
2月前
|
机器学习/深度学习 存储 传感器
面向课堂与自习场景的智能坐姿识别系统——从行为感知到可视化部署的完整工程【YOLOv8】
本系统基于YOLOv8实现课堂与自习场景下的智能坐姿识别,支持标准坐姿与驼背等不良姿态的实时检测。结合PyQt5开发图形界面,提供图片、视频、摄像头多模式输入,具备高精度、低延迟、易部署等特点,适用于智慧校园、健康办公等场景,助力行为规范与健康管理。
172 5
面向课堂与自习场景的智能坐姿识别系统——从行为感知到可视化部署的完整工程【YOLOv8】
|
3月前
|
运维 监控 Java
分布式事务新方案:Saga 与 TCC 在 Java 生态的融合实践
本文深入探讨Saga与TCC两种分布式事务模式在Java生态中的原理、实现及融合实践,结合Seata等框架,分析其在微服务架构下的应用策略、性能优化与监控运维,助力构建高效稳定的分布式事务解决方案。
625 1
|
12月前
|
存储 缓存 算法
JDK11升级后竟让内存利用率飙升到90%以上?
JDK11升级后竟让内存利用率飙升到90%以上?
|
安全 API 开发者
如何选择适合的CMS搭建网站?
选择合适的CMS(内容管理系统)是建立成功网站的关键。首先,明确功能需求、用户类型和预算限制;其次,考虑技术栈,包括易用性、扩展性和安全性;再者,评估社区支持、性能优化及SEO友好性;最后,关注定制性和扩展能力。常见CMS如PageAdmin适合企业与政务网站,Drupal适用于高度定制化需求,Magento/WooCommerce专注电商。建议在决定前试用多个CMS,确保选择最适合的系统。
174 4
|
12月前
|
机器学习/深度学习 人工智能 API
aliyun评测零门槛、即刻拥有 DeepSeek-R1 满血版
DeepSeek-R1满血版是一款零门槛、高性能的深度学习工具,旨在帮助开发者和研究人员高效实现创新。评测显示,其操作界面设计友好,左右分屏布局使理论与实践紧密结合,极大提升了操作连贯性和效率。用户可轻松获取API-KEY,并通过Chatbox配置进行深度学习对话,整个过程简单流畅。该工具在部署集成性、易用性及高性能计算支持方面表现出色,尤其适合本地软件部署,满足用户的实际需求。阿里云提供的详尽文档和引导也使得初次使用者能快速上手,体验极佳。
342 1
|
监控 数据可视化 搜索推荐
如何通过数据分析优化营销流程?
在当今竞争激烈的市场中,企业需构建高效的营销流程以整合资源、提升效率并实现业务增长。本文从目标设定、渠道选择、内容创作、数据分析及团队协作工具等方面详细探讨了如何优化营销流程,并指出了常见问题及改进方向。通过明确目标、精准选择渠道、创作高价值内容、用数据驱动决策以及提升团队协作效率,企业能够在激烈的市场竞争中脱颖而出,实现持续增长。
|
安全 PHP Apache
【ThinkPHP框架教程·Part-02】开发规范和目录结构
本章节介绍ThinkPHP6.0的编码开发规范及目录结构。开发规范遵循PSR-2和PSR-4标准,涵盖命名、文件结构等;目录结构支持单应用和多应用模式,默认仅public目录对外访问,确保安全性。单应用模式下,app目录包含控制器、模型等核心组件;多应用模式允许多个app_name共存,适应复杂项目需求。配置文件与运行时文件分离,确保高效与安全。
【ThinkPHP框架教程·Part-02】开发规范和目录结构

热门文章

最新文章