0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

操作系统不同的缓冲区概念

科技绿洲 来源:Linux开发架构之路 作者:Linux开发架构之路 2023-11-10 10:38 次阅读

常常听到有程序员会跟你讨论:“我们在读写文件的时候,系统是有缓存的”。但实际上有一部分人把用户进程缓存区和系统空间缓存区的概念混淆了,包括这两种缓冲区的用法和所要解决的问题,还有其它类似的概念。本文就来区分一下不同的缓冲区概念(主要针对类unix平台)。

用户进程和操作系统的关系,首先我用一张图来解释“用户进程和操作系统的关系:

图片

这是一个计算机系统运行时的简化模型,我们把所有运行在操作系统上的进程成为用户进程,它们都运行在用户空间(可以看到用户空间有很多进程)。把操作系统运行的空间成为系统空间。

为什么将进程分为用户进程和系统进程,首先你一定听说过内核态和用户态(kernel mode和user mode),在内核态可以访问系统资源,比如:

处理器cpu:cpu控制着一个程序的执行。输入输出IO:linux有句话叫“一切都是流”,也就是所有输入输出设备的数据,包括硬盘,内存,终端都可以像流一样操作。进程管理:类似对进程的创建,休眠,唤醒,释放之类的调度。比如linux下的fork和windows下的CreateProcess()函数。内存:包括内存的申请,释放等管理操作。设备:这个就是常常说的外设了,比如鼠标,键盘。计时器:计算机能计时是因为晶体振荡器产生的电磁脉冲。那么所有的定时任务都是以它为基础的。进程间通信IPC:进程之间是不能够互相访问内存的,所以进程与进程之间的交互需要通信,而通信也是一种资源。网络通信网络通信可以看做是进程见通信的特殊形式。

注释:fflush把进程缓冲区的数据刷新到内核缓冲区,fsync把内核缓冲区的数据刷新到物理媒介上。

而上面所说的这些系统资源,在用户进程中是无法被直接访问的,只能通过操作系统来访问,所以也把操作系统提供的这些功能成为:“系统调用”。

比如下图,展示一个用户通过shell控制计算机所经过的数据流向:文件读写和终端控制,都是通过内核进行的。

图片

提供这些限制的基础就是cpu提供的内核态和用户态。比如intel x86 CPU有四种不同的执行级别0-3,linux只使用了其中的0级和3级分别来表示内核态和用户态。

在用户态,不仅仅是系统资源了,就是别的进程的内存对于你来说,都是“透明的”(并不是没办法访问,否则游戏作弊器怎么实现?)

图片

用户进程缓存区

前面提到,用户进程通过系统调用访问系统资源的时候,需要切换到内核态,而这对应一些特殊的堆栈和内存环境,必须在系统调用前建立好。而在系统调用结束后,cpu会从核心模式切回到用户模式,而堆栈又必须恢复成用户进程的上下文。而这种切换就会有大量的耗时。

你看一些程序在读取文件时,会先申请一块内存数组,称为buffer,然后每次调用read,读取设定字节长度的数据,写入buffer。(用较小的次数填满buffer)。之后的程序都是从buffer中获取数据,当buffer使用完后,在进行下一次调用,填充buffer。所以说:用户缓冲区的目的是为了减少系统调用次数,从而降低操作系统在用户态与核心态切换所耗费的时间。除了在进程中设计缓冲区,内核也有自己的缓冲区。

内核缓存区

当一个用户进程要从磁盘读取数据时,内核一般不直接读磁盘,而是将内核缓冲区中的数据复制到进程缓冲区中。

但若是内核缓冲区中没有数据,内核会把对数据块的请求,加入到请求队列,然后把进程挂起,为其它进程提供服务。

等到数据已经读取到内核缓冲区时,把内核缓冲区中的数据读取到用户进程中,才会通知进程,当然不同的io模型,在调度和使用内核缓冲区的方式上有所不同,下一小结介绍。

你可以认为,read是把数据从内核缓冲区复制到进程缓冲区。write是把进程缓冲区复制到内核缓冲区。当然,write并不一定导致内核的写动作,比如os可能会把内核缓冲区的数据积累到一定量后,再一次写入。这也就是为什么断电有时会导致数据丢失。所以说内核缓冲区,是为了在OS级别,提高磁盘IO效率,优化磁盘写操作。

流程

在《Unix网络编程》中的五种io模型,也提到过进程缓冲区和内核缓冲区。因为这个并不是此篇文章的重点,所以这里只对比阻塞模型和非阻塞。

图片

图片

对比阻塞和非阻塞,在阻塞io中,直到数据从内核缓冲区拷贝到用户缓冲区才通知用户进程调用完成并唤醒,而非阻塞,在轮训得知数据准备好后,数据还是在内核缓冲区中,等你去读取,这也就是说数据准备好,并不代表已经读好可以使用。当然也不代表一定能读。

缓存区和缓存

还有一部分人把缓冲区和缓存混淆,后来我明白这也是因为翻译导致的把两种东西进行混淆。缓冲区的英文是buffer,而缓存的应为是cache。

图片

CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,因为cpu的计算速度要比内存的读写速度快很多,而把这些可能会被重复访问到的数据存储于cpu缓存中,就会提高读取速度。可以说缓存是cpu和内存之间的临时存储器。

也就是说,buffer是因为减少调用次数,集中调用,提高系统性能。而cache是将读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。而缓冲可以理解为内存和硬盘之间的临时存储器,重点是写的过程。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 振荡器
    +关注

    关注

    28

    文章

    3813

    浏览量

    138873
  • 缓冲
    +关注

    关注

    0

    文章

    51

    浏览量

    17810
  • 操作系统
    +关注

    关注

    37

    文章

    6738

    浏览量

    123190
  • 终端
    +关注

    关注

    1

    文章

    1115

    浏览量

    29831
收藏 人收藏

    评论

    相关推荐

    请问串口的DMA接收缓冲区是不是环形缓冲区

    系统在创建DMA缓冲区的时候,建立了put_index和get_index,会随着数据的写入和读取修改它们的值;3、以上两个相互配合,客观上将DMA的缓冲区维护成了一个环形缓冲区不知
    发表于 08-30 14:27

    基于状态图的缓冲区溢出攻击分析

    结合缓冲区溢出攻击产生的原理,分析缓冲区溢出攻击代码的结构,论述Snort规则对缓冲区溢出攻击的检测,在此基础上构建一个基于状态图的缓冲区溢出攻击的分析模型。该模型对
    发表于 04-10 08:46 32次下载

    环形缓冲区读写操作的分析与实现

    环形缓冲区是嵌入式系统中一种重要的常用数据结构。在多任务环境下实现时,如果有多个读写任务,一般需要用信号量来保护多个任务共享的环形缓冲区。但是如果只存在1 个读
    发表于 04-15 11:35 40次下载

    Windows缓冲区溢出攻击的实例研究

    本文首先详细分析了Windows 缓冲区溢出的基本原理和具体流程。在此基础上,通过对一个Windows 网络缓冲区溢出攻击实例的详细调试分析,研究了Windows 缓冲区溢出攻击的整个过程,
    发表于 08-28 09:44 17次下载

    清除键盘缓冲区原理

    清除键盘缓冲区原理 有时用户的按键响应可能导致数据丢失或破坏了数据而不能挽回。在这种情况下,消除缓
    发表于 06-12 23:07 2078次阅读

    环形缓冲区的实现原理

    在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。
    的头像 发表于 03-22 10:03 7495次阅读
    环形<b class='flag-5'>缓冲区</b>的实现原理

    缓冲区是啥意思 STM32串口数据接收之环形缓冲区

    缓冲区顾名思义是缓冲数据用的。实现缓冲区最简单的办法时,定义多个数组,接收一包数据到数组A,就把接收数据的地址换成数组B,每个数据有个标记字节用于表示这个数组是否收到数据,收到数据是否处理
    的头像 发表于 07-22 15:33 1.1w次阅读

    STM32串口数据接收 --环形缓冲区

    STM32串口数据接收 --环形缓冲区环形缓冲区简介  在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区方式接收数据可以更好的保证数据丢帧率第。  在通信
    发表于 12-28 19:24 30次下载
    STM32串口数据接收 --环形<b class='flag-5'>缓冲区</b>

    什么是缓冲区?有什么作用

    缓冲区其实就是一个存储区域,它是由专门的硬件寄存器所组成的。
    的头像 发表于 02-02 09:57 2.5w次阅读

    消除IoT上的缓冲区溢出漏洞

    黑客可以使用堆栈缓冲区溢出将可执行文件替换为恶意代码,从而允许他们利用堆内存或调用堆栈本身等系统资源。例如,控制流劫持利用堆栈缓冲区溢出将代码执行重定向到正常操作中使用的位置以外的位置
    的头像 发表于 10-12 15:25 889次阅读
    消除IoT上的<b class='flag-5'>缓冲区</b>溢出漏洞

    消除物联网上的缓冲区溢出漏洞

      黑客可以使用堆栈缓冲区溢出将可执行文件替换为恶意代码,从而使他们能够利用堆内存或调用堆栈本身等系统资源。例如,控制流劫持利用堆栈缓冲区溢出将代码执行重定向到正常操作中使用的位置以外
    的头像 发表于 12-02 11:57 990次阅读

    环形缓冲区的实现思路

    单片机程序开发一般都会用到UART串口通信,通过通信来实现上位机和单片机程序的数据交互。通信中为了实现正常的收发,一般都会有对应的发送和接收缓存来暂存通信数据。这里使用环形缓冲区的方式来设计数据收发的缓存,即缓冲区溢出后,从缓冲区
    的头像 发表于 01-17 15:07 1583次阅读

    C++环形缓冲区设计与实现

    一、环形缓冲区基础理论解析(Basic Theory of Circular Buffer) 1.1 环形缓冲区的定义与作用(Definition and Function of Circular
    的头像 发表于 11-09 11:21 1859次阅读
    C++环形<b class='flag-5'>缓冲区</b>设计与实现

    西门子博诊断缓冲区的使用方法

    可从在线和诊断视图中“诊断”文件夹的“诊断缓冲区”组中读出 CPU 的诊断缓冲区
    的头像 发表于 12-11 10:24 3964次阅读
    西门子博诊断<b class='flag-5'>缓冲区</b>的使用方法

    交换芯片缓冲区大小是什么

    交换芯片缓冲区大小并不一定是固定的。缓冲区的设计和实现会根据芯片的具体型号、规格以及应用场景的不同而有所差异。一些交换芯片可能具有固定大小的缓冲区,以满足特定的性能需求或成本限制。然而,随着技术
    的头像 发表于 03-18 14:42 537次阅读