新聞中心
Linux是一種廣泛使用的操作系統(tǒng),被許多公司和組織用于運(yùn)行服務(wù)器和Web應(yīng)用程序。然而,就像所有操作系統(tǒng)一樣,Linux也存在安全漏洞,其中之一就是文件描述符泄漏問(wèn)題。在本文中,我們將了解文件描述符泄漏問(wèn)題的原因,并提供一些解決方案,以幫助Linux用戶保護(hù)他們的系統(tǒng)免遭攻擊。

為觀山湖等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及觀山湖網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、觀山湖網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
什么是文件描述符?
在Linux中,文件描述符是內(nèi)核給每個(gè)進(jìn)程分配的一種正整數(shù),用于識(shí)別和訪問(wèn)文件和設(shè)備。文件描述符在操作系統(tǒng)中起著非常重要的作用,因?yàn)樗鼈冊(cè)试S進(jìn)程與外部系統(tǒng)進(jìn)行通信。例如,當(dāng)您在Web瀏覽器中訪問(wèn)網(wǎng)站時(shí),瀏覽器將打開一個(gè)文件描述符,以便通過(guò)網(wǎng)絡(luò)訪問(wèn)服務(wù)器上的內(nèi)容。
文件描述符泄漏問(wèn)題是什么?
文件描述符泄漏指的是當(dāng)進(jìn)程打開一個(gè)文件描述符但不關(guān)閉它時(shí)發(fā)生的情況。如果發(fā)生泄漏,該進(jìn)程將會(huì)占用系統(tǒng)資源,直至作系統(tǒng)或其他程序強(qiáng)制關(guān)閉。如果這種情況一直持續(xù)下去,系統(tǒng)將變得越來(lái)越慢,最終可能導(dǎo)致崩潰或系統(tǒng)癱瘓。
為什么文件描述符泄漏很危險(xiǎn)?
除了導(dǎo)致系統(tǒng)崩潰或癱瘓外,文件描述符泄漏問(wèn)題還會(huì)出現(xiàn)安全隱患。攻擊者可以利用文件描述符泄漏漏洞來(lái)獲得系統(tǒng)權(quán)限,這可能會(huì)使其能夠訪問(wèn)敏感信息或執(zhí)行惡意軟件。因此,及早識(shí)別和解決文件描述符泄漏問(wèn)題非常重要。
如何檢測(cè)文件描述符泄漏?
要檢測(cè)文件描述符泄漏,您可以使用各種工具,例如lsof、procfs、strace等。以下是一些檢測(cè)文件描述符泄漏的命令:
$ lsof | grep deleted
此命令將顯示所有已刪除的文件,這些文件可能是由于文件描述符泄漏而沒有被關(guān)閉的。
$ sudo ls -l /proc/[PID]/fd
此命令將顯示進(jìn)程[PID]的所有打開的文件描述符。如果該列表非常長(zhǎng)而且包含大量未關(guān)閉的文件,則可能存在文件描述符泄漏。
$ strace -p [PID]
此命令將顯示進(jìn)程[PID]的所有系統(tǒng)調(diào)用和庫(kù)函數(shù)調(diào)用。您可以使用此命令來(lái)查看進(jìn)程的打開和關(guān)閉文件描述符的情況。
如何解決文件描述符泄漏問(wèn)題?
以下是解決文件描述符泄漏問(wèn)題的一些更佳實(shí)踐:
1. 關(guān)閉不必要的文件描述符
打開文件描述符是一項(xiàng)資源密集型操作。因此,應(yīng)盡可能少地打開文件描述符,同時(shí)及時(shí)關(guān)閉不再需要的文件描述符。例如,如果在 Web 應(yīng)用程序中讀取文件,則必須在讀取完成后關(guān)閉該文件。
2. 使用文件描述符限制
Linux內(nèi)核中有一些參數(shù)可以用來(lái)限制每個(gè)進(jìn)程所能打開的文件描述符數(shù)量。您可以通過(guò)增加文件描述符限制來(lái)提高系統(tǒng)的安全性和可靠性。以下是一些常見的文件描述符限制參數(shù):
nofile:限制進(jìn)程使用文件描述符的更大數(shù)目。
nproc:限制單個(gè)用戶可以創(chuàng)建的更大進(jìn)程數(shù)。
3. 使用自動(dòng)垃圾收集器
自動(dòng)垃圾收集器(Automatic Garbage Collection,AGC)是一種內(nèi)存管理技術(shù),能夠在運(yùn)行時(shí)自動(dòng)檢測(cè)和釋放不再使用的對(duì)象。例如,如果您的Web應(yīng)用程序使用Java編寫,那么您可以使用Java虛擬機(jī)(JVM)中內(nèi)置的垃圾收集器來(lái)避免文件描述符泄漏問(wèn)題。
結(jié)論
文件描述符泄漏是Linux操作系統(tǒng)中的一個(gè)安全隱患,可能會(huì)使攻擊者獲得系統(tǒng)權(quán)限或?qū)е孪到y(tǒng)崩潰或癱瘓。通過(guò)正確設(shè)置文件描述符的限制、使用自動(dòng)垃圾收集器和關(guān)閉不必要的文件描述符等更佳實(shí)踐,可以有效地減少文件描述符泄漏的風(fēng)險(xiǎn)。同時(shí),及早識(shí)別和解決文件描述符泄漏問(wèn)題也是確保Linux系統(tǒng)安全和穩(wěn)定運(yùn)行的關(guān)鍵。
相關(guān)問(wèn)題拓展閱讀:
- [轉(zhuǎn)]淺談Linux下的零拷貝機(jī)制
- linux 請(qǐng)問(wèn)串口操作write(fd,buffer,bufflen);連續(xù)發(fā)送幾千次后就無(wú)法再向外發(fā)送數(shù)據(jù)【但是可以讀數(shù)據(jù)】
[轉(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(寫時(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非常常見的應(yīng)用場(chǎng)景:將系統(tǒng)中的文件發(fā)送到遠(yuǎn)端(該流程涉及:磁盤上文件 ——> 內(nèi)存(字節(jié)數(shù)組) ——> 傳輸給用戶/網(wǎng)絡(luò))來(lái)詳細(xì)展開傳統(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ù)從磁盤上讀取到內(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ù)拈_始。它只是意味著將我們要發(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ù)從磁盤讀取到內(nèi)核空間緩沖區(qū),然后再將數(shù)據(jù)從內(nèi)核空間緩沖區(qū)拷貝到用戶空間緩沖區(qū)了?為什么不直接將數(shù)據(jù)從磁盤讀取到用戶空間緩沖區(qū)就好?
A:
傳統(tǒng)I/O模式之所以將數(shù)據(jù)從磁盤讀取到內(nèi)核空間緩沖區(qū)而不是直接讀取到用戶空間緩沖區(qū),是為了減少磁盤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)行一次低效的磁盤I/O操作(注意:磁盤I/O操作的速度比直接訪問(wèn)內(nèi)存慢了好幾個(gè)數(shù)量級(jí))。
Q:
既然系統(tǒng)內(nèi)核緩沖區(qū)能夠減少磁盤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ū)的一大用處是為了減少磁盤I/O操作,因?yàn)樗鼤?huì)從磁盤中預(yù)讀更多的數(shù)據(jù)到緩沖區(qū)中。而BufferedInputStream的用處是減少“系統(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ù)傳輸并沒有類似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引擎將磁盤文件中的內(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版本開始,操作系統(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版本開始,操作系統(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引擎將磁盤文件中的內(nèi)容拷貝到內(nèi)核空間緩沖區(qū)中(之一次拷貝: hard drive ——> kernel buffer)。
② 沒有數(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版本開始,out_fd可以是任意類型文件描述符。所以從linux2.6.33版本開始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引擎將磁盤文件中的內(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)存從磁盤讀取到內(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)存的修改寫入到文件當(dāng)中。我們的應(yīng)用程序只需要處理內(nèi)存的數(shù)據(jù),這樣可以實(shí)現(xiàn)非常迅速的I/O操作。
只讀模式來(lái)說(shuō),如果程序試圖進(jìn)行寫操作,則會(huì)拋出ReadOnlyBufferException異常
讀寫模式表明,對(duì)結(jié)果對(duì)緩沖區(qū)所做的修改將最終廣播到文件。但這個(gè)修改可能會(huì)也可能不會(huì)被其他映射了相同文件程序可見。
私有模式來(lái)說(shuō),對(duì)結(jié)果緩沖區(qū)的修改將不會(huì)被廣播到文件并且也不會(huì)對(duì)其他映射了相同文件的程序可見。取而代之的是,它將導(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)。
linux 請(qǐng)問(wèn)串口操作write(fd,buffer,bufflen);連續(xù)發(fā)送幾千次后就無(wú)法再向外發(fā)送數(shù)據(jù)【但是可以讀數(shù)據(jù)】
更好掘答有代碼,這樣分析抓不準(zhǔn),可能原因:
緩沖區(qū)問(wèn)題,不過(guò)串口緩沖應(yīng)該逗畢支持不了幾千次
字符串問(wèn)題,類似申請(qǐng)了內(nèi)存沒釋放,或者產(chǎn)生了越界或者亂碼之類的
讀取正常,說(shuō)明串口本身沒問(wèn)題,除了判指慧程序本身,那么還可能是接收端處理的問(wèn)題
還有這種事?
關(guān)于linux fd 泄漏的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站營(yíng)銷推廣找創(chuàng)新互聯(lián),全國(guó)分站站群網(wǎng)站搭建更好做SEO營(yíng)銷。
創(chuàng)新互聯(lián)(www.cdcxhl.com)四川成都IDC基礎(chǔ)服務(wù)商,價(jià)格厚道。提供成都服務(wù)器托管租用、綿陽(yáng)服務(wù)器租用托管、重慶服務(wù)器托管租用、貴陽(yáng)服務(wù)器機(jī)房服務(wù)器托管租用。
當(dāng)前題目:避免被攻擊:如何解決Linux文件描述符泄漏問(wèn)題? (linux fd 泄漏)
文章路徑:http://www.5511xx.com/article/coegccj.html


咨詢
建站咨詢
