首页 > 其他分享 >操作系统中的缓冲区

操作系统中的缓冲区

时间:2024-06-02 17:43:22浏览次数:13  
标签:操作系统 打印 写入 C语言 刷新 缓冲区 数据

  任何不同位置的数据IO传输,一定是有缓冲区的,然后缓冲区再通过他自身特定的刷新策略,将数据刷新到外设中,这样合理的安排相比不断的循环检测,有利于节省CPU的资源.一般发出数据就是将数据写入到特有的缓冲区中,例如对于同样大的100Mb数据,如果没有缓冲区策略,那么他这100M数据可能会被分好多次写入到外设中。要知道计算机访问外设需要很长时间的,所以如果将这100M数据存到缓冲区中访问,一次外设全部写入,那么将会大大提高计算机的IO效率,而刷新缓冲区则有多种策略,第一种策略便是立即刷新,就是一旦有写入便就刷新到外设中。第二种是行刷新:就是写入时检测,如果有换行符便开始刷新,第三种就是全缓冲刷新:也就是当缓冲区被写满以后再进行刷新,这三种刷新方式并没有优劣之分,需要具体考虑应用场景来选择合适的缓冲区刷新策略.

  对于一种场景,我们使用一个C语言程序,其中写入pintf打印一串字符串,然后再用write系统调用,同样打印一份不一样的字符串到屏幕上,在使用一次fork创建一次子进程,然后我们编译他使用命令行执行这个程序,我们可以看到显示器中有两行字符串数据,但是如果我们重定向输出数据到一个文件中,我们会发现使用C语言打印的数据在文件中打印两份,这就是因为缓冲区刷新策略的不同,以及缓冲区的位置不同的原因.

 

 如图可以看同一可执行程序在打印到文件中和显示器上的结果不同.

   其中的原理是因为C语言中的文件结构体中也有一个单独的缓冲区,而这个缓冲区是位于进程空地址空间中的,当使用wite时,因为它是系统调用的写入函数,因此不会写入C语言维护的缓冲区中,而printf将数据临时写入c语言的缓冲区中,当向显示器中打印时,采用行缓冲的策略,因为行缓冲的策略符合肉眼的观看习惯,而文件重定向则是使用全缓冲的缓冲区刷新策略。当我们调用fork函数以后,父子进程同时拷贝了一份进程地址空间,当子进程向文件中刷新缓冲区时,会发生写实拷贝父进程的缓冲区不会改变,因此会有printf的内容打印两遍.

  而像显示器中打印的时候,因为是行缓冲刷新的策略,当遇到换行符时,会直接将缓冲区中的内容打印到显示器上,因此进程地址空间不会有东西,所以就算调用了创建子进程也不会发生写时拷贝将内容写两遍.解决上述将可执行程序的输出重定向文件中打印多了的情况的方法是使用fflush强制刷新缓冲区使子进程的地址空间缓冲区中不要有数据.

 

   如上图当加入了fflush后不会出现重定向后多打印的问题.

  需要注意的是,就算调用了系统调用的write也不会立即将数据写入到文件中,因为操作系统中自身也有一个文件操作的缓冲区,这个缓冲区对C语言而来说是透明的,所以一个printf需要透过好几个缓冲区才能被正确打印到显示器上,系统调用也有一个叫sfync的接口,强制将操作系统的缓冲区数据打印出来.

标签:操作系统,打印,写入,C语言,刷新,缓冲区,数据
From: https://www.cnblogs.com/qjwxlj/p/18227396

相关文章

  • 【第7章 | 输入/输出系统】(操作系统 慕课版)
    目录一、I/O系统的功能、模型与接口1.1I/O系统的基本功能1.2I/O系统的层次结构与模型1.3I/O系统的接口二、I/O设备和设备控制器2.1I/O设备2.2设备控制器2.3内存映像I/O2.4I/O通道2.5I/O设备的控制方式知识回顾三、I/O软件3.1中断处理程序3.2设备驱动程序3.3与设......
  • kali Linux 操作系统更新命令脚本
    kaliLinux操作系统更新命令脚本执行方法sudoaptinstalldos2unixdos2unixupdate_script.shsudo./update_script.shkaliLinux操作系统更新命令脚本#!/bin/bashclearRED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[0;33m'BLUE="\033[0;3......
  • VMware 安装 deepin 操作系统详细教程
    一、环境准备1、安装VMwareWorkstationplayer,可以前往VMware官网VMware-DeliveringaDigitalFoundationForBusinesses进行下载安装,版本选择17或者更高版本的17Pro,如果需要使用虚拟网络管理等功能,请选择合适版本安装。2、准备好VMware环境后,提前下载deepin的 iso镜......
  • 操作系统之CPU调度算法——FCFS、SJF和SRTF
    目录前言 FCFS先来先服务调度算法定义与步骤 举例SJF短作业优先调度算法定义与步骤举例SRTF最短剩余时间优先调度算法定义与步骤举例结束语​​​​​​​前言 今天是坚持写博客的第12天,为不断坚持的自己和大家点赞。最近经历了一场时长半小时的答辩,还是需......
  • Linux操作系统简介
    Linux操作系统1.什么是LinuxLinux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工......
  • 01Linux以及操作系统概述
    课程目标1.了解现代操作系统的整体构成及发展历史2.了解Linux操作系统及其分支版本3.直观上理解服务器端与桌面端版本的区别课程实验1.通过对CentOS和Ubuntu的演示,直观理解Linux与Windows的异同课堂引入本章内容主要为大家详细讲解Linux操作系统(以下简称Linux)的基本情......
  • 需要检查 EDA 工具在自身和操作系统(Linux)中的依赖性的最佳做法
    将EDA工具套件发布到生产计算环境(RHEL)中可能会出现问题,尤其是在其发布或操作系统级别中缺少某些共享对象的情况下。迁移操作系统也会带来同样的问题,因为glibc版本可能会更改,其他系统级别的.so文件也可能会丢失。EDA工具套件(例如SynopsysVCS)可能会有数十个甚至数百个用......
  • 认识Windows操作系统
    开机启动项在Windows系统中,开机启动项通常通过如下配置:注册表启动目录注册表按住WIN+R打开运行,输入regedit打开注册表编辑器用户启动项:\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run系统启动项:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Cu......
  • 操作系统复习:进程和线程的理解串记
    进程和线程        我是一个ikun,我坐着不动(静态)就是ikun程序,我开始执行任务唱、跳、rap和打篮球(动态)就是ikun进程。在ikun进程中,我们的孩子就是线程。        为了ikun进程们能公平地抢坤坤哥哥下的蛋(临界资源),坤坤哥哥(CPU)会安排(进程调度)时间片给每个ikun进程......
  • 如何配置机器人ROS操作系统之间的有线和无线的局域网通信(基于ROS的主从通讯)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言1.主从配置前的准备工作(1)查看主从机的hostname(2)查看各自主机和从机的IP(3)本教程的hostname和ip如下2.在主机中的修改(1)修改主机的/.bashr文件(2)修改主机的hosts文件3.在从机......