系统IO和标准IO

news2024/12/26 11:17:41

在这里插入图片描述
一.系统IO

系统 I/O(Input/Output)是计算机操作系统提供给应用程序的一种输入和输出方式。它通过系统调用(系统内核提供的函数)来实现数据的读取和写入。系统 I/O 可以用于与文件、设备(例如磁盘驱动器、网络接口、串口等)以及其他进程之间进行数据交换。

在系统 I/O 中,输入和输出操作是通过系统调用来完成的。系统调用是一种特殊的函数调用,用于向操作系统请求特定的操作。对于输入操作,应用程序发起一个系统调用来从文件或设备中读取数据;而对于输出操作,应用程序发起一个系统调用来将数据写入文件或设备。

系统 I/O 的一般工作流程如下:

  1. 打开文件或设备:应用程序首先使用系统调用打开需要读取或写入的文件或设备,并获取一个文件描述符,该描述符用于后续的读写操作。
  2. 读取数据:应用程序使用系统调用读取文件或设备中的数据,并将数据读取到应用程序的内存空间中。
  3. 写入数据:应用程序使用系统调用将数据写入文件或设备中,数据可以来自应用程序的内存空间。
  4. 关闭文件或设备:应用程序在完成读写操作后,使用系统调用关闭文件或设备。

系统 I/O 相对于其他的 I/O 方式(如标准 I/O、网络 I/O)来说,是较为底层的接口,通常用于需要直接与设备进行交互的场景,如驱动程序开发、底层网络编程等。它提供了对文件和设备的低级别访问,能够直接控制数据的读取和写入,但使用起来相对较复杂。

需要注意的是,系统 I/O 的使用需要谨慎,特别是在多线程或多进程环境下,需要正确处理并发访问和数据一致性的问题,以避免出现竞态条件和数据损坏等情况。因此,在开发应用程序时,可以借助更高级别的 I/O 接口(如标准 I/O、网络库)来简化和提高效率。

系统IO的分页缓存区

在这里插入图片描述

系统 I/O 中的分页缓冲区是一种用于管理磁盘存储的缓冲区。它是操作系统中的一部分,用于在内存和磁盘之间进行数据传输。

在操作系统中,有一个专门的内存区域被称为分页缓冲区(Page Buffer Cache),也有时被称为磁盘缓存(Disk Cache)或页缓存(Page Cache)。它用于存放最近被读取或写入的文件的数据页。分页缓冲区的目的是提高文件访问的性能,减少磁盘 I/O 操作的频率。

当应用程序读取文件时,操作系统将读取的数据页存储在分页缓冲区中。如果后续的读取请求需要相同的数据页,操作系统可以直接从缓冲区中读取,而不需要再次访问磁盘。同样地,当应用程序写入文件时,数据可以先写入分页缓冲区,然后由操作系统决定在合适的时机将数据页写回磁盘。这种延迟写入的机制可以提高写入的效率。

分页缓冲区通常由操作系统内核管理,使用一种类似于虚拟内存管理的机制。它维护了一个缓冲区池,用于存放数据页。缓冲区使用一种替换算法(如LRU,最近最少使用)来决定哪些数据页需要被写回磁盘,以及哪些数据页可以被替换出缓冲区。

需要注意的是,分页缓冲区是操作系统的一部分,与应用程序的系统 I/O 直接交互。应用程序无需直接操作或控制分页缓冲区。它主要是为了提供更高效的磁盘 I/O 操作,并在后台自动管理缓冲区的使用。

二.标准IO

标准 I/O(Standard Input/Output)是一种在 C/C++ 程序中用于进行输入和输出操作的接口,它是通过 C 标准库提供的一组函数来实现的。标准 I/O 提供了一种高层次的抽象,使得程序员可以方便地进行文件、终端、管道等的输入输出操作,同时具有缓冲、格式化等功能。

标准 I/O 提供了以下几个重要的概念和函数:

  1. 标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr):这是三个与程序相关联的特殊文件流。标准输入通常关联于键盘输入,标准输出关联于屏幕输出,标准错误输出用于打印错误信息。它们都是文件流的一种,可以使用标准 I/O 函数进行读写操作。

  2. 文件流:文件流是标准 I/O 的一个重要概念,它代表文件或设备的输入输出流。文件流可以通过FILE类型的指针来表示,由标准 I/O 函数打开或创建,并通过文件描述符与实际文件或设备进行关联。

  3. 标准 I/O 函数族:标准 I/O 提供了一组函数用于进行输入和输出操作,常用的函数有:

    • fopen:用于打开文件,并返回一个 FILE 指针。
    • fclose:用于关闭文件。
    • fgetcfgets:用于从文件中读取一个字符或一行文本。
    • fputcfputs:用于向文件中写入一个字符或一行文本。
    • fprintffscanf:用于格式化输入输出,类似于 printfscanf
    • freadfwrite:用于二进制数据的读写操作。
    • feofferror:用于判断文件流的结束和错误状态。
  4. 标准 I/O 的缓冲机制:标准 I/O 使用内存缓冲区来提高文件读写效率。它将数据先写入缓冲区,然后才将缓冲区的数据写入文件;或者从缓冲区读取数据,而不是直接从文件读取。缓冲区可以是全缓冲(默认),这意味着当缓冲区满时才进行写入或读取;也可以是行缓冲,这意味着在读取或写入换行符或缓冲区满时才进行操作;或者是无缓冲,即立即读写数据。

标准 I/O 在 C/C++ 程序中广泛应用,它提供了一种交互方式,使得程序可以方便地处理输入和输出。同时,标准 I/O 可以通过重定向、管道等技术与其他程序进行数据交换,提供了更多实用的功能。然而,需要注意的是,在多线程环境下,标准 I/O 可能存在线程安全性问题,需要额外的同步机制来保护共享的文件流。

标准IO缓冲区

在这里插入图片描述

标准 I/O 缓冲区是标准 I/O 抽象层中用于提高输入输出性能的一种机制。它是由 C 标准库提供的,可以应用于文件、终端和其他设备的输入输出。
标准 I/O 提供了三种类型的缓冲区,它们分别是全缓冲、行缓冲和无缓冲。

  1. 全缓冲(Fully Buffered):在全缓冲模式下,数据会存储在内存缓冲区中,直到缓冲区填满后才进行实际的 I/O 操作。或者,当使用fflush函数时,也会强制将缓冲区中的数据写入实际的文件或设备。全缓冲模式常用于文件的读写操作,适用于较大量的数据传输,可以减少实际的 I/O 操作次数,提高性能。

  2. 行缓冲(Line Buffered):在行缓冲模式下,数据会存储在内存缓冲区中,直到遇到换行符 \n 或者缓冲区满时才进行实际的 I/O 操作。行缓冲模式常用于终端设备的输入和输出,默认情况下,当输出到终端时采用行缓冲模式。

  3. 无缓冲(Unbuffered):在无缓冲模式下,数据会直接进行实时的 I/O 操作,不会进行任何缓冲。无缓冲模式适用于某些要求实时性的场景,比如输入密码等敏感信息。

缓冲区的模式可以通过setvbuf函数来设置,该函数可以将一个已经打开的文件与指定的缓冲区类型关联起来。

标准 I/O 缓冲区的目的是提高输入输出的性能,减少频繁的调用低层的系统 I/O 接口带来的开销。缓冲区的大小可以通过调用setvbuf函数在打开文件之后进行设置。另外,可以使用fflush函数来强制将输出缓冲区中的数据写入输出设备,或者清空输入缓冲区。

需要注意的是,在标准 I/O 中对文件的读写操作并不保证是实时的,也就是说数据可能会先存储在缓冲区中,而不是直接读取或写入实际的文件。如果需要实现实时的读写,可以使用类似fseekfreadfwrite等函数来直接操作文件的内容,而不使用标准 I/O 缓冲区的功能。

三.IO模式

非常抱歉,我之前的回答已经包含了错误信息。下面是文件 I/O 中常见的五种模式,包括阻塞 I/O、非阻塞 I/O、I/O 复用、信号驱动 I/O和异步 I/O:

  1. 阻塞 I/O: 同步 I/O 是一种阻塞模式的 I/O,程序会被阻塞直到 I/O 操作完成。在进行同步 I/O 操作时,程序会等待文件系统或设备准备好并返回所需数据后继续执行。

  2. 非阻塞 I/O:非阻塞 I/O 是一种非阻塞模式的 I/O,它允许程序发起 I/O 操作后立即返回,而不会等待操作的完成。如果数据不可用或 I/O 操作没有立即完成,非阻塞 I/O 将返回一个错误码或特定的状态,程序可以继续执行其他任务。

  3. I/O 复用:I/O 复用是一种同时监听多个文件描述符的机制,使得程序可以同时等待多个文件描述符上的 I/O 操作。常见的 I/O 复用模型有 selectpollepoll。通过 I/O 复用模型,程序可以同时处理多个连接或 I/O 操作,而不需要为每个连接或 I/O 操作创建一个独立的线程或进程。

  4. 信号驱动 I/O:信号驱动 I/O 是一种异步模式的 I/O,它使用信号来通知程序 I/O 操作已经就绪。程序在发起 I/O 操作后可以继续执行其他任务,当 I/O 操作就绪时,操作系统会发送一个信号给程序,程序可以捕获该信号并处理相应的 I/O 操作。

  5. 异步 I/O:异步 I/O 是一种完全异步的 I/O 模式,它允许程序发起 I/O 操作后继续执行其他任务,同时在后台完全异步地等待 I/O 操作的完成。当 I/O 操作完成后,程序会得到通知,并可以处理完成的数据。

信号驱动 I/O 和异步 I/O 是两种不同的异步模式,它们在处理 I/O 操作的方式和机制上有所不同。它们的选择通常基于应用程序的需求和底层操作系统的支持。对于信号驱动 I/O,操作系统会发送信号来通知 I/O 就绪,而异步 I/O 则使用回调函数或轮询等方式来处理完成的 I/O 操作。

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

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

相关文章

哪些情况可以使用自动化测试?

通常,软件测试的测试方式分为人工测试和自动化测试,人工测试是由测试人员编写并执行测试用例,然后观察测试结果与预期结果是否一致的过程;自动化测试是通过测试工具来代替或辅助人工去验证系统功能是否有问题的过程。 采用自动化测试需要满足…

blender怎么设置中文界面

你们知道Blender软件是什么吗?你知道blender怎么设置中文界面吗?Blender是个GNU的3D绘图软件,建模、算图、动画等功能都相当的完整,可以说已经具有了一般商业软件的规模。Blender大部分的功能都有热键,操作起来相当地轻…

Nano 编辑器中,怎样保存和退出

使用git 修改提交记录时,使用命令: git commit --amend 弹出了nano编辑器,第一次使用的时候不知道怎么保存退出,现在记录下: 1.修改完毕后使用Ctrl x,然后会弹出 点击Y后,界面会退回到如下 这时候点击E…

springboot和vue:四、web入门(静态资源访问+文件上传+拦截器)

静态资源访问 使用IDEA创建Spring Boot项目,会默认创建出classpath:/static/目录,静态资源一般放在这个目录下即可。如果默认的静态资源过滤策略不能满足开发需求,也可以自定义静态资源过滤策略。 在application.properties中定义过滤规则和…

数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索

UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程。以下是我之前写的一个自动化测试的小Demo。这个Demo基于Selenium与Java。由于现在Selenium在自动化测试的统治地位,并且随着Selenium 4的即将发布,在未来很长的一段时间里…

【C#】XML的基础知识以及读取XML文件

最近在学读取文件 目录 介绍特点结构XML的语法规则XML 命名规则 C#操作XML新建读取第一种第二种第三种 读取属性 介绍 XML (可扩展标记语言,eXtensible Markup Language) 是一种标记语言,它被设计用来传输和存储数据。 特点 可扩展性:由于…

C++---异常处理

异常处理 异常处理try语句块和throw表达式异常的抛出和捕获异常的抛出和匹配原则 异常安全异常规范标准异常 异常处理 异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。当程序的某部分检测到一个他无法处理的问题时,需要用到异常处理…

港联证券:停牌后复牌股价怎么算?

股票停牌是指买卖所或证券公司暂停一只股票的买卖,并不再出现在股票商场上。停牌的原因或许是公司内部事务调整、财政审计、重大事件或公司被收购等。当一家公司的股票停牌时,这对持有该公司股票的投资者或许会带来一些影响。因而,了解停牌后…

最新医疗界AI资讯,远程评估帕金森病症状的AI工具问世

原创 | 文 BFT机器人 1、AI模型快速评估,自动生成评估报告 罗切斯特大学研究人员开发的一种人工智能工具可以帮助帕金森病患者在几分钟内远程评估其症状的严重程度。《npj数字医学》杂志上的一项研究介绍了这种新工具,它能让用户在网络摄像头前通过敲击…

如何验证高压放大器的性能好坏呢

验证高压放大器的性能好坏,就需要考虑一系列关键指标和测试方法。这些指标包括频率响应、增益、失真、输出功率、噪声以及稳定性等,使我们能够全面评估放大器的性能和质量。下面西安安泰电子将介绍如何验证高压放大器的性能,并针对不同指标提…

眼镜镜片 光致变色镜片

声明 本文是学习GB-T 9105-2023 眼镜镜片 光致变色镜片. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 6 标志 6.1 通用要求 镜片的表面、包装或附带文件中,应标明下列参数: a) 产品名称、商标; b) 制造商或供…

Python面向对象编程:深入理解类、对象、继承和多态

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 面向对象编程&#xff0…

数据结构-----队列

目录 前言 队列 定义 队列的定义和操作方法 队列节点的定义 操作方式 顺序表实现队列(C/C代码) 链表实现队列(C/C代码) Python语言实现队列 前言 排队是我们日常生活中必不可少的一件事,去饭堂打饭的时候排队&a…

laravel框架 - 事件与监听器

一,绑定事件与监听器 在app\Providers下的EventServiceProvider.php中添加我们定义的事件与监听器 protected $listen [Registered::class > [SendEmailVerificationNotification::class,],App\ebvent\RegisterMessage>[//事件App\listeners\SendMessage//监…

【笔试强训选择题】Day43.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&#xff…

为什么qt设置了utf-8 bom 格式后还是有乱码

有乱码 void SingleApplication::_showInstanceRunningDialog() {// 创建一个提示窗口QMessageBox msgBox;msgBox.setIcon(QMessageBox::Information);msgBox.setWindowTitle("应用已运行");msgBox.setText("应用程序已经在运行中。");msgBox.setStandardB…

计算机毕业设计 基于SSM+Vue的医院门诊互联电子病历管理信息系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

GE PRG-MODEM 调节器模块

GE PRG-MODEM 调节器模块通常是工业自动化和控制系统中的一种通信设备,用于远程监测、控制和数据传输。以下是可能包括在该模块中的一些产品特点: 通信接口:PRG-MODEM 模块通常配备各种通信接口,例如串行接口(RS-232、…

docker报错Error response from daemon: Container xxx is not running

1. 问题 在移植了docker后,执行了sudo docker run --name myrosort -p 80:80 -d rosort 指令运行名为myrosort的容器,通过sudo docker ps -a也可以看到确实运行了 (base) neousysneousys-Nuvo-5000:~/wqw/docker/20230915$ sudo docker run --name myr…

springboot基础--实现默认登录页面

1、搭建项目 依赖中 多加入thymeleaf依赖 <dependencies><!--thymeleaf的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--we…