文件操作系统入门基本概念

1、文件管理系统

  在大多数应用中,文件是一个核心成分,处理实时应用和一些特殊的应用外,应用程序的输入都是通过文件的形式来完成的,实际上,所有应用程序的输出都保存在文件中,这便于信息的长期存储,也便于用户将来通过应用程序访问信息。

  数据或者文件归根结底是存储于物理内存空间上的,操作系统可以通过文件系统方便的管理磁盘上的文件,Linux的文件系统模型如下所示:

Linux文件系统模型

  对于物理内存的访问都是同通过设备驱动程序来进行的,而对设备启动的访问则有两种途径:一种是通过设备驱动本身提供的接口;另一种是通过虚拟文件系统(Vitual File System,VFS)提供给上层应用程序的接口。第一种方式能够让用户进程绕过文件系统字节读写磁盘上的内容,但这个操作会带来极大的不稳定性,因此大部分操作系统包括linux都是使用虚拟文件系统来访问设备驱动的。只有在特殊情况下,才允许用户进程通过设备驱动接口直接访问物理磁盘。

  VFS是虚拟的,不存在的,他和proc文件系统一样,都是只存在于内存而不存在于物理硬件中的,即只有在操作系统运行了以后才能存在,VFS提供的这一种机制可将各种不同的文件系统整合在一起,并提供统一的API接口供上层的引用程序使用。VFS的使用体现了Linux文件系统的最大特点——支持多种不同的文件系统,如XFS、EXT4、EXT3、EXT2、NFTS、VFAT等。

2、文件IO和标准IO

一、先来了解下什么是文件I/O和标准I/O:

文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台。

标准I/O:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。标准I/O库处理很多细节。例如缓存分配,以优化长度执行I/O等。标准的I/O提供了三种类型的缓存。

(1)全缓存:当填满标准I/O缓存后才进行实际的I/O操作,对于读操作,直到读入的内容字节数等于缓冲区大小或者文件已经到达结尾,才进行实际的IO操作,将外存文件内容读入缓冲去;对于写操作,直到缓冲区被填满,才进行实际的IO操作,将缓冲区内容写到外存文件中。磁盘文件通常是全缓冲。
(2)行缓存:当输入或输出中遇到新行符时,才调用系统IO函数
(3)不带缓存:stderr就是了。

二、二者的区别

      文件I/O 又称为低级磁盘I/O,遵循POSIX相关标准。任何兼容POSIX标准的操作系统上都支持文件I/O。

  标准I/O被称为高级磁盘I/O,遵循ANSI C相关标准。只要开发环境中有标准I/O库,标准I/O就可以使用。(Linux 中使用的是GLIBC,它是标准C库的超集。不仅包含ANSI C中定义的函数,还包括POSIX标准中定义的函数。因此,Linux 下既可以使用标准I/O,也可以使用文件I/O)。

在实现对文件的操作上,两者具有显著的区别:

  (1)标准I/O默认采用了缓冲机制,比如调用fopen函数,不仅打开一个文件,而且建立了一个缓冲区(读写模式下将建立两个缓冲区),还创建了一个包含文件和缓冲区相关数据的数据结构。低级I/O一般没有采用缓冲,需要自己创建缓冲区,不过其实在linix或unix系统中,都是有使用称为内核缓冲的技术用于提高效率,读写调用是在内核缓冲区和进程缓冲区之间进行的数据复制。

  (2)从操作的设备上来区分,文件I/O主要针对文件操作,读写硬盘等,它操作的是文件描述符,标准I/O针对的是控制台,打印输出到屏幕等,它操作的是字符流。对于不同设备得特性不一样,必须有不同API访问才最高效。

三、两者下的函数

3、文件描述符

  对于内核而言,所有打开的文件都得通过文件描述符引用。文件描述符本质上是一个非负整数,当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符,该文件描述符用于对文件进行读写操作。   在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。在linux下建议使用符号常量STDIN_FILENO、STDOUT_FILENO、STDER_FILENO进行代替,提高程序可读性,这些常量通常定义在头文件<unistd.h>中。

标准文件描述符图如下:

文件打开与文件描述符之间的详细关系可以看博客http://blog.csdn.net/cywosp/article/details/38965239

4、流和FILE对象

  文件IO主要是针对文件描述符的,而标准IO的操作主要是围绕流进行的,当用标准IO打开或创建一个文件时,就使得一个流与对应的文件相结合。标准IO函数fopen返回一个指向FILE对象的指针。当打开一个流时,标准IO函数fopen返回一个指向FILE对象的指针。该对象通常是一个结构,它包含了标准IO库为管理该流所需要的所有信息,包括:用于实际IO的文件描述符、指向用于该流缓冲区的指针、缓冲区的长度、当前在缓冲区中的字符数以及出错标志等等。
  对于进程,预定了三个流,并且这三个流可以自动的被进程使用,他们是标准输入、标准输出和标准出错。

时间: 2024-08-30 02:42:17

文件操作系统入门基本概念的相关文章

【转帖】H5 手机 App 开发入门:概念篇

H5 手机 App 开发入门:概念篇 http://www.ruanyifeng.com/blog/2019/12/hybrid-app-concepts.html 作者: 阮一峰 日期: 2019年12月10日 感谢 腾讯课堂NEXT学院 赞助本站,腾讯官方的前端课程 免费试学. 手机现在是互联网的最大入口.根据<中国互联网报告>,手机网民已经超过8亿,人均每天上网三个多小时. 毫不奇怪,手机应用软件(mobile application,简称 mobile App)的开发工程师供不应求,一

MongoDB入门必读(概念与实战并重)

MongoDB入门必读(概念与实战并重) 一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型.Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝

1、数据结构笔记之一入门基本概念

1.蛤蟆的数据结构笔记之一入门基本概念 最近一段时间一句名言一直徘徊在我的耳畔,并非警示名言,而是老子中的一句平常话,"合抱之木.生于毫末;九层之台.起于累土;千里之行.始于足下;千里之堤.毁于蚁穴".这句初中便能开口套用的熟语,这么多年后还是久久不能行于实践.怪世人太急于成功,还是怪自己过于浮夸? 不管是什么,让我们再一次的从脚下走起. 从哪里走起?汇编?C?操作系统?组成原理?离散数学?形式语言?数理逻辑?还是其他?对比分析良久,最后还是选定了数据结构.因为数据结构的内容不仅是一般

机器人操作系统入门(四)

参考资料: https://www.icourse163.org/course/ISCAS-1002580008?tid=1003713012 //中国大学MOOC https://www.bilibili.com/video/av23401751 //B站 <ROS操作系统入门讲义>PDF下载 链接:https://pan.baidu.com/s/1OCja2WLDRnjYXMrpnZ3-sQ 提取码:mziy 第四章 ROS通信架构(二) 一.Service 服务 //适用于临时的.非周期

机器人操作系统入门(七)rospy客户端库

参考资料: https://www.icourse163.org/course/ISCAS-1002580008?tid=1003713012 //中国大学MOOC https://www.bilibili.com/video/av23401751 //B站 <ROS操作系统入门讲义>PDF下载 链接:https://pan.baidu.com/s/1OCja2WLDRnjYXMrpnZ3-sQ 提取码:mziy 第七章 rospy 一.rospy VS roscpp 1.位于 /opt/ro

Docker入门一概念和安装

Docker入门一概念和安装 LinuxDocker Docker概念 Docker 是一个基于 LXC 技术构建的容器引擎,基于 GO 语言开发,遵循 Apache2.0 协议开源.Docker 的发展得益于为使用者提供了更好的容器操作接口.包括一系列的容器,镜像,网络等管理工具,可以让用户简单的创建和使用容器. 核心理念: Build once,Run anywhere. 核心关键词: namespace, cgroups, union fs Docker架构 Docker为C/S体系架构,

PHP文件操作系统----主要的文件操作函数

一.文件操作系统概述 1.概述: php中的文件操作系统主要是对文件和目录的操作.文件在windows系统下分为3种不同:文件.目录.未知,在linux/unix系统下分为7种不同:block.char.dir.fifo.file.link和unknown七种类型.目录在windows系统:D:/a/b/c.php 或 D:\a\b\c.php,在linux/unix系统: /a/b/c.php,为统一建议使用"/"作为目录之间的分割符. 2.目录或文件属性获取函数 *(1)取得文件类

003-Tuple、Array、Map与文件操作入门实战

003-Tuple.Array.Map与文件操作入门实战 Tuple 各个元素可以类型不同 注意索引的方式 下标从1开始 灵活 Array 注意for循环的until用法 数组的索引方式 上面的for是下标索引(繁琐用的不多) 下面的for是增强for循环的元素遍历索引(推荐) Map 注意左边是Key,右边是Value _(下划线也可以作为占位符,形成结构,但无名称不可以访问) 文件操作 进行了Source包的引入 .fromFile() getLines 使用了Iterator 欢迎广大爱好

深入解析Windows操作系统笔记——CH1概念和术语

1.概念和工具 本章主要介绍Windows操作系统的关键概念和术语 1.概念和工具... 1 1.1操作系统版本... 1 1.2基础概念和术语... 2 1.2.1Windows API2 1.2.2 服务.函数和例程... 3 1.2.3 进程.线程和作业... 4 1.2.3.1 进程... 4 1.2.3.2 线程... 4 1.2.3.3 虚拟地址描述符... 4 1.2.3.4 作业... 4 1.2.4 虚拟内存... 5 1.2.5 内核模式和用户模式... 5 1.2.6 终端