【Linux课程学习】:文件第二弹---理解一切皆文件,缓存区
发布时间 - 2025-06-20 00:00:00 点击率:次前言:
本篇重点知识点:1.语言级的缓冲区设计的目的是减少系统调用,以提高效率。内核级的缓冲区是为了减少与外设的交流,提高效率。这两个设计都是为了提高效率。
2.理解外部设备对于进程而言也是文件。struct file中会有操作符表(函数指针的集合),它可以屏蔽不同设备直接的
操作方法。也相当于文件。理解刷新,写入缓冲区本质是拷贝。
一.理解一切皆文件1.1先描述,再组织操作系统OS对下要管理外设,对上要提供对应的接口,让用户进行操作。在系统调用这个层面,又给我封装了语言层的函数。fopen,fclose……
1.1.1那么管理外设,是怎么管理的呢?------先描述,再组织对外部设备的描述,会定义一个结构体,里面包含这外设的类型,工作状态,id值,还有其他很多的属性。-----这样对设备进行了描述。
每一个设备都会有结构体描述起来,他们的大方向是差不多的,有很多对应的属性,比如名称。只是他们的值不一样。每个设备会串在一个链表中,那么到后面,我们对设备的管理,就到了对链表的增删查改。
每一个外设,都有自己的驱动程序,是提供设备的厂商给我们提供的。
1.1.2描述的结构体中,有对应的操作方法Linux系统是C语言写的,C语言结构体中,不能封装方向,那么它是怎么控制对应的设备进行运作的呢?C语言中可以封装函数指针。
比如键盘有写入的函数,输出的函数。显示器也有输入的函数,也有输出的函数。但是对应键盘来说,输入函数是没有意义的,所以就设置为空。对于显示器来说,输入函数是无效的,所以也设置为空。所以这样就能保证能共用一套结构体结构。后面操作系统要进行对应的操作,也可以统一。
1.2在进程角度,一切皆文件对于普通的文件,有对应的文件描述: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如何让内核级缓冲区进行刷新?fd是文件描述符。要进行写入,这个文件肯定被打开,被打开,就肯定在文件描述符表中,fd就表示的是文件描述符表的下标。
3.4如何读取,修改文件?上面所说的是写入,读取就是相反的过程。而修改就包含了读入和修改。
读取就包含了打开文件(如何找到文件,磁盘中的文件时如何,是文件系统的内容,在后面的文件,会进行讲解),把文件的内容加载到缓冲中,然后上层从缓冲中读取,这就形成了读取。
而修改就是先读取,然后把指定的内容进行修改以后,再进行写入就可以了。
3.5内存块缓冲区是有内存块组成的,内存块一般是4KB。
# linux
# c语言
# 操作系统
# 为什么
# 封装
# 多态
# fopen
# fclose
# printf
# 字符串
# 结构体
# void
# 指针
# 接口
# Struct
# 的是
# 外设
# 会有
# 是有
# 写到
# 他们的
# 就会
# 也有
# 就能
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
JavaScript常见的五种数组去重的方式
Python文件异常处理策略_健壮性说明【指导】
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Laravel如何使用Service Container和依赖注入?(代码示例)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
英语简历制作免费网站推荐,如何将简历翻译成英文?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
Android 常见的图片加载框架详细介绍
千库网官网入口推荐 千库网设计创意平台入口
如何用wdcp快速搭建高效网站?
Python文件操作最佳实践_稳定性说明【指导】
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
Python数据仓库与ETL构建实战_Airflow调度流程详解
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
如何在搬瓦工VPS快速搭建网站?
如何登录建站主机?访问步骤全解析
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
活动邀请函制作网站有哪些,活动邀请函文案?
Java解压缩zip - 解压缩多个文件或文件夹实例
成都网站制作公司哪家好,四川省职工服务网是做什么用?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
如何在 React 中条件性地遍历数组并渲染元素
香港服务器部署网站为何提示未备案?
Laravel如何升级到最新版本?(升级指南和步骤)
Bootstrap CSS布局之列表
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
香港服务器如何优化才能显著提升网站加载速度?
如何用景安虚拟主机手机版绑定域名建站?
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
微信小程序 闭包写法详细介绍
网站制作价目表怎么做,珍爱网婚介费用多少?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
如何用PHP快速搭建CMS系统?
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
Python文件流缓冲机制_IO性能解析【教程】
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
浅谈Javascript中的Label语句
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
下一篇:Maya毛发布料特效插件
下一篇:Maya毛发布料特效插件

