新聞中心
Linux操作系統(tǒng)是一種優(yōu)秀的開(kāi)源軟件,它具有穩(wěn)定、強(qiáng)大、靈活、安全等眾多的優(yōu)點(diǎn),在服務(wù)器領(lǐng)域得到廣泛的應(yīng)用。然而,由于Linux系統(tǒng)的架構(gòu)和內(nèi)核高度復(fù)雜,對(duì)于普通用戶來(lái)說(shuō),掌握Linux系統(tǒng)的運(yùn)作機(jī)制是非常有必要的。

英吉沙網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,英吉沙網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為英吉沙成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的英吉沙做網(wǎng)站的公司定做!
本文從三個(gè)方面分別介紹linux的機(jī)制,分別是進(jìn)程、文件系統(tǒng)和網(wǎng)絡(luò)協(xié)議,以幫助讀者更好地理解和掌握Linux系統(tǒng)。
一、進(jìn)程管理機(jī)制
進(jìn)程是指正在運(yùn)行的程序或任務(wù),是操作系統(tǒng)中最基本的概念之一。Linux系統(tǒng)采用多任務(wù)機(jī)制,即在同一時(shí)間內(nèi)可以運(yùn)行多個(gè)進(jìn)程,這些進(jìn)程可以并發(fā)、并行或順序執(zhí)行。Linux內(nèi)核負(fù)責(zé)對(duì)每個(gè)進(jìn)程進(jìn)行調(diào)度和管理,確保系統(tǒng)的高效運(yùn)行。
Linux系統(tǒng)有多種調(diào)度算法,如完全公平調(diào)度算法、實(shí)時(shí)調(diào)度算法等,通過(guò)調(diào)度算法來(lái)分配CPU時(shí)間和優(yōu)先級(jí),以保證各個(gè)進(jìn)程能夠在相應(yīng)的時(shí)間片內(nèi)運(yùn)行,從而達(dá)到系統(tǒng)資源的更優(yōu)化分配和利用。
此外,Linux系統(tǒng)還提供了豐富的機(jī)制來(lái)管理進(jìn)程的狀態(tài)和行為。比如說(shuō),通過(guò)進(jìn)程標(biāo)識(shí)符PID可以唯一標(biāo)識(shí)每個(gè)進(jìn)程,在系統(tǒng)中查找、終止和信號(hào)通信時(shí)都需要用到PID;通過(guò)進(jìn)程間通信(IPC)機(jī)制,如管道、消息隊(duì)列、共享內(nèi)存等,可以讓不同的進(jìn)程之間進(jìn)行數(shù)據(jù)傳輸和共享;通過(guò)進(jìn)程控制功能,如fork、exec、wt等,可以創(chuàng)建、運(yùn)行、等待和替換進(jìn)程程序等。
掌握Linux的進(jìn)程管理機(jī)制,可以讓用戶更好地理解操作系統(tǒng)運(yùn)行的基本原理和流程,更好地進(jìn)行開(kāi)發(fā)和調(diào)試工作。
二、文件系統(tǒng)機(jī)制
文件系統(tǒng)是指存儲(chǔ)設(shè)備中的一種組織形式,用于管理和維護(hù)存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)和算法。Linux系統(tǒng)通過(guò)VFS(虛擬文件系統(tǒng))機(jī)制,將各種不同的文件系統(tǒng)進(jìn)行統(tǒng)一的管理和操作,提供了豐富的接口和命令來(lái)操作各種不同的文件系統(tǒng)。
Linux系統(tǒng)中支持多種文件系統(tǒng),如EXT4、XFS、NTFS、FAT32等。每種文件系統(tǒng)都有自己的特點(diǎn)和應(yīng)用場(chǎng)景,用戶可以根據(jù)需要靈活選擇。比如說(shuō),EXT4是一種性能強(qiáng)勁、可靠穩(wěn)定的文件系統(tǒng),適合用作服務(wù)器等高負(fù)載環(huán)境;XFS則是一種高度可擴(kuò)展性的文件系統(tǒng),能夠支持超大規(guī)模的存儲(chǔ)容量,并具有高性能和高并發(fā)能力;NTFS和FAT32則是Windows操作系統(tǒng)中常用的文件系統(tǒng),適合與Windows系統(tǒng)共享數(shù)據(jù)。
此外,Linux的文件系統(tǒng)中還有許多重要的概念和機(jī)制,如目錄樹(shù)、文件權(quán)限、鏈接和掛載等。其中權(quán)限控制機(jī)制是非常重要的,通過(guò)權(quán)限控制機(jī)制可以保證系統(tǒng)的安全性,防止惡意用戶篡改系統(tǒng)關(guān)鍵文件和目錄。
掌握Linux的文件系統(tǒng)機(jī)制,可以讓用戶更好地利用系統(tǒng)資源,高效地管理和維護(hù)文件系統(tǒng),減少系統(tǒng)故障和安全漏洞的發(fā)生。
三、網(wǎng)絡(luò)協(xié)議機(jī)制
網(wǎng)絡(luò)協(xié)議是指計(jì)算機(jī)在網(wǎng)絡(luò)中進(jìn)行通信所必須遵守的規(guī)則和約定。Linux系統(tǒng)作為強(qiáng)大的服務(wù)器操作系統(tǒng),自然需要與各種不同的網(wǎng)絡(luò)協(xié)議進(jìn)行交互。在Linux系統(tǒng)中,網(wǎng)絡(luò)協(xié)議機(jī)制主要包括TCP/IP協(xié)議、UDP協(xié)議、ARP協(xié)議、DNS協(xié)議等。
其中,TCP/IP協(xié)議是最為重要的協(xié)議之一,主要用于解決數(shù)據(jù)在網(wǎng)絡(luò)中的傳輸問(wèn)題。TCP協(xié)議采用“三次握手”和“四次揮手”的機(jī)制來(lái)建立和關(guān)閉連接,保證數(shù)據(jù)的可靠性;而UDP協(xié)議則沒(méi)有建立連接和斷開(kāi)連接的過(guò)程,可以實(shí)現(xiàn)更快速的數(shù)據(jù)傳輸。
除了協(xié)議機(jī)制,Linux系統(tǒng)還提供了強(qiáng)大的網(wǎng)絡(luò)調(diào)試和管理工具,如ifconfig、netstat、tcpstat等,幫助用戶更好地了解和掌握網(wǎng)絡(luò)運(yùn)作的細(xì)節(jié)和狀態(tài)。
掌握Linux的網(wǎng)絡(luò)協(xié)議機(jī)制,可以使用戶更好地理解網(wǎng)絡(luò)通信的原理和過(guò)程,更好地進(jìn)行網(wǎng)絡(luò)應(yīng)用的開(kāi)發(fā)和管理。
掌握Linux的運(yùn)作機(jī)制是非常重要的,可以幫助用戶更好地理解操作系統(tǒng)的運(yùn)作原理和流程,更好地進(jìn)行開(kāi)發(fā)和調(diào)試工作,提高系統(tǒng)運(yùn)行效率和安全性。本文從進(jìn)程、文件系統(tǒng)和網(wǎng)絡(luò)協(xié)議三個(gè)方面分別介紹了Linux的運(yùn)作機(jī)制,希望能夠?qū)ψx者有所幫助。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來(lái)專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220[轉(zhuǎn)]淺談Linux下的零拷貝機(jī)制
維基上是這么描述零拷貝的:零拷貝描述的是CPU不執(zhí)行拷貝數(shù)據(jù)從一個(gè)存儲(chǔ)區(qū)域到另一個(gè)存儲(chǔ)區(qū)域的任務(wù),這通常用于通過(guò)網(wǎng)絡(luò)傳輸一個(gè)文件時(shí)以減少CPU周期和內(nèi)存帶寬。
減少甚至完全避免不必要的CPU拷貝,從而讓CPU解脫出來(lái)去執(zhí)行其他的任務(wù)
減少內(nèi)存帶寬的占用
通常零拷貝技術(shù)還能夠減少用戶空間和操作系統(tǒng)內(nèi)核空間之間的上下文切換
從Linux系統(tǒng)上看,除了引導(dǎo)系統(tǒng)的BIN區(qū),整個(gè)內(nèi)存空間主要被分成兩個(gè)部分:
內(nèi)核空間(Kernel space)
、
用戶空間(User space)
?!坝脩艨臻g”和“內(nèi)核空間”的空間、操作權(quán)限以及作用都是不一樣的。
內(nèi)核空間是Linux自身使用的內(nèi)存空間,主要提供給程序調(diào)度、內(nèi)存分配、連接硬件資源等程序邏輯使用;
用戶空間則是提供給各個(gè)進(jìn)程的主要空間。用戶空間不具有訪問(wèn)內(nèi)核空間資源的權(quán)限,因此如果應(yīng)用程序需要使用到內(nèi)核空間的資源,則需要通過(guò)系統(tǒng)調(diào)用來(lái)完成:從用戶空間切換到內(nèi)核空間,然后在完成相關(guān)操作后再?gòu)膬?nèi)核空間切換回用戶空間。
① 直接 I/O:對(duì)于這種數(shù)據(jù)傳輸方式來(lái)說(shuō),應(yīng)用程序可以直接訪問(wèn)硬件存儲(chǔ),操作系統(tǒng)內(nèi)核只是輔助數(shù)據(jù)傳輸。這種方式依舊存在用戶空間和內(nèi)核空間的上下文切換,但是硬件上的數(shù)據(jù)不會(huì)拷貝滑仿一份到內(nèi)核空間,而是直接拷貝至了用戶空間,因此直接I/O不存在內(nèi)核空間緩沖區(qū)和用戶空間緩沖區(qū)之間的數(shù)據(jù)拷貝。
② 在數(shù)據(jù)傳輸過(guò)程中,避免數(shù)據(jù)在用戶空間緩沖區(qū)和系統(tǒng)內(nèi)核空間緩沖區(qū)之間的CPU拷貝,以及數(shù)據(jù)在系統(tǒng)內(nèi)核空間內(nèi)的CPU拷貝。本文主要討論的就是該方式下的零拷貝機(jī)制。
③ copy-on-write(寫(xiě)時(shí)復(fù)制技術(shù)):在某些情況下,Linux操作系統(tǒng)的內(nèi)核空間緩沖區(qū)可能被多個(gè)應(yīng)用程序所共享,操作系統(tǒng)有可能會(huì)將用戶空間緩沖區(qū)地址映射到內(nèi)核空間緩存區(qū)中。當(dāng)應(yīng)用程序需要對(duì)共享的數(shù)據(jù)進(jìn)行修改的時(shí)候,才需要真正地拷貝數(shù)據(jù)到應(yīng)用程序的用戶空間緩沖區(qū)中,并且對(duì)自己用戶空間的緩沖區(qū)的數(shù)據(jù)進(jìn)行修改不會(huì)影響到其他共享數(shù)據(jù)的應(yīng)用程序。所以,如果應(yīng)用程序不需要對(duì)數(shù)據(jù)進(jìn)行任何修改的話,就不會(huì)存在數(shù)據(jù)從系統(tǒng)內(nèi)核空間緩沖區(qū)拷貝到用戶空間緩沖區(qū)的操作。
下面我們通過(guò)一個(gè)Java非常常見(jiàn)的應(yīng)用場(chǎng)景:將系統(tǒng)中的文件發(fā)送到遠(yuǎn)端(該流程涉及:磁盤(pán)上文件 ——> 內(nèi)存(字節(jié)數(shù)組) ——> 傳輸給用戶/網(wǎng)絡(luò))來(lái)詳細(xì)展開(kāi)傳統(tǒng)I/O操作和通過(guò)零拷貝來(lái)實(shí)現(xiàn)的I/O操作。
① 發(fā)出read系統(tǒng)調(diào)用:導(dǎo)致用戶空間到內(nèi)核空間的上下文切換(之一次上下文切換)。通過(guò)DMA引擎將文件中的數(shù)據(jù)從磁盤(pán)上讀取到內(nèi)核空間緩沖區(qū)(之一次陸迅拷貝: hard drive ——> kernel buffer)。
② 將內(nèi)核空間緩沖區(qū)的數(shù)據(jù)拷貝到用戶空間緩沖區(qū)(第二次拷貝: kernel buffer ——> user buffer),然后read系統(tǒng)調(diào)用返回。而系統(tǒng)調(diào)用的返回又會(huì)導(dǎo)致一次內(nèi)核空間到用戶空間的上下文切換(第二次上下文切換)。
③ 發(fā)出write系統(tǒng)調(diào)用:導(dǎo)致用戶空間到內(nèi)核空間的上下文切換(第三次上下文切換)。將用戶空間緩沖區(qū)中的數(shù)據(jù)拷貝到內(nèi)核空間中與socket相關(guān)聯(lián)的緩沖區(qū)中(即,第②步中從內(nèi)核空間緩沖區(qū)拷貝而來(lái)的數(shù)據(jù)原封不動(dòng)的再次拷貝到內(nèi)核空間的socket緩沖區(qū)中。)(第三次拷貝: user buffer ——> socket buffer)。
④ write系統(tǒng)調(diào)用返回,導(dǎo)致內(nèi)核空間到用戶空間的再次上下文切換(第四次上下文切換)。通過(guò)DMA引擎將內(nèi)核緩沖區(qū)中的數(shù)據(jù)傳遞到協(xié)議引擎(第四次拷貝: socket buffer ——> protocol engine),這次拷貝是一個(gè)獨(dú)立且異步的過(guò)程。
Q:
你可能會(huì)問(wèn)獨(dú)立和異步這是什么意思?難道是調(diào)用會(huì)在數(shù)據(jù)被傳輸前返回?
A:
事實(shí)上調(diào)用的返回并不保證數(shù)據(jù)被傳輸;它甚至不保證傳輸?shù)拈_(kāi)始。它只是意味著將我們要發(fā)送的數(shù)據(jù)放入到了一個(gè)待發(fā)送的隊(duì)列中,在我們之前可能有許多數(shù)據(jù)包在排隊(duì)。信悉纖除非驅(qū)動(dòng)器或硬件實(shí)現(xiàn)優(yōu)先級(jí)環(huán)或隊(duì)列,否則數(shù)據(jù)是以先進(jìn)先出的方式傳輸?shù)摹?/p>
總的來(lái)說(shuō),傳統(tǒng)的I/O操作進(jìn)行了4次用戶空間與內(nèi)核空間的上下文切換,以及4次數(shù)據(jù)拷貝。其中4次數(shù)據(jù)拷貝中包括了2次DMA拷貝和2次CPU拷貝。
Q:
傳統(tǒng)I/O模式為什么將數(shù)據(jù)從磁盤(pán)讀取到內(nèi)核空間緩沖區(qū),然后再將數(shù)據(jù)從內(nèi)核空間緩沖區(qū)拷貝到用戶空間緩沖區(qū)了?為什么不直接將數(shù)據(jù)從磁盤(pán)讀取到用戶空間緩沖區(qū)就好?
A:
傳統(tǒng)I/O模式之所以將數(shù)據(jù)從磁盤(pán)讀取到內(nèi)核空間緩沖區(qū)而不是直接讀取到用戶空間緩沖區(qū),是為了減少磁盤(pán)I/O操作以此來(lái)提高性能。因?yàn)镺S會(huì)根據(jù)局部性原理在一次read()系統(tǒng)調(diào)用的時(shí)候預(yù)讀取更多的文件數(shù)據(jù)到內(nèi)核空間緩沖區(qū)中,這樣當(dāng)下一次read()系統(tǒng)調(diào)用的時(shí)候發(fā)現(xiàn)要讀取的數(shù)據(jù)已經(jīng)存在于內(nèi)核空間緩沖區(qū)中的時(shí)候只要直接拷貝數(shù)據(jù)到用戶空間緩沖區(qū)中即可,無(wú)需再進(jìn)行一次低效的磁盤(pán)I/O操作(注意:磁盤(pán)I/O操作的速度比直接訪問(wèn)內(nèi)存慢了好幾個(gè)數(shù)量級(jí))。
Q:
既然系統(tǒng)內(nèi)核緩沖區(qū)能夠減少磁盤(pán)I/O操作,那么我們經(jīng)常使用的BufferedInputStream緩沖區(qū)又是用來(lái)干啥的?
A:
BufferedInputStream的作用是會(huì)根據(jù)情況自動(dòng)為我們預(yù)取更多的數(shù)據(jù)到它自己維護(hù)的一個(gè)內(nèi)部字節(jié)數(shù)據(jù)緩沖區(qū)中,這樣做能夠減少系統(tǒng)調(diào)用的次數(shù)以此來(lái)提供性能。
總的來(lái)說(shuō)內(nèi)核空間緩沖區(qū)的一大用處是為了減少磁盤(pán)I/O操作,因?yàn)樗鼤?huì)從磁盤(pán)中預(yù)讀更多的數(shù)據(jù)到緩沖區(qū)中。而B(niǎo)ufferedInputStream的用處是減少“系統(tǒng)調(diào)用”。
DMA(Direct Memory Access) ———— 直接內(nèi)存訪問(wèn) :DMA是允許外設(shè)組件將I/O數(shù)據(jù)直接傳送到主存儲(chǔ)器中并且傳輸不需要CPU的參與,以此將CPU解放出來(lái)去完成其他的事情。
而用戶空間與內(nèi)核空間之間的數(shù)據(jù)傳輸并沒(méi)有類似DMA這種可以不需要CPU參與的傳輸工具,因此用戶空間與內(nèi)核空間之間的數(shù)據(jù)傳輸是需要CPU全程參與的。所有也就有了通過(guò)零拷貝技術(shù)來(lái)減少和避免不必要的CPU數(shù)據(jù)拷貝過(guò)程。
① 發(fā)出sendfile系統(tǒng)調(diào)用,導(dǎo)致用戶空間到內(nèi)核空間的上下文切換(之一次上下文切換)。通過(guò)DMA引擎將磁盤(pán)文件中的內(nèi)容拷貝到內(nèi)核空間緩沖區(qū)中(之一次拷貝: hard drive ——> kernel buffer)。然后再將數(shù)據(jù)從內(nèi)核空間緩沖區(qū)拷貝到內(nèi)核中與socket相關(guān)的緩沖區(qū)中(第二次拷貝: kernel buffer ——> socket buffer)。
② sendfile系統(tǒng)調(diào)用返回,導(dǎo)致內(nèi)核空間到用戶空間的上下文切換(第二次上下文切換)。通過(guò)DMA引擎將內(nèi)核空間socket緩沖區(qū)中的數(shù)據(jù)傳遞到協(xié)議引擎(第三次拷貝: socket buffer ——> protocol engine)
總的來(lái)說(shuō),通過(guò)sendfile實(shí)現(xiàn)的零拷貝I/O只使用了2次用戶空間與內(nèi)核空間的上下文切換,以及3次數(shù)據(jù)的拷貝。其中3次數(shù)據(jù)拷貝中包括了2次DMA拷貝和1次CPU拷貝。
Q:
但通過(guò)是這里還是存在著一次CPU拷貝操作,即,kernel buffer ——> socket buffer。是否有辦法將該拷貝操作也取消掉了?
A:
有的。但這需要底層操作系統(tǒng)的支持。從Linux 2.4版本開(kāi)始,操作系統(tǒng)底層提供了scatter/gather這種DMA的方式來(lái)從內(nèi)核空間緩沖區(qū)中將數(shù)據(jù)直接讀取到協(xié)議引擎中,而無(wú)需將內(nèi)核空間緩沖區(qū)中的數(shù)據(jù)再拷貝一份到內(nèi)核空間socket相關(guān)聯(lián)的緩沖區(qū)中。
從Linux 2.4版本開(kāi)始,操作系統(tǒng)底層提供了帶有scatter/gather的DMA來(lái)從內(nèi)核空間緩沖區(qū)中將數(shù)據(jù)讀取到協(xié)議引擎中。這樣一來(lái)待傳輸?shù)臄?shù)據(jù)可以分散在存儲(chǔ)的不同位置上,而不需要在連續(xù)存儲(chǔ)中存放。那么從文件中讀出的數(shù)據(jù)就根本不需要被拷貝到socket緩沖區(qū)中去,只是需要將緩沖區(qū)描述符添加到socket緩沖區(qū)中去,DMA收集操作會(huì)根據(jù)緩沖區(qū)描述符中的信息將內(nèi)核空間中的數(shù)據(jù)直接拷貝到協(xié)議引擎中。
① 發(fā)出sendfile系統(tǒng)調(diào)用,導(dǎo)致用戶空間到內(nèi)核空間的上下文切換(之一次上下文切換)。通過(guò)DMA引擎將磁盤(pán)文件中的內(nèi)容拷貝到內(nèi)核空間緩沖區(qū)中(之一次拷貝: hard drive ——> kernel buffer)。
② 沒(méi)有數(shù)據(jù)拷貝到socket緩沖區(qū)。取而代之的是只有相應(yīng)的描述符信息會(huì)被拷貝到相應(yīng)的socket緩沖區(qū)當(dāng)中。該描述符包含了兩方面的信息:a)kernel buffer的內(nèi)存地址;b)kernel buffer的偏移量。
③ sendfile系統(tǒng)調(diào)用返回,導(dǎo)致內(nèi)核空間到用戶空間的上下文切換(第二次上下文切換)。DMA gather copy根據(jù)socket緩沖區(qū)中描述符提供的位置和偏移量信息直接將內(nèi)核空間緩沖區(qū)中的數(shù)據(jù)拷貝到協(xié)議引擎上(第二次拷貝: kernel buffer ——> protocol engine),這樣就避免了最后一次CPU數(shù)據(jù)拷貝。
總的來(lái)說(shuō),帶有DMA收集拷貝功能的sendfile實(shí)現(xiàn)的I/O只使用了2次用戶空間與內(nèi)核空間的上下文切換,以及2次數(shù)據(jù)的拷貝,而且這2次的數(shù)據(jù)拷貝都是非CPU拷貝。這樣一來(lái)我們就實(shí)現(xiàn)了最理想的零拷貝I/O傳輸了,不需要任何一次的CPU拷貝,以及最少的上下文切換。
在linux2.6.33版本之前 sendfile指支持文件到套接字之間傳輸數(shù)據(jù),即in_fd相當(dāng)于一個(gè)支持mmap的文件,out_fd必須是一個(gè)socket。但從linux2.6.33版本開(kāi)始,out_fd可以是任意類型文件描述符。所以從linux2.6.33版本開(kāi)始sendfile可以支持“文件到文件”和“文件到套接字”之間的數(shù)據(jù)傳輸。
Q:
對(duì)于上面的第三點(diǎn),如果我們需要對(duì)數(shù)據(jù)進(jìn)行操作該怎么辦了?
A:
Linux提供了mmap零拷貝來(lái)實(shí)現(xiàn)我們的需求。
mmap(內(nèi)存映射)是一個(gè)比sendfile昂貴但優(yōu)于傳統(tǒng)I/O的方法。
① 發(fā)出mmap系統(tǒng)調(diào)用,導(dǎo)致用戶空間到內(nèi)核空間的上下文切換(之一次上下文切換)。通過(guò)DMA引擎將磁盤(pán)文件中的內(nèi)容拷貝到內(nèi)核空間緩沖區(qū)中(之一次拷貝: hard drive ——> kernel buffer)。
② mmap系統(tǒng)調(diào)用返回,導(dǎo)致內(nèi)核空間到用戶空間的上下文切換(第二次上下文切換)。接著用戶空間和內(nèi)核空間共享這個(gè)緩沖區(qū),而不需要將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間。因?yàn)橛脩艨臻g和內(nèi)核空間共享了這個(gè)緩沖區(qū)數(shù)據(jù),所以用戶空間就可以像在操作自己緩沖區(qū)中數(shù)據(jù)一般操作這個(gè)由內(nèi)核空間共享的緩沖區(qū)數(shù)據(jù)。
③ 發(fā)出write系統(tǒng)調(diào)用,導(dǎo)致用戶空間到內(nèi)核空間的上下文切換(第三次上下文切換)。將數(shù)據(jù)從內(nèi)核空間緩沖區(qū)拷貝到內(nèi)核空間socket相關(guān)聯(lián)的緩沖區(qū)(第二次拷貝: kernel buffer ——> socket buffer)。
④ write系統(tǒng)調(diào)用返回,導(dǎo)致內(nèi)核空間到用戶空間的上下文切換(第四次上下文切換)。通過(guò)DMA引擎將內(nèi)核空間socket緩沖區(qū)中的數(shù)據(jù)傳遞到協(xié)議引擎(第三次拷貝: socket buffer ——> protocol engine)
總的來(lái)說(shuō),通過(guò)mmap實(shí)現(xiàn)的零拷貝I/O進(jìn)行了4次用戶空間與內(nèi)核空間的上下文切換,以及3次數(shù)據(jù)拷貝。其中3次數(shù)據(jù)拷貝中包括了2次DMA拷貝和1次CPU拷貝。
FileChannel中大量使用了我們上面所提及的零拷貝技術(shù)。
FileChannel的map方法會(huì)返回一個(gè)MappedByteBuffer。MappedByteBuffer是一個(gè)直接字節(jié)緩沖器,該緩沖器的內(nèi)存是一個(gè)文件的內(nèi)存映射區(qū)域。map方法底層是通過(guò)mmap實(shí)現(xiàn)的,因此將文件內(nèi)存從磁盤(pán)讀取到內(nèi)核緩沖區(qū)后,用戶空間和內(nèi)核空間共享該緩沖區(qū)。
MappedByteBuffer內(nèi)存映射文件是一種允許Java程序直接從內(nèi)存訪問(wèn)的一種特殊的文件。我們可以將整個(gè)文件或者整個(gè)文件的一部分映射到內(nèi)存當(dāng)中,那么接下來(lái)是由操作系統(tǒng)來(lái)進(jìn)行相關(guān)的頁(yè)面請(qǐng)求并將內(nèi)存的修改寫(xiě)入到文件當(dāng)中。我們的應(yīng)用程序只需要處理內(nèi)存的數(shù)據(jù),這樣可以實(shí)現(xiàn)非常迅速的I/O操作。
只讀模式來(lái)說(shuō),如果程序試圖進(jìn)行寫(xiě)操作,則會(huì)拋出ReadOnlyBufferException異常
讀寫(xiě)模式表明,對(duì)結(jié)果對(duì)緩沖區(qū)所做的修改將最終廣播到文件。但這個(gè)修改可能會(huì)也可能不會(huì)被其他映射了相同文件程序可見(jiàn)。
私有模式來(lái)說(shuō),對(duì)結(jié)果緩沖區(qū)的修改將不會(huì)被廣播到文件并且也不會(huì)對(duì)其他映射了相同文件的程序可見(jiàn)。取而代之的是,它將導(dǎo)致被修改部分緩沖區(qū)獨(dú)自拷貝一份到用戶空間。這便是OS的“copy on write”原則。
如果操作系統(tǒng)底層支持的話transferTo、transferFrom也會(huì)使用相關(guān)的零拷貝技術(shù)來(lái)實(shí)現(xiàn)數(shù)據(jù)的傳輸。所以,這里是否使用零拷貝必須依賴于底層的系統(tǒng)實(shí)現(xiàn)。
關(guān)于linux的機(jī)制的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技公司主營(yíng):網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、小程序制作、成都軟件開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)、微信開(kāi)發(fā)、成都小程序開(kāi)發(fā)、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)等業(yè)務(wù),是專業(yè)的成都做小程序公司、成都網(wǎng)站建設(shè)公司、成都做網(wǎng)站的公司。創(chuàng)新互聯(lián)公司集小程序制作創(chuàng)意,網(wǎng)站制作策劃,畫(huà)冊(cè)、網(wǎng)頁(yè)、VI設(shè)計(jì),網(wǎng)站、軟件、微信、小程序開(kāi)發(fā)于一體。
新聞名稱:了解Linux的機(jī)制,更好地掌握系統(tǒng)運(yùn)作(linux的機(jī)制)
網(wǎng)頁(yè)URL:http://fisionsoft.com.cn/article/cojogih.html


咨詢
建站咨詢
