chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

深入理解Linux傳統(tǒng)的System Call I/O

GReq_mcu168 ? 來(lái)源:CSDN博客 ? 作者:范桂颶 ? 2021-11-19 09:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

傳統(tǒng)的 System Call I/O

Linux 系統(tǒng)中,傳統(tǒng)的訪問(wèn)方式是通過(guò) write() 和 read() 兩個(gè)系統(tǒng)調(diào)用實(shí)現(xiàn)的,通過(guò) read() 函數(shù)讀取文件到到緩存區(qū)中,然后通過(guò) write() 方法把緩存中的數(shù)據(jù)輸出到網(wǎng)絡(luò)端口。

read(file_fd, tmp_buf, len);write(socket_fd, tmp_buf, len);

下圖分別對(duì)應(yīng)傳統(tǒng) I/O 操作的數(shù)據(jù)讀寫(xiě)流程,整個(gè)過(guò)程涉及 2 次 CPU 拷貝、2 次 DMA 拷貝,總共 4 次拷貝,以及 4 次上下文切換。

CPU 拷貝:

由 CPU 直接處理數(shù)據(jù)的傳送,數(shù)據(jù)拷貝時(shí)會(huì)一直占用 CPU 的資源。

DMA 拷貝:

由 CPU 向DMA磁盤(pán)控制器下達(dá)指令,讓 DMA 控制器來(lái)處理數(shù)據(jù)的傳送,數(shù)據(jù)傳送完畢再把信息反饋給 CPU,從而減輕了 CPU 資源的占有率。

上下文切換:

當(dāng)用戶程序向內(nèi)核發(fā)起系統(tǒng)調(diào)用時(shí),CPU 將用戶進(jìn)程從用戶態(tài)切換到內(nèi)核態(tài);

當(dāng)系統(tǒng)調(diào)用返回時(shí),CPU 將用戶進(jìn)程從內(nèi)核態(tài)切換回用戶態(tài)。

讀操作

當(dāng)應(yīng)用程序執(zhí)行 read 系統(tǒng)調(diào)用讀取一塊數(shù)據(jù)的時(shí)候,如果這塊數(shù)據(jù)已經(jīng)存在于用戶進(jìn)程的頁(yè)內(nèi)存中,就直接從內(nèi)存中讀取數(shù)據(jù)。

如果數(shù)據(jù)不存在,則先將數(shù)據(jù)從磁盤(pán)加載數(shù)據(jù)到內(nèi)核空間的讀緩存(Read Buffer)中,再?gòu)淖x緩存拷貝到用戶進(jìn)程的頁(yè)內(nèi)存中。

read(file_fd, tmp_buf, len);

基于傳統(tǒng)的 I/O 讀取方式,read 系統(tǒng)調(diào)用會(huì)觸發(fā) 2 次上下文切換,1 次 DMA 拷貝和 1 次 CPU 拷貝。

發(fā)起數(shù)據(jù)讀取的流程如下:

用戶進(jìn)程通過(guò) read() 函數(shù)向 Kernel 發(fā)起 System Call,上下文從 user space 切換為 kernel space。

CPU 利用 DMA 控制器將數(shù)據(jù)從主存或硬盤(pán)拷貝到 kernel space 的讀緩沖區(qū)(Read Buffer)。

CPU 將讀緩沖區(qū)(Read Buffer)中的數(shù)據(jù)拷貝到 user space 的用戶緩沖區(qū)(User Buffer)。

上下文從 kernel space 切換回用戶態(tài)(User Space),read 調(diào)用執(zhí)行返回。

寫(xiě)操作

當(dāng)應(yīng)用程序準(zhǔn)備好數(shù)據(jù),執(zhí)行 write 系統(tǒng)調(diào)用發(fā)送網(wǎng)絡(luò)數(shù)據(jù)時(shí),先將數(shù)據(jù)從用戶空間的頁(yè)緩存拷貝到內(nèi)核空間的網(wǎng)絡(luò)緩沖區(qū)(Socket Buffer)中,然后再將寫(xiě)緩存中的數(shù)據(jù)拷貝到網(wǎng)卡設(shè)備完成數(shù)據(jù)發(fā)送。

write(socket_fd, tmp_buf, len);

基于傳統(tǒng)的 I/O 寫(xiě)入方式,write() 系統(tǒng)調(diào)用會(huì)觸發(fā) 2 次上下文切換,1 次 CPU 拷貝和 1 次 DMA 拷貝。

用戶程序發(fā)送網(wǎng)絡(luò)數(shù)據(jù)的流程如下:

用戶進(jìn)程通過(guò) write() 函數(shù)向 kernel 發(fā)起 System Call,上下文從 user space 切換為 kernel space。

CPU 將用戶緩沖區(qū)(User Buffer)中的數(shù)據(jù)拷貝到 kernel space 的網(wǎng)絡(luò)緩沖區(qū)(Socket Buffer)。

CPU 利用 DMA 控制器將數(shù)據(jù)從網(wǎng)絡(luò)緩沖區(qū)(Socket Buffer)拷貝到 NIC 進(jìn)行數(shù)據(jù)傳輸。

上下文從 kernel space 切換回 user space,write 系統(tǒng)調(diào)用執(zhí)行返回。

網(wǎng)絡(luò) I/O

磁盤(pán) I/O

高性能優(yōu)化的 I/O

零拷貝技術(shù)。

多路復(fù)用技術(shù)。

頁(yè)緩存(PageCache)技術(shù)。

其中,頁(yè)緩存(PageCache)是操作系統(tǒng)對(duì)文件的緩存,用來(lái)減少對(duì)磁盤(pán)的 I/O 操作,以頁(yè)為單位的,內(nèi)容就是磁盤(pán)上的物理塊,頁(yè)緩存能幫助程序?qū)ξ募M(jìn)行順序讀寫(xiě)的速度幾乎接近于內(nèi)存的讀寫(xiě)速度,主要原因就是由于 OS 使用 PageCache 機(jī)制對(duì)讀寫(xiě)訪問(wèn)操作進(jìn)行了性能優(yōu)化。

頁(yè)緩存讀取策略:當(dāng)進(jìn)程發(fā)起一個(gè)讀操作 (比如,進(jìn)程發(fā)起一個(gè) read() 系統(tǒng)調(diào)用),它首先會(huì)檢查需要的數(shù)據(jù)是否在頁(yè)緩存中:

如果在,則放棄訪問(wèn)磁盤(pán),而直接從頁(yè)緩存中讀取。

如果不在,則內(nèi)核調(diào)度塊 I/O 操作從磁盤(pán)去讀取數(shù)據(jù),并讀入緊隨其后的少數(shù)幾個(gè)頁(yè)面(不少于一個(gè)頁(yè)面,通常是三個(gè)頁(yè)面),然后將數(shù)據(jù)放入頁(yè)緩存中。

頁(yè)緩存寫(xiě)策略:當(dāng)進(jìn)程發(fā)起 write 系統(tǒng)調(diào)用寫(xiě)數(shù)據(jù)到文件中,先寫(xiě)到頁(yè)緩存,然后方法返回。此時(shí)數(shù)據(jù)還沒(méi)有真正的保存到文件中去,Linux 僅僅將頁(yè)緩存中的這一頁(yè)數(shù)據(jù)標(biāo)記為 “臟”,并且被加入到臟頁(yè)鏈表中。

然后,由 flusher 回寫(xiě)線程周期性將臟頁(yè)鏈表中的頁(yè)寫(xiě)到磁盤(pán),讓磁盤(pán)中的數(shù)據(jù)和內(nèi)存中保持一致,最后清理“臟”標(biāo)識(shí)。在以下三種情況下,臟頁(yè)會(huì)被寫(xiě)回磁盤(pán):

空閑內(nèi)存低于一個(gè)特定閾值。

臟頁(yè)在內(nèi)存中駐留超過(guò)一個(gè)特定的閾值時(shí)。

當(dāng)用戶進(jìn)程調(diào)用 sync() 和 fsync() 系統(tǒng)調(diào)用時(shí)。

存儲(chǔ)設(shè)備的 I/O 棧

從系統(tǒng)調(diào)用的接口再往下,Linux 下的 IO 棧致大致有三個(gè)層次:

文件系統(tǒng)層,以 write 為例,內(nèi)核拷貝了 write 參數(shù)指定的用戶態(tài)數(shù)據(jù)到文件系統(tǒng) Cache 中,并適時(shí)向下層同步。

塊層,管理塊設(shè)備的 IO 隊(duì)列,對(duì) IO 請(qǐng)求進(jìn)行合并、排序(還記得操作系統(tǒng)課程學(xué)習(xí)過(guò)的 IO 調(diào)度算法嗎?

)。

設(shè)備層,通過(guò) DMA 與內(nèi)存直接交互,完成數(shù)據(jù)和具體設(shè)備之間的交互。

結(jié)合這個(gè)圖,想想 Linux 系統(tǒng)編程里用到的 Buffered IO、mmap、Direct IO,這些機(jī)制怎么和 Linux I/O 棧聯(lián)系起來(lái)呢?上面的圖有點(diǎn)復(fù)雜,我畫(huà)一幅簡(jiǎn)圖,把這些機(jī)制所在的位置添加進(jìn)去:

f0bcdbac-43ac-11ec-b939-dac502259ad0.png

Linux IO系統(tǒng)

這下一目了然了吧?傳統(tǒng)的 Buffered IO 使用 read 讀取文件的過(guò)程什么樣的?假設(shè)要去讀一個(gè)冷文件(Cache 中不存在),open 打開(kāi)文件內(nèi)核后建立了一系列的數(shù)據(jù)結(jié)構(gòu),接下來(lái)調(diào)用 read,到達(dá)文件系統(tǒng)這一層,發(fā)現(xiàn) Page Cache 中不存在該位置的磁盤(pán)映射,然后創(chuàng)建相應(yīng)的 Page Cache 并和相關(guān)的扇區(qū)關(guān)聯(lián)。然后請(qǐng)求繼續(xù)到達(dá)塊設(shè)備層,在 IO 隊(duì)列里排隊(duì),接受一系列的調(diào)度后到達(dá)設(shè)備驅(qū)動(dòng)層,此時(shí)一般使用 DMA 方式讀取相應(yīng)的磁盤(pán)扇區(qū)到 Cache 中,然后 read 拷貝數(shù)據(jù)到用戶提供的用戶態(tài) buffer 中去(read 的參數(shù)指出的)。

整個(gè)過(guò)程有幾次拷貝?從磁盤(pán)到 Page Cache 算第一次的話,從 Page Cache 到用戶態(tài) buffer 就是第二次了。而 mmap 做了什么?mmap 直接把 Page Cache 映射到了用戶態(tài)的地址空間里了,所以 mmap 的方式讀文件是沒(méi)有第二次拷貝過(guò)程的。

那 Direct IO 做了什么?這個(gè)機(jī)制更狠,直接讓用戶態(tài)和塊 IO 層對(duì)接,直接放棄 Page Cache,從磁盤(pán)直接和用戶態(tài)拷貝數(shù)據(jù)。好處是什么?寫(xiě)操作直接映射進(jìn)程的buffer到磁盤(pán)扇區(qū),以 DMA 的方式傳輸數(shù)據(jù),減少了原本需要到 Page Cache 層的一次拷貝,提升了寫(xiě)的效率。對(duì)于讀而言,第一次肯定也是快于傳統(tǒng)的方式的,但是之后的讀就不如傳統(tǒng)方式了(當(dāng)然也可以在用戶態(tài)自己做 Cache,有些商用數(shù)據(jù)庫(kù)就是這么做的)。

除了傳統(tǒng)的 Buffered IO 可以比較自由的用偏移+長(zhǎng)度的方式讀寫(xiě)文件之外,mmap 和 Direct IO 均有數(shù)據(jù)按頁(yè)對(duì)齊的要求,Direct IO 還限制讀寫(xiě)必須是底層存儲(chǔ)設(shè)備塊大小的整數(shù)倍(甚至 Linux 2.4 還要求是文件系統(tǒng)邏輯塊的整數(shù)倍)。所以接口越來(lái)越底層,換來(lái)表面上的效率提升的背后,需要在應(yīng)用程序這一層做更多的事情。所以想用好這些高級(jí)特性,除了深刻理解其背后的機(jī)制之外,也要在系統(tǒng)設(shè)計(jì)上下一番功夫。

I/O Buffering

f121afa0-43ac-11ec-b939-dac502259ad0.png

如圖,當(dāng)程序調(diào)用各類(lèi)文件操作函數(shù)后,用戶數(shù)據(jù)(User Data)到達(dá)磁盤(pán)(Disk)的流程如圖所示。

圖中描述了 Linux 下文件操作函數(shù)的層級(jí)關(guān)系和內(nèi)存緩存層的存在位置。中間的黑色實(shí)線是用戶態(tài)和內(nèi)核態(tài)的分界線。

從上往下分析這張圖:

1. 首先是 C 語(yǔ)言 stdio 庫(kù)定義的相關(guān)文件操作函數(shù),這些都是用戶態(tài)實(shí)現(xiàn)的跨平臺(tái)封裝函數(shù)。stdio 中實(shí)現(xiàn)的文件操作函數(shù)有自己的 stdio buffer,這是在用戶態(tài)實(shí)現(xiàn)的緩存。此處使用緩存的原因很簡(jiǎn)單 — 系統(tǒng)調(diào)用總是昂貴的。如果用戶代碼以較小的 size 不斷的讀或?qū)懳募脑挘瑂tdio 庫(kù)將多次的讀或者寫(xiě)操作通過(guò) buffer 進(jìn)行聚合是可以提高程序運(yùn)行效率的。stdio 庫(kù)同時(shí)也支持 fflush 函數(shù)來(lái)主動(dòng)的刷新 buffer,主動(dòng)的調(diào)用底層的系統(tǒng)調(diào)用立即更新 buffer 里的數(shù)據(jù)。特別地,setbuf 函數(shù)可以對(duì) stdio 庫(kù)的用戶態(tài) buffer 進(jìn)行設(shè)置,甚至取消 buffer 的使用。

2. 系統(tǒng)調(diào)用的 read/write 和真實(shí)的磁盤(pán)讀寫(xiě)之間也存在一層 buffer,這里用術(shù)語(yǔ) Kernel buffer cache 來(lái)指代這一層緩存。在 Linux 下,文件的緩存習(xí)慣性的稱(chēng)之為 Page Cache,而更低一級(jí)的設(shè)備的緩存稱(chēng)之為 Buffer Cache。這兩個(gè)概念很容易混淆,這里簡(jiǎn)單的介紹下概念上的區(qū)別:Page Cache 用于緩存文件的內(nèi)容,和文件系統(tǒng)比較相關(guān)。文件的內(nèi)容需要映射到實(shí)際的物理磁盤(pán),這種映射關(guān)系由文件系統(tǒng)來(lái)完成;Buffer Cache 用于緩存存儲(chǔ)設(shè)備塊(比如磁盤(pán)扇區(qū))的數(shù)據(jù),而不關(guān)心是否有文件系統(tǒng)的存在(文件系統(tǒng)的元數(shù)據(jù)緩存在 Buffer Cache 中)。

作者:范桂颶原文:https://is-cloud.blog.csdn.net/article/details/105897963

責(zé)任編輯:haq

聲明:本文內(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)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11250

    瀏覽量

    223861
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11683

    瀏覽量

    218581
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    8202

    瀏覽量

    93611

原文標(biāo)題:深入理解 Linux的 I/O 系統(tǒng)

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【「Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配

    最近這段時(shí)間內(nèi)存條、硬盤(pán)的價(jià)格飛漲,隨著AI產(chǎn)品的興起,大數(shù)據(jù)模型的應(yīng)用,對(duì)硬件存儲(chǔ)要求的更高。這節(jié)閱讀有關(guān)Linux內(nèi)存管理方面的知識(shí)。 Linux系統(tǒng)使用了“虛擬內(nèi)存”機(jī)制,虛擬內(nèi)存機(jī)制則意味著
    發(fā)表于 01-16 20:05

    深入解析PCF8574:I2C總線8位I/O擴(kuò)展器的設(shè)計(jì)與應(yīng)用

    深入解析PCF8574:I2C總線8位I/O擴(kuò)展器的設(shè)計(jì)與應(yīng)用 在電子設(shè)計(jì)領(lǐng)域,I/O擴(kuò)展器是提
    的頭像 發(fā)表于 12-30 18:00 ?1020次閱讀

    深入解析PCF8575:16位I2C與SMBus I/O擴(kuò)展器的卓越之選

    深入解析PCF8575:16位I2C與SMBus I/O擴(kuò)展器的卓越之選 在電子工程師的日常設(shè)計(jì)工作中,I/
    的頭像 發(fā)表于 12-29 14:20 ?227次閱讀

    揭秘MCP2502X/5X CAN I/O擴(kuò)展器:特性、功能與應(yīng)用全解析

    自動(dòng)化等眾多領(lǐng)域。MCP2502X/5X系列CAN I/O擴(kuò)展器為構(gòu)建CAN系統(tǒng)提供了一種便捷且高效的解決方案。盡管它已不推薦用于新設(shè)計(jì),但了解其特性和功能對(duì)于我們深入理解CAN系統(tǒng)的工作原理仍具有
    的頭像 發(fā)表于 12-28 15:40 ?443次閱讀

    PCA9554:8位I2C和SMBus I/O擴(kuò)展器的深度解析

    遠(yuǎn)程8位I2C和SMBus I/O擴(kuò)展器,具有諸多優(yōu)秀特性,下面我們就來(lái)深入了解一下。 文件下載: pca9554.pdf 1. 產(chǎn)品特性 PCA9554的特性豐富,使其在眾多應(yīng)用場(chǎng)景
    的頭像 發(fā)表于 12-27 13:45 ?532次閱讀

    深入解析PCA9534A:8位I2C和SMBus低功耗I/O擴(kuò)展器

    深入解析PCA9534A:8位I2C和SMBus低功耗I/O擴(kuò)展器 在電子工程師的日常設(shè)計(jì)中,I/O
    的頭像 發(fā)表于 12-27 10:55 ?699次閱讀

    深入剖析LM8333:移動(dòng)設(shè)備的高效I/O伴侶

    深入剖析LM8333:移動(dòng)設(shè)備的高效I/O伴侶 在當(dāng)今的移動(dòng)設(shè)備領(lǐng)域,對(duì)于高效、低功耗且功能豐富的I/O解決方案的需求日益增長(zhǎng)。Texas
    的頭像 發(fā)表于 12-26 15:55 ?204次閱讀

    TCA6408A:低電壓8位I2C和SMBus I/O擴(kuò)展器的深度解析

    的需求。今天,我們就來(lái)深入探討一下德州儀器(TI)的TCA6408A低電壓8位I2C和SMBus I/O擴(kuò)展器。 文件下載: tca6408a.pdf 1. 產(chǎn)品概述 TCA6408A
    的頭像 發(fā)表于 12-25 10:25 ?289次閱讀

    深入解析 TCA9539:低電壓 16 位 I2C 和 SMBus I/O 擴(kuò)展器

    深入解析 TCA9539:低電壓 16 位 I2C 和 SMBus I/O 擴(kuò)展器 在電子設(shè)計(jì)的廣闊領(lǐng)域中,I/
    的頭像 發(fā)表于 12-25 09:30 ?200次閱讀

    深入解析TCA9554:8位I2C和SMBus低功耗I/O擴(kuò)展器

    深入解析TCA9554:8位I2C和SMBus低功耗I/O擴(kuò)展器 在電子設(shè)計(jì)領(lǐng)域,I/O擴(kuò)展器是
    的頭像 發(fā)表于 12-23 17:35 ?593次閱讀

    飛凌嵌入式ElfBoard-文件I/O深入學(xué)習(xí)之異步I/O

    I/O多路復(fù)用中,進(jìn)程通過(guò)系統(tǒng)調(diào)用select或poll來(lái)主動(dòng)查詢文件描述符上是否可以執(zhí)行I/O操作。而在異步I/
    發(fā)表于 12-05 11:23

    深入剖析I2C協(xié)議

    I2C是由Philips開(kāi)發(fā)的簡(jiǎn)單的雙向兩線總線,在深入淺出理解SPI協(xié)議中,我們區(qū)分了單工,半雙工,全雙工協(xié)議數(shù)據(jù)流向的區(qū)別,根據(jù)特征,I2C協(xié)議屬于半雙工協(xié)議(即同一時(shí)刻,數(shù)據(jù)單向
    的頭像 發(fā)表于 08-21 15:10 ?3516次閱讀
    <b class='flag-5'>深入</b>剖析<b class='flag-5'>I</b>2C協(xié)議

    Linux系統(tǒng)管理的核心概念

    的管理、權(quán)限控制信息的查看,以及chmod和chown命令的使用。這些知識(shí)對(duì)于任何希望深入理解Linux系統(tǒng)管理的用戶來(lái)說(shuō)都是至關(guān)重要的。
    的頭像 發(fā)表于 05-15 17:05 ?574次閱讀

    I/O接口與I/O端口的區(qū)別

    在計(jì)算機(jī)系統(tǒng)中,I/O接口與I/O端口是實(shí)現(xiàn)CPU與外部設(shè)備數(shù)據(jù)交換的關(guān)鍵組件,它們?cè)诠δ堋⒔Y(jié)構(gòu)、作用及運(yùn)作機(jī)制上均存在顯著差異,卻又相互協(xié)同工作,共同構(gòu)建起CPU與外部設(shè)備之間的橋梁
    的頭像 發(fā)表于 02-02 16:00 ?3339次閱讀

    單片機(jī)I/O接口的傳輸方式

    著數(shù)據(jù)傳輸?shù)娜蝿?wù),還影響著整個(gè)系統(tǒng)的性能和可靠性。本文將深入探討單片機(jī)I/O接口的傳輸方式,包括無(wú)條件傳送、查詢傳送、中斷傳送和DMA傳送等,以期為單片機(jī)應(yīng)用開(kāi)發(fā)者提供有價(jià)值的參考。
    的頭像 發(fā)表于 02-02 15:56 ?1928次閱讀