【Linux文件系统】被打开的文件与文件系统的文件之间的关联刨析总结

2024-06-24 09:28

本文主要是介绍【Linux文件系统】被打开的文件与文件系统的文件之间的关联刨析总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

操作系统管理物理内存以及与外设磁盘硬件进行数据的交换

操作系统如何管理物理内存呢?

其实操作系统内核先对内存先描述再组织的!操作系统管理内存的基本单位是4KB,操作系统会为每一个4KB大小的物理内存块创建一个描述该4KB内存块的struct page结构体,该结构体存储着这4KB内存块的属性信息,通过管理struct page来对内存进行管理,page结构体的大小比较小,OS通常将它们组成一个数组,因此只要对物理内存的管理就变成了对该数组的管理!要想访问某几个页框仅需在page结构体数组中查找即可。

物理内存与磁盘进行数据输入输出时的基本单位是4KB,但是如果物理内存现在要将100字节的数据输入给磁盘,直接将这100字节的内存数据给磁盘就可以了,为什么要必须给4KB内存数据呢?

如果仅仅是要多少给多少,磁盘是机械设备输入输出数据较慢,就可能会导致OS频繁访问磁盘导致整个过程变慢。因此以4KB作为数据交互的基本单位的原因是:1.减少IO次数,减少访问外设次数,提高效率。2.局部性原理。

OS还会对内存管理时采取slab内存分配机制来提升效率:OS会将某些高频的数据结构对象用链表等数据结构连接起来存入缓存区,先不释放它们,这样一来就可以在下次OS需要创建数据结构对象省去malloc创建结构体对象,而直接从缓存区拿,这样一来就提高了操作系统的工作效率。

被打开文件与文件系统文件之间的联系

被打开文件和文件系统文件之间的联系如下图:

将向文件内写入内容的过程:

使用c库文件操作函数将内容写入用户级缓冲区,再通过fd和write系统调用将内容写入对应的内核级缓冲区,再将内容拷贝到磁盘上;或直接使用write系统调用通过fd将文件写入对应的内核级缓冲区即页框中,再将内容拷贝到磁盘上。

描述文件的struct file里虽然有一部分文件的属性,而struct inode中有全部的文件属性。

struct file结构体中有指向struct address_sapce结构体的指针,该结构体中有有指向struct page_tree的结构体的指针,struct page_tree中有struct page文件页缓冲区(内核缓冲区),由该缓冲区将用户输入的内容拷贝到磁盘中。

Linux中每一个进程打开的每一个文件都要有自己的储存文件属性的inode和自己的文件页缓冲区。

操作系统在启动时会默认将文件系统中各分区的Super Block各分组的Group Descriptor Table数据拷贝到物理内存中,这样就使文件页缓冲区向磁盘中拷贝数据时快速找到要写入的文件区域并且清楚哪些磁盘内存块是已被占用的那些是没被占用的,避免造成数据覆盖,也提高了文件拷贝的效率。

这篇关于【Linux文件系统】被打开的文件与文件系统的文件之间的关联刨析总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089753

相关文章

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在