【Linux课程学习】:文件第二弹---理解一切皆文件,缓存区

 🎁个人主页:我们的五年

🔍系列专栏:Linux课程学习 

🌷追光的人,终会万丈光芒

🎉欢迎大家点赞👍评论📝收藏⭐文章

 Linux学习笔记:

 https://blog.csdn.net/djdjiejsn/category_12669243.html

前言:

在本篇文章中,站在操作系统的角度看待文件,对于文件,操作系统会进行怎么样的处理。重定向,缓冲区(语言级,内核级)。


目录

本篇重点知识点:

一.理解一切皆文件

1.1先描述,再组织

1.1.1那么管理外设,是怎么管理的呢?------先描述,再组织

1.1.2描述的结构体中,有对应的操作方法

1.2在进程角度,一切皆文件

二.文本写入和二进制文件

2.1为什么要有printf这样的函数?

2.2伟大的C语言

三.内核级缓冲区

3.1他们是如何提高效率的呢?

3.2如何看待内核级缓冲区?

3.3如何让内核级缓冲区进行刷新?

3.4如何读取,修改文件?

3.5内存块


本篇重点知识点:

1.语言级的缓冲区设计的目的是减少系统调用,以提高效率。内核级的缓冲区是为了减少与外设的交流,提高效率。这两个设计都是为了提高效率

2.理解外部设备对于进程而言也是文件。struct file中会有操作符表(函数指针的集合),它可以屏蔽不同设备直接的操作方法。也相当于文件。理解刷新,写入缓冲区本质是拷贝。

3.

一.理解一切皆文件

其他的文件对于进程而言是文件,这个点很好理解。但是外部设备,比如键盘,显示器,网卡……,这些外设对于进程而言也是文件,这该如何理解呢?

1.1先描述,再组织

操作系统OS对下要管理外设,对上要提供对应的接口,让用户进行操作。在系统调用这个层面,又给我封装了语言层的函数。fopen,fclose……

1.1.1那么管理外设,是怎么管理的呢?------先描述,再组织

对外部设备的描述,会定义一个结构体,里面包含这外设的类型,工作状态,id值,还有其他很多的属性。-----这样对设备进行了描述。

每一个设备都会有结构体描述起来,他们的大方向是差不多的,有很多对应的属性,比如名称。只是他们的值不一样。每个设备会串在一个链表中,那么到后面,我们对设备的管理,就到了对链表的增删查改。

每一个外设,都有自己的驱动程序,是提供设备的厂商给我们提供的。

1.1.2描述的结构体中,有对应的操作方法

Linux系统是C语言写的,C语言结构体中,不能封装方向,那么它是怎么控制对应的设备进行运作的呢?C语言中可以封装函数指针

比如键盘有写入的函数,输出的函数。显示器也有输入的函数,也有输出的函数。但是对应键盘来说,输入函数是没有意义的,所以就设置为空。对于显示器来说,输入函数是无效的,所以也设置为空。所以这样就能保证能共用一套结构体结构。后面操作系统要进行对应的操作,也可以统一。

1.2在进程角度,一切皆文件

VFS(virtual   File   System  Switch):虚拟文件系统。

对于普通的文件,有对应的文件描述:struct file。里面包含文件的属性和方法。但是从上面来看,底层在进行处理以后,也是有struct file,里面包含这属性和方法,让不同的设备一同样的方式描述起来,这就和文件一样了。所以外部设备也可以理解为文件了。

我们的所以行为,全部都会被转换为进程。当进程找到对应的文件,就可以有对应的方法,该可以调用函数进行执行了。

多个设备提供的方法就是多态


二.文本写入和二进制文件

显示器是字符设备,我们输出1234(一千两百三十四),其实是在显式器上输出了‘1’字符,‘2’字符,‘3’字符,‘4’字符。

2.1为什么要有printf这样的函数?

对于write系统调用而言,它要输出的字符串是void*类型的,它没有所谓的文本和二进制。那为什么我们还要去printf指明所对应的类型呢,比如要打印整数,我们在printf中写%d,打印浮点数%f。就能直接打印,不然直接用write时,我们先要把整数转化为字符串,才能打印。

所以printf是方便了我们用户的。

在底层是不区分文件文件和二进制文件的。字符其实有对应的ACSII码,是一个一个的二进制数字表示的字符。所以只有二进制文件。

2.2伟大的C语言

不同系统的系统调用会不一样,但是我们在写代码的时候,在不同的平台基本没有变化。不同的操作系统的底层接口是不一样的,C语言帮我们封装以后,让我们不要去担心底层,C语言在不同操作系统会有不同的处理。

提高代码的可移植性

C语言的库:

一款语言,会实现不同操作系统的兼容,不同的操作系统的底层实现是不一样的。所以就有了语言的可移植性。这也是为了增加用户群体。


三.内核级缓冲区

在操作系统有内核级缓冲区,在语言级有语言级的缓冲区。他们两个是不同的,但是他们两个的实现的目的就是为了提高效率。

3.1他们是如何提高效率的呢?

如果每个我们每次输出都进行一次output,就会有很大的成本,他们一般设置的是行刷新,或者是当缓冲区满的时候,再刷新(fflush)。

对于显示器这样的特殊设备,一般用的是行刷新,即遇到换行就会刷新。对于其他的文件,那么可能就是当缓冲区满的时候,才会进行刷新。

3.2如何看待内核级缓冲区?

当我们调用write接口对于文件进行写入时,不是直接写到文件,而是写到文件的缓冲区。具体多久写到文件中,由操作系统决定。所以不是每使用一次write,就会进行一次IO。而是有几次,当缓冲区中的内容到达一定的数量时,才进行刷新。

语言级的缓存区差不多也是这样的设计。当我们使用printf时,不会直接把我们输出的内容直接输出到内核级缓冲区。而是把要输出的内容拷贝到FILE结构体的buf数组中。在满足一定条件的时候,才会把buf数组中的调用系统调用接口,把FILE结构体中的内容拷贝到内核级缓冲区。

内核级缓冲区多久进行IO,由操作系统决定。

3.3如何让内核级缓冲区进行刷新?

#include <unistd.h>

int fsync(int fd);

int fdatasync(int fd);

fd是文件描述符。要进行写入,这个文件肯定被打开,被打开,就肯定在文件描述符表中,fd就表示的是文件描述符表的下标。

3.4如何读取,修改文件?

上面所说的是写入,读取就是相反的过程。而修改就包含了读入和修改。

读取就包含了打开文件(如何找到文件,磁盘中的文件时如何,是文件系统的内容,在后面的文件,会进行讲解),把文件的内容加载到缓冲中,然后上层从缓冲中读取,这就形成了读取。

而修改就是先读取,然后把指定的内容进行修改以后,再进行写入就可以了。

3.5内存块

缓冲区是有内存块组成的,内存块一般是4KB。


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

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

相关文章

centos 手动安装libcurl4-openssl-dev库

下载源代码 curl downloadshttps://curl.se/download/ 选择需要下载的版本&#xff0c;我下载的是8.11.0 解压 tar -zxvf curl-8.11.0 查看安装命令 查找INSTALL.md&#xff0c;一般在docs文件夹下 –prefix &#xff1a;指定安装路径&#xff08;默认安装在/usr/local&…

汽车IVI中控OS Linux driver开发实操(二十八):回声消除echo cancellation和噪声消除Noise reduction

概述: 在当今高度互联的世界中,清晰的实时通信比以往任何时候都更重要。在远程团队会议期间,没有什么能像回声一样打断对话。当说话者听到他们的声音回响时,可能会分散注意力,甚至无法理解对话。即使是很小的回声也会产生很大的影响,仅仅25毫秒的振幅就足以造成声音干扰…

客户端安全开发基础-PC篇-附项目源码

客户端安全开发基础-PC篇 written by noxke 项目源码下载 https://download.csdn.net/download/Runnymmede/90079718 1.程序分析 使用ida打开crackme.exe&#xff0c;进入到程序的主逻辑函数&#xff0c;注意到有大量的xmm寄存器&#xff0c;但是不含call指令&#xff0c;先…

static关键字在嵌入式C编程中的应用

目录 一、控制变量的存储周期和可见性 1.1. 局部静态变量 1.2. 全局静态变量 二、控制函数的可见性 2.1. 静态函数 2.2. 代码示例&#xff08;假设有两个文件&#xff1a;file1.c和file2.c&#xff09; 三、应用场景 3.1. 存储常用数据 3.2. 实现内部辅助函数 四、注…

Linux笔记---进程:进程替换

1. 进程替换的概念 进程替换是指在一个正在运行的进程中&#xff0c;用一个新的程序替换当前进程的代码和数据&#xff0c;使得进程开始执行新的程序&#xff0c;而不是原来的程序。 这种技术通常用于在不创建新进程的情况下&#xff0c;改变进程的行为。 我们之前谈到过for…

借助 AI 工具,共享旅游-卡-项目助力年底增收攻略

年底了&#xff0c;大量的商家都在开始筹备搞活动&#xff0c;接下来的双十二、元旦、春节、开门红、寒假&#xff0c;各种活动&#xff0c;目的就是为了拉动新客户。 距离过年还有56 天&#xff0c;如何破局&#xff1f; 1、销售渠道 针对旅游卡项目&#xff0c;主要销售渠道…

剖析千益畅行,共享旅游-卡,合规运营与技术赋能双驱下的旅游新篇

在数字化浪潮席卷各行各业的当下&#xff0c;旅游产业与共享经济模式深度融合&#xff0c;催生出旅游卡这类新兴产品。然而&#xff0c;市场乱象丛生&#xff0c;诸多打着 “共享” 幌子的旅游卡弊病百出&#xff0c;让从业者与消费者都深陷困扰。今天&#xff0c;咱们聚焦技术…

9. 一分钟读懂“策略模式”

9.1 模式介绍 策略模式是一种行为型设计模式&#xff0c;用于在运行时灵活切换对象的行为或算法&#xff0c;它将算法封装为独立的类&#xff0c;使得它们可以互相替换&#xff0c;而不会影响使用这些算法的客户端代码。 策略模式的核心思想是&#xff1a;定义一系列可互换的算…

Ant-Design X,AI组件库

前端的小伙伴们都知道有一个前端组件库超级火&#xff0c;可以说是 Top1 级别的&#xff0c;那就是 Ant-Design 而就在最近&#xff0c;他们又推出了一款新的组件库&#xff0c;Ant-Design X&#xff0c;这是专门用来做 AI 产品 的组件库&#xff0c;可能大家还很疑惑&#xf…

Wwise 使用MIDI文件、采样音频

第一种&#xff1a;当采样音频只有一个文件的时候 1.拖入MIDI文件到Interactive Music Hierarchy层级 2.拖入采样音频到Actor-Mixer Hierarchy层级 3.勾选MIDI显示出面板&#xff0c;设置Root Note与采样音频音高相同&#xff0c;这里是C#5 4.播放测试&#xff0c;成功&…

如何抽象策略模式

策略模式是什么 策略设计模式&#xff08;Strategy Pattern&#xff09;是一种面向对象设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换。这种模式使得算法可以独立于使用它们的客户端而变化。 策略设计模式包含三个主…

优先算法 —— 滑动窗口系列 - 无重复字符的最长子串

目录 前言 1. 无重复字符的最长子串 2. 题目解析 3. 算法原理 解法1&#xff1a;暴力枚举 哈希表&#xff08;判断字符是否有重复出现&#xff09; 解法2&#xff1a;滑动窗口 4. 代码 前言 当我们发现暴力解法两个指针都不回退&#xff0c;都是向同一个方向移动的时候我…

BurpSuite工具-Proxy代理用法(抓包、改包、放包)

一、Burp Suite 项目管理 二、Proxy&#xff08;代理抓包模块&#xff09; 1. 简要说明 1.1. Intercept&#xff08;拦截&#xff09; 1.2. HTTP History&#xff08;HTTP 历史&#xff09; 1.3. WebSockets History&#xff08;WebSocket 历史&#xff09; 1.4. Options…

Marvell第四季度营收预计超预期,定制芯片需求激增

芯片制造商Marvell Technology&#xff08;美满电子科技&#xff09;&#xff08;MRVL&#xff09;在周二发布了强劲的业绩预告&#xff0c;预计第四季度的营收将超过市场预期&#xff0c;得益于企业对其定制人工智能芯片的需求激增。随着人工智能技术的快速发展&#xff0c;特…

915DEBUG-obsidianTemplater使用

Templater使用 tp函数不正常显示相应数据 模板使用方式不正确 <% tp.date.now("YYYY-MM-DD") %> 应该被放置在一个被Templater识别为模板的文件中&#xff0c;或者在你使用Templater的插入模板功能时输入。如果只是在一个普通的Markdown文件中直接输入这段代码…

html+css网页设计马林旅行社移动端4个页面

htmlcss网页设计马林旅行社移动端4个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

笔记本电脑usb接口没反应怎么办?原因及解决方法

笔记本电脑的USB接口是我们日常使用中非常频繁的一个功能&#xff0c;无论是数据传输、充电还是外接设备&#xff0c;都离不开它。然而&#xff0c;当USB接口突然没有反应时&#xff0c;这无疑会给我们的工作和学习带来不小的困扰。下面&#xff0c;我们就来探讨一下笔记本USB接…

JAVA |日常开发中Servlet详解

JAVA &#xff5c;日常开发中Servlet详解 前言一、Servlet 概述1.1 定义1.2 历史背景 二、Servlet 的生命周期2.1 加载和实例化2.2 初始化&#xff08;init 方法&#xff09;2.3 服务&#xff08;service 方法&#xff09;2.4 销毁&#xff08;destroy 方法&#xff09; 三、Se…

Python酷库之旅-第三方库Pandas(255)

目录 一、用法精讲 1206、pandas.tseries.offsets.SemiMonthEnd.is_on_offset方法 1206-1、语法 1206-2、参数 1206-3、功能 1206-4、返回值 1206-5、说明 1206-6、用法 1206-6-1、数据准备 1206-6-2、代码示例 1206-6-3、结果输出 1207、pandas.tseries.offsets.S…

MySQL——操作

一.库的操作 1.基本操作 创建数据库 create database 数据库名称; 查看数据库 show databases; 删除数据库 drop database 数据库名称; 执行删除之后的结果: 数据库内部看不到对应的数据库 对应的数据库文件夹被删除&#xff0c;级联删除&#xff0c;里面的数据表全部被删…