RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

操作系統(tǒng)不同的緩沖區(qū)概念

科技綠洲 ? 來(lái)源:Linux開(kāi)發(fā)架構(gòu)之路 ? 作者:Linux開(kāi)發(fā)架構(gòu)之路 ? 2023-11-10 10:38 ? 次閱讀

常常聽(tīng)到有程序員會(huì)跟你討論:“我們?cè)谧x寫(xiě)文件的時(shí)候,系統(tǒng)是有緩存的”。但實(shí)際上有一部分人把用戶進(jìn)程緩存區(qū)和系統(tǒng)空間緩存區(qū)的概念混淆了,包括這兩種緩沖區(qū)的用法和所要解決的問(wèn)題,還有其它類(lèi)似的概念。本文就來(lái)區(qū)分一下不同的緩沖區(qū)概念(主要針對(duì)類(lèi)unix平臺(tái))。

用戶進(jìn)程和操作系統(tǒng)的關(guān)系,首先我用一張圖來(lái)解釋“用戶進(jìn)程和操作系統(tǒng)的關(guān)系:

圖片

這是一個(gè)計(jì)算機(jī)系統(tǒng)運(yùn)行時(shí)的簡(jiǎn)化模型,我們把所有運(yùn)行在操作系統(tǒng)上的進(jìn)程成為用戶進(jìn)程,它們都運(yùn)行在用戶空間(可以看到用戶空間有很多進(jìn)程)。把操作系統(tǒng)運(yùn)行的空間成為系統(tǒng)空間。

為什么將進(jìn)程分為用戶進(jìn)程和系統(tǒng)進(jìn)程,首先你一定聽(tīng)說(shuō)過(guò)內(nèi)核態(tài)和用戶態(tài)(kernel mode和user mode),在內(nèi)核態(tài)可以訪問(wèn)系統(tǒng)資源,比如:

處理器cpu:cpu控制著一個(gè)程序的執(zhí)行。輸入輸出IO:linux有句話叫“一切都是流”,也就是所有輸入輸出設(shè)備的數(shù)據(jù),包括硬盤(pán),內(nèi)存,終端都可以像流一樣操作。進(jìn)程管理:類(lèi)似對(duì)進(jìn)程的創(chuàng)建,休眠,喚醒,釋放之類(lèi)的調(diào)度。比如linux下的fork和windows下的CreateProcess()函數(shù)。內(nèi)存:包括內(nèi)存的申請(qǐng),釋放等管理操作。設(shè)備:這個(gè)就是常常說(shuō)的外設(shè)了,比如鼠標(biāo),鍵盤(pán)。計(jì)時(shí)器:計(jì)算機(jī)能計(jì)時(shí)是因?yàn)榫w振蕩器產(chǎn)生的電磁脈沖。那么所有的定時(shí)任務(wù)都是以它為基礎(chǔ)的。進(jìn)程間通信IPC:進(jìn)程之間是不能夠互相訪問(wèn)內(nèi)存的,所以進(jìn)程與進(jìn)程之間的交互需要通信,而通信也是一種資源。網(wǎng)絡(luò)通信網(wǎng)絡(luò)通信可以看做是進(jìn)程見(jiàn)通信的特殊形式。

注釋?zhuān)篺flush把進(jìn)程緩沖區(qū)的數(shù)據(jù)刷新到內(nèi)核緩沖區(qū),fsync把內(nèi)核緩沖區(qū)的數(shù)據(jù)刷新到物理媒介上。

而上面所說(shuō)的這些系統(tǒng)資源,在用戶進(jìn)程中是無(wú)法被直接訪問(wèn)的,只能通過(guò)操作系統(tǒng)來(lái)訪問(wèn),所以也把操作系統(tǒng)提供的這些功能成為:“系統(tǒng)調(diào)用”。

比如下圖,展示一個(gè)用戶通過(guò)shell控制計(jì)算機(jī)所經(jīng)過(guò)的數(shù)據(jù)流向:文件讀寫(xiě)和終端控制,都是通過(guò)內(nèi)核進(jìn)行的。

圖片

提供這些限制的基礎(chǔ)就是cpu提供的內(nèi)核態(tài)和用戶態(tài)。比如intel x86 CPU有四種不同的執(zhí)行級(jí)別0-3,linux只使用了其中的0級(jí)和3級(jí)分別來(lái)表示內(nèi)核態(tài)和用戶態(tài)。

在用戶態(tài),不僅僅是系統(tǒng)資源了,就是別的進(jìn)程的內(nèi)存對(duì)于你來(lái)說(shuō),都是“透明的”(并不是沒(méi)辦法訪問(wèn),否則游戲作弊器怎么實(shí)現(xiàn)?)

圖片

用戶進(jìn)程緩存區(qū)

前面提到,用戶進(jìn)程通過(guò)系統(tǒng)調(diào)用訪問(wèn)系統(tǒng)資源的時(shí)候,需要切換到內(nèi)核態(tài),而這對(duì)應(yīng)一些特殊的堆棧和內(nèi)存環(huán)境,必須在系統(tǒng)調(diào)用前建立好。而在系統(tǒng)調(diào)用結(jié)束后,cpu會(huì)從核心模式切回到用戶模式,而堆棧又必須恢復(fù)成用戶進(jìn)程的上下文。而這種切換就會(huì)有大量的耗時(shí)。

你看一些程序在讀取文件時(shí),會(huì)先申請(qǐng)一塊內(nèi)存數(shù)組,稱為buffer,然后每次調(diào)用read,讀取設(shè)定字節(jié)長(zhǎng)度的數(shù)據(jù),寫(xiě)入buffer。(用較小的次數(shù)填滿buffer)。之后的程序都是從buffer中獲取數(shù)據(jù),當(dāng)buffer使用完后,在進(jìn)行下一次調(diào)用,填充buffer。所以說(shuō):用戶緩沖區(qū)的目的是為了減少系統(tǒng)調(diào)用次數(shù),從而降低操作系統(tǒng)在用戶態(tài)與核心態(tài)切換所耗費(fèi)的時(shí)間。除了在進(jìn)程中設(shè)計(jì)緩沖區(qū),內(nèi)核也有自己的緩沖區(qū)。

內(nèi)核緩存區(qū)

當(dāng)一個(gè)用戶進(jìn)程要從磁盤(pán)讀取數(shù)據(jù)時(shí),內(nèi)核一般不直接讀磁盤(pán),而是將內(nèi)核緩沖區(qū)中的數(shù)據(jù)復(fù)制到進(jìn)程緩沖區(qū)中。

但若是內(nèi)核緩沖區(qū)中沒(méi)有數(shù)據(jù),內(nèi)核會(huì)把對(duì)數(shù)據(jù)塊的請(qǐng)求,加入到請(qǐng)求隊(duì)列,然后把進(jìn)程掛起,為其它進(jìn)程提供服務(wù)。

等到數(shù)據(jù)已經(jīng)讀取到內(nèi)核緩沖區(qū)時(shí),把內(nèi)核緩沖區(qū)中的數(shù)據(jù)讀取到用戶進(jìn)程中,才會(huì)通知進(jìn)程,當(dāng)然不同的io模型,在調(diào)度和使用內(nèi)核緩沖區(qū)的方式上有所不同,下一小結(jié)介紹。

你可以認(rèn)為,read是把數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到進(jìn)程緩沖區(qū)。write是把進(jìn)程緩沖區(qū)復(fù)制到內(nèi)核緩沖區(qū)。當(dāng)然,write并不一定導(dǎo)致內(nèi)核的寫(xiě)動(dòng)作,比如os可能會(huì)把內(nèi)核緩沖區(qū)的數(shù)據(jù)積累到一定量后,再一次寫(xiě)入。這也就是為什么斷電有時(shí)會(huì)導(dǎo)致數(shù)據(jù)丟失。所以說(shuō)內(nèi)核緩沖區(qū),是為了在OS級(jí)別,提高磁盤(pán)IO效率,優(yōu)化磁盤(pán)寫(xiě)操作。

流程

在《Unix網(wǎng)絡(luò)編程》中的五種io模型,也提到過(guò)進(jìn)程緩沖區(qū)和內(nèi)核緩沖區(qū)。因?yàn)檫@個(gè)并不是此篇文章的重點(diǎn),所以這里只對(duì)比阻塞模型和非阻塞。

圖片

圖片

對(duì)比阻塞和非阻塞,在阻塞io中,直到數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶緩沖區(qū)才通知用戶進(jìn)程調(diào)用完成并喚醒,而非阻塞,在輪訓(xùn)得知數(shù)據(jù)準(zhǔn)備好后,數(shù)據(jù)還是在內(nèi)核緩沖區(qū)中,等你去讀取,這也就是說(shuō)數(shù)據(jù)準(zhǔn)備好,并不代表已經(jīng)讀好可以使用。當(dāng)然也不代表一定能讀。

緩存區(qū)和緩存

還有一部分人把緩沖區(qū)和緩存混淆,后來(lái)我明白這也是因?yàn)榉g導(dǎo)致的把兩種東西進(jìn)行混淆。緩沖區(qū)的英文是buffer,而緩存的應(yīng)為是cache。

圖片

CPU緩存(Cache Memory)是位于CPU與內(nèi)存之間的臨時(shí)存儲(chǔ)器,因?yàn)閏pu的計(jì)算速度要比內(nèi)存的讀寫(xiě)速度快很多,而把這些可能會(huì)被重復(fù)訪問(wèn)到的數(shù)據(jù)存儲(chǔ)于cpu緩存中,就會(huì)提高讀取速度??梢哉f(shuō)緩存是cpu和內(nèi)存之間的臨時(shí)存儲(chǔ)器。

也就是說(shuō),buffer是因?yàn)闇p少調(diào)用次數(shù),集中調(diào)用,提高系統(tǒng)性能。而cache是將讀取過(guò)的數(shù)據(jù)保存起來(lái),重新讀取時(shí)若命中(找到需要的數(shù)據(jù))就不要去讀硬盤(pán)了,若沒(méi)有命中就讀硬盤(pán)。而緩沖可以理解為內(nèi)存和硬盤(pán)之間的臨時(shí)存儲(chǔ)器,重點(diǎn)是寫(xiě)的過(guò)程。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 振蕩器
    +關(guān)注

    關(guān)注

    28

    文章

    3832

    瀏覽量

    139032
  • 緩沖
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    17819
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6801

    瀏覽量

    123283
  • 終端
    +關(guān)注

    關(guān)注

    1

    文章

    1128

    瀏覽量

    29862
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)串口的DMA接收緩沖區(qū)是不是環(huán)形緩沖區(qū)

    、系統(tǒng)在創(chuàng)建DMA緩沖區(qū)的時(shí)候,建立了put_index和get_index,會(huì)隨著數(shù)據(jù)的寫(xiě)入和讀取修改它們的值;3、以上兩個(gè)相互配合,客觀上將DMA的緩沖區(qū)維護(hù)成了一個(gè)環(huán)形緩沖區(qū)不知
    發(fā)表于 08-30 14:27

    基于狀態(tài)圖的緩沖區(qū)溢出攻擊分析

    結(jié)合緩沖區(qū)溢出攻擊產(chǎn)生的原理,分析緩沖區(qū)溢出攻擊代碼的結(jié)構(gòu),論述Snort規(guī)則對(duì)緩沖區(qū)溢出攻擊的檢測(cè),在此基礎(chǔ)上構(gòu)建一個(gè)基于狀態(tài)圖的緩沖區(qū)溢出攻擊的分析模型。該模型對(duì)
    發(fā)表于 04-10 08:46 ?32次下載

    環(huán)形緩沖區(qū)讀寫(xiě)操作的分析與實(shí)現(xiàn)

    環(huán)形緩沖區(qū)是嵌入式系統(tǒng)中一種重要的常用數(shù)據(jù)結(jié)構(gòu)。在多任務(wù)環(huán)境下實(shí)現(xiàn)時(shí),如果有多個(gè)讀寫(xiě)任務(wù),一般需要用信號(hào)量來(lái)保護(hù)多個(gè)任務(wù)共享的環(huán)形緩沖區(qū)。但是如果只存在1 個(gè)讀
    發(fā)表于 04-15 11:35 ?40次下載

    Windows緩沖區(qū)溢出攻擊的實(shí)例研究

    本文首先詳細(xì)分析了Windows 緩沖區(qū)溢出的基本原理和具體流程。在此基礎(chǔ)上,通過(guò)對(duì)一個(gè)Windows 網(wǎng)絡(luò)緩沖區(qū)溢出攻擊實(shí)例的詳細(xì)調(diào)試分析,研究了Windows 緩沖區(qū)溢出攻擊的整個(gè)過(guò)程,
    發(fā)表于 08-28 09:44 ?17次下載

    清除鍵盤(pán)緩沖區(qū)原理

    清除鍵盤(pán)緩沖區(qū)原理 有時(shí)用戶的按鍵響應(yīng)可能導(dǎo)致數(shù)據(jù)丟失或破壞了數(shù)據(jù)而不能挽回。在這種情況下,消除緩
    發(fā)表于 06-12 23:07 ?2088次閱讀

    環(huán)形緩沖區(qū)的實(shí)現(xiàn)原理

    在通信程序中,經(jīng)常使用環(huán)形緩沖區(qū)作為數(shù)據(jù)結(jié)構(gòu)來(lái)存放通信中發(fā)送和接收的數(shù)據(jù)。環(huán)形緩沖區(qū)是一個(gè)先進(jìn)先出的循環(huán)緩沖區(qū),可以向通信程序提供對(duì)緩沖區(qū)的互斥訪問(wèn)。
    的頭像 發(fā)表于 03-22 10:03 ?7529次閱讀
    環(huán)形<b class='flag-5'>緩沖區(qū)</b>的實(shí)現(xiàn)原理

    緩沖區(qū)是啥意思 STM32串口數(shù)據(jù)接收之環(huán)形緩沖區(qū)

    緩沖區(qū)顧名思義是緩沖數(shù)據(jù)用的。實(shí)現(xiàn)緩沖區(qū)最簡(jiǎn)單的辦法時(shí),定義多個(gè)數(shù)組,接收一包數(shù)據(jù)到數(shù)組A,就把接收數(shù)據(jù)的地址換成數(shù)組B,每個(gè)數(shù)據(jù)有個(gè)標(biāo)記字節(jié)用于表示這個(gè)數(shù)組是否收到數(shù)據(jù),收到數(shù)據(jù)是否處理
    的頭像 發(fā)表于 07-22 15:33 ?1.1w次閱讀

    STM32串口數(shù)據(jù)接收 --環(huán)形緩沖區(qū)

    STM32串口數(shù)據(jù)接收 --環(huán)形緩沖區(qū)環(huán)形緩沖區(qū)簡(jiǎn)介??在單片機(jī)中串口通信是我們使用最頻繁的,使用串口通信就會(huì)用到串口的數(shù)據(jù)接收與發(fā)送,環(huán)形緩沖區(qū)方式接收數(shù)據(jù)可以更好的保證數(shù)據(jù)丟幀率第。??在通信
    發(fā)表于 12-28 19:24 ?31次下載
    STM32串口數(shù)據(jù)接收 --環(huán)形<b class='flag-5'>緩沖區(qū)</b>

    什么是緩沖區(qū)?有什么作用

    緩沖區(qū)其實(shí)就是一個(gè)存儲(chǔ)區(qū)域,它是由專(zhuān)門(mén)的硬件寄存器所組成的。
    的頭像 發(fā)表于 02-02 09:57 ?2.6w次閱讀

    消除IoT上的緩沖區(qū)溢出漏洞

    黑客可以使用堆棧緩沖區(qū)溢出將可執(zhí)行文件替換為惡意代碼,從而允許他們利用堆內(nèi)存或調(diào)用堆棧本身等系統(tǒng)資源。例如,控制流劫持利用堆棧緩沖區(qū)溢出將代碼執(zhí)行重定向到正常操作中使用的位置以外的位置
    的頭像 發(fā)表于 10-12 15:25 ?919次閱讀
    消除IoT上的<b class='flag-5'>緩沖區(qū)</b>溢出漏洞

    消除物聯(lián)網(wǎng)上的緩沖區(qū)溢出漏洞

      黑客可以使用堆棧緩沖區(qū)溢出將可執(zhí)行文件替換為惡意代碼,從而使他們能夠利用堆內(nèi)存或調(diào)用堆棧本身等系統(tǒng)資源。例如,控制流劫持利用堆棧緩沖區(qū)溢出將代碼執(zhí)行重定向到正常操作中使用的位置以外
    的頭像 發(fā)表于 12-02 11:57 ?1013次閱讀

    環(huán)形緩沖區(qū)的實(shí)現(xiàn)思路

    單片機(jī)程序開(kāi)發(fā)一般都會(huì)用到UART串口通信,通過(guò)通信來(lái)實(shí)現(xiàn)上位機(jī)和單片機(jī)程序的數(shù)據(jù)交互。通信中為了實(shí)現(xiàn)正常的收發(fā),一般都會(huì)有對(duì)應(yīng)的發(fā)送和接收緩存來(lái)暫存通信數(shù)據(jù)。這里使用環(huán)形緩沖區(qū)的方式來(lái)設(shè)計(jì)數(shù)據(jù)收發(fā)的緩存,即緩沖區(qū)溢出后,從緩沖區(qū)
    的頭像 發(fā)表于 01-17 15:07 ?1632次閱讀

    C++環(huán)形緩沖區(qū)設(shè)計(jì)與實(shí)現(xiàn)

    一、環(huán)形緩沖區(qū)基礎(chǔ)理論解析(Basic Theory of Circular Buffer) 1.1 環(huán)形緩沖區(qū)的定義與作用(Definition and Function of Circular
    的頭像 發(fā)表于 11-09 11:21 ?2024次閱讀
    C++環(huán)形<b class='flag-5'>緩沖區(qū)</b>設(shè)計(jì)與實(shí)現(xiàn)

    西門(mén)子博診斷緩沖區(qū)的使用方法

    可從在線和診斷視圖中“診斷”文件夾的“診斷緩沖區(qū)”組中讀出 CPU 的診斷緩沖區(qū)。
    的頭像 發(fā)表于 12-11 10:24 ?4245次閱讀
    西門(mén)子博診斷<b class='flag-5'>緩沖區(qū)</b>的使用方法

    交換芯片緩沖區(qū)大小是什么

    交換芯片緩沖區(qū)大小并不一定是固定的。緩沖區(qū)的設(shè)計(jì)和實(shí)現(xiàn)會(huì)根據(jù)芯片的具體型號(hào)、規(guī)格以及應(yīng)用場(chǎng)景的不同而有所差異。一些交換芯片可能具有固定大小的緩沖區(qū),以滿足特定的性能需求或成本限制。然而,隨著技術(shù)
    的頭像 發(fā)表于 03-18 14:42 ?617次閱讀
    RM新时代网站-首页