999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Linux中多種IO機制及應(yīng)用探究

2024-06-13 00:00:00汪敏
無線互聯(lián)科技 2024年9期

摘要:Linux操作系統(tǒng)在軟件工程中的應(yīng)用比較廣泛,各種商業(yè)發(fā)行版本廣泛地存在于PC桌面、后端服務(wù)器和個人移動終端中。而Linux中數(shù)據(jù)輸入輸出的效率直接決定了操作系統(tǒng)的應(yīng)用執(zhí)行效率。就硬件的讀寫速度來看,CPU的數(shù)據(jù)處理速度遠大于磁盤IO的數(shù)據(jù)處理速度。因此在Linux中,IO性能的優(yōu)化一直是Linux效率優(yōu)化的重點。在Linux操作系統(tǒng)中一共存在非阻塞、阻塞、多路復(fù)用、信號驅(qū)動和異步5種IO模型。這5種IO模型優(yōu)缺點各不相同,分別對應(yīng)著不同的應(yīng)用場景。

關(guān)鍵詞:Linux操作系統(tǒng);IO模型;多路復(fù)用;信號驅(qū)動

中圖分類號:TP31

文獻標(biāo)志碼:A

0 引言

Linux是一種應(yīng)用廣泛、執(zhí)行高效的操作系統(tǒng)。要成為一種高效的操作系統(tǒng)就必須包含一整套完備的文件IO模型。Linux為了操作系統(tǒng)的整體運行安全,劃分了用戶空間和內(nèi)核空間。當(dāng)發(fā)生IO操作的時候,就會經(jīng)歷用戶空間的數(shù)據(jù)等待和內(nèi)核空間的數(shù)據(jù)拷貝2個階段,而IO數(shù)據(jù)處理就發(fā)生在這2個階段。在編寫高性能用戶應(yīng)用的時候需要重點考慮不同IO模型的選擇。

1 網(wǎng)絡(luò)IO過程簡介

Linux中的5種IO模型一般應(yīng)用在2個方面,一方面是文件IO,另一方面是網(wǎng)絡(luò)IO。在Linux中一切均是文件,所以文件IO和網(wǎng)絡(luò)IO本質(zhì)上是一樣的。下面主要以網(wǎng)絡(luò)IO為例,描述一次完整的網(wǎng)絡(luò)IO的基本過程。

首先,需要2臺計算機通過TCP/IP協(xié)議建立網(wǎng)絡(luò)連接,在成功建立連接之后,客戶端主機向目標(biāo)服務(wù)器發(fā)送網(wǎng)絡(luò)請求。然后,服務(wù)器端DMA芯片在內(nèi)核程序的操控下將磁盤中的數(shù)據(jù)拷貝到內(nèi)存。CPU擅長數(shù)據(jù)處理,所以這一過程由DMA替代CPU完成數(shù)據(jù)拷貝的任務(wù),這個步驟決定了網(wǎng)絡(luò)IO是否阻塞。最后,由內(nèi)核空間和用戶空間通過mmap完成同一塊物理內(nèi)存的映射,從而完成數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶空間的過程。由用戶空間的Web服務(wù)進程完成客戶端網(wǎng)絡(luò)請求的響應(yīng),這一步主要決定了IO是否同步。

Linux IO模型是一種針對數(shù)據(jù)讀寫過程的優(yōu)化方案。套接字是一個典型的系統(tǒng)調(diào)用接口,它的通信效率直接影響了用戶空間應(yīng)用程序的執(zhí)行效率。不同的IO模型為用戶空間進程提供了不同的優(yōu)化策略,例如非阻塞IO模型會通過輪詢的過程來完成數(shù)據(jù)的傳輸;當(dāng)數(shù)據(jù)還沒有準(zhǔn)備好的時候,阻塞IO模型會阻塞用戶空間進程;IO復(fù)用模型提供了用戶空間進程同時處理多個套接字的方式;異步IO模型通過注冊回調(diào)函數(shù)來提醒用戶空間進程數(shù)據(jù)傳輸?shù)耐瓿?sup>[3;信號驅(qū)動IO模型通過信號來提醒用戶空間進程當(dāng)前數(shù)據(jù)傳輸?shù)耐瓿?sup>[4

2 同步阻塞IO

同步阻塞IO模型是一種簡單、實用的IO模型。在這種模型中,如果內(nèi)核空間緩沖區(qū)中沒有具體的數(shù)據(jù),那么read函數(shù)就會一直阻塞下去。在阻塞的這段時間內(nèi)用戶空間將無法進行其他操作。由于用戶空間進程一直占用CPU時間片,所以阻塞IO會導(dǎo)致應(yīng)用程序的可伸縮性受到影響。阻塞IO通常適用于串行、單線程以及同步的場景,例如文件傳輸程序、打印機程序等。雖然阻塞程序在這些場景中比較實用,但是在大規(guī)模、高并發(fā)的場景下,阻塞IO的性能會受到較大的影響。

在Linux操作系統(tǒng)中,所有socket函數(shù)都是默認阻塞的,同時listen()、send()、recv()函數(shù)也都是阻塞型IO函數(shù),使用這些接口可以很方便地構(gòu)建客戶機-服務(wù)器模型。這些接口在網(wǎng)絡(luò)編程的時候會帶來一個問題,就是在執(zhí)行函數(shù)的時候,線程將無法執(zhí)行其他運算和網(wǎng)絡(luò)請求。通常可以通過多線程或者是多進程的方式來改進這種模型,這樣任何一個阻塞的連接都不會影響其他的連接。使用進程還是線程需要根據(jù)具體的情況來看,如果需要為多個客戶機提供服務(wù),則推薦使用pthread_create ()創(chuàng)建多線程;如果單個任務(wù)體消耗資源過多或者需要進行大規(guī)模、長時間的數(shù)據(jù)運算,則推薦使用fork()創(chuàng)建多進程。

3 同步非阻塞IO

非阻塞IO是一種不會被阻塞同時會等待結(jié)果返回的IO模型,這種非阻塞IO會查詢內(nèi)核緩沖區(qū)中數(shù)據(jù)是否準(zhǔn)備好,內(nèi)核會立即給予反饋。如果數(shù)據(jù)尚未準(zhǔn)備好,則非阻塞IO將進行輪詢,重復(fù)步驟直到內(nèi)核緩沖區(qū)中的數(shù)據(jù)準(zhǔn)備好為止。非阻塞IO還可以通過事件驅(qū)動的方式來實現(xiàn)數(shù)據(jù)IO操作,通過提前注冊事件回調(diào)函數(shù),當(dāng)IO操作完成的時候,回調(diào)函數(shù)將會被調(diào)用,從而實現(xiàn)非阻塞IO的數(shù)據(jù)提取過程。在使用非阻塞IO的過程中需要特別關(guān)注競爭條件和線程安全問題,來保障非阻塞IO程序的穩(wěn)定性和準(zhǔn)確性。

相較于阻塞接口,非阻塞接口在被函數(shù)調(diào)用之后,會立即返回結(jié)果。線程通過循環(huán)調(diào)用非阻塞接口,可以實現(xiàn)所有關(guān)注的連接數(shù)據(jù)的接收過程。但是這樣的工作過程不建議在實際開發(fā)中使用,因為非阻塞接口的調(diào)用過程將顯著地提高CPU的占用率。推薦使用select()多路復(fù)用的模式來替代輪詢的過程,可以同時檢測多個連接的活躍性。

4 IO多路復(fù)用

相較于NIO,多路復(fù)用IO會在內(nèi)核空間中進行多個socket文件句柄的輪詢工作[5。多路復(fù)用IO將輪詢所有socket的工作交給內(nèi)核來完成,可以大大減少內(nèi)核態(tài)和用戶態(tài)之間切換的次數(shù)。當(dāng)某些socket有數(shù)據(jù)到達時,內(nèi)核會返回socket文件句柄給用戶空間進程,此時內(nèi)核會把數(shù)據(jù)拷貝到用戶空間,進程就可以直接讀取數(shù)據(jù)了。

在執(zhí)行相關(guān)的系統(tǒng)調(diào)用函數(shù)之后,多路復(fù)用IO就處于阻塞狀態(tài),所以多路復(fù)用IO本質(zhì)上還是同步阻塞IO,只不過將輪詢的過程放入內(nèi)核中來實現(xiàn),大大提高了IO的處理速度,進而也減少了系統(tǒng)切換的開銷。同時,多路復(fù)用IO可以做到僅使用一個線程就可以處理多個socket的IO請求,相較于BIO更節(jié)省系統(tǒng)資源。多路復(fù)用一般有select、epoll和poll 3種實現(xiàn)方法。其主要區(qū)別在套接字文件句柄的獲取方式上。

5 信號驅(qū)動式IO

信號驅(qū)動IO本質(zhì)上是一種多路復(fù)用IO技術(shù),通過指定一個事件和描述符,目標(biāo)進程可以使用sigaction注冊一個信號處理函數(shù),該函數(shù)會在IO處于就緒態(tài)的時候被內(nèi)核調(diào)用。當(dāng)內(nèi)核檢測到描述符上發(fā)生的指定事件的時候,會向用戶空間進程發(fā)送特定的信號。最終,用戶空間進程就可以通過捕捉指定的信號來執(zhí)行相應(yīng)的操作,實現(xiàn)相關(guān)的異步IO過程。

信號驅(qū)動IO有很多優(yōu)點,其中最重要的一個優(yōu)點是可以在處理多個描述符的時候避免阻塞目標(biāo)進程,從而提高應(yīng)用程序的響應(yīng)和并發(fā)能力,避免輪詢機制帶來的巨大系統(tǒng)開銷。同時信號驅(qū)動IO也帶來了一些缺點,在Linux操作系統(tǒng)中,信號的捕獲、解析、處理都需要一定的時間,所以信號驅(qū)動IO一般情況下不太適合高速的IO數(shù)據(jù)處理過程。而且Linux操作系統(tǒng)中信號也不太可靠,意味著信號在傳輸過程中容易丟失。最關(guān)鍵的一點是在信號驅(qū)動IO編程模型中,需要特別注意競爭條件和死鎖問題,這就需要較高的編程技巧去處理問題。

6 異步IO模型

異步IO模型是一種不同于同步IO的數(shù)據(jù)處理模型[6-7。在等待IO處理完成的時候,異步IO模型允許進程執(zhí)行其他任務(wù)而不必阻塞等待IO完成。操作系統(tǒng)提供相應(yīng)的通知機制來配合IO操作,完成異步處理的過程。異步IO一般分為3個主要過程。首先由應(yīng)用程序發(fā)起異步IO的請求,其中包含數(shù)據(jù)長度、緩沖區(qū)的地址和相關(guān)的描述符參數(shù)。發(fā)起異步請求之后,應(yīng)用程序仍然可以執(zhí)行其他任務(wù)。其次內(nèi)核將異步IO請求放入IO隊列,并將請求的數(shù)據(jù)保存到內(nèi)核空間。最后在IO操作完成后,內(nèi)核發(fā)送通知,應(yīng)用程序處理相關(guān)IO數(shù)據(jù)。在Linux操作系統(tǒng)中,通知機制一般采用事件通知、信號或回調(diào)函數(shù)的方式。

從本質(zhì)上看,非阻塞IO和異步IO都是阻塞的。在應(yīng)用程序等待IO處理數(shù)據(jù)的時候,它們都可以執(zhí)行其他相關(guān)任務(wù),但它們的區(qū)別主要集中在以下3個方面。從編程模型上看,非阻塞IO需要由用戶主動編寫輪詢方案來查看數(shù)據(jù)的IO準(zhǔn)備過程;異步IO一般使用回調(diào)函數(shù)來處理IO事件。從實現(xiàn)接口上看,非阻塞IO一般將相關(guān)的系統(tǒng)調(diào)用設(shè)置為非阻塞模式[8-10,設(shè)置之后可以立刻得到IO操作的返回值;異步IO一般使用Linux操作系統(tǒng)提供的aio_write()和aio_read()等系統(tǒng)調(diào)用,同時應(yīng)用程序在發(fā)起系統(tǒng)調(diào)用之后立刻返回。從實現(xiàn)方式上看,非阻塞IO通過應(yīng)用程序發(fā)起IO請求,通過輪詢的方式來查看IO請求是否已經(jīng)完成;異步IO主要通過Linux內(nèi)核處理相關(guān)的IO請求,使用Linux的通知機制完成IO數(shù)據(jù)處理的結(jié)果發(fā)送過程。

7 網(wǎng)絡(luò)IO中數(shù)據(jù)的詳細接收流程

上文詳細描述了5種網(wǎng)絡(luò)IO模型的主要工作流程。如圖1所示,顯示了在網(wǎng)絡(luò)IO中網(wǎng)絡(luò)數(shù)據(jù)的接收過程。當(dāng)計算機網(wǎng)卡收到網(wǎng)絡(luò)數(shù)據(jù)幀時,網(wǎng)絡(luò)數(shù)據(jù)幀會通過DMA直接放入RingBuffer。RingBuffer的主要作用是用來存儲網(wǎng)絡(luò)數(shù)據(jù)幀,當(dāng)RingBuffer中的數(shù)據(jù)存滿,通過網(wǎng)卡收到的新數(shù)據(jù)幀將會被丟棄。DMA操作完成之后,CPU會收到網(wǎng)卡發(fā)出的一個硬中斷,然后調(diào)用硬中斷響應(yīng)驅(qū)動程序。內(nèi)核數(shù)據(jù)結(jié)構(gòu)sk_buffer將被硬中斷響應(yīng)驅(qū)動程序創(chuàng)建,同時網(wǎng)絡(luò)數(shù)據(jù)幀也會被拷貝到sk_buffer數(shù)據(jù)結(jié)構(gòu)中。網(wǎng)卡中斷程序?qū)l(fā)起軟中斷請求,通知內(nèi)核有新的網(wǎng)絡(luò)數(shù)據(jù)幀到達。ksoftirqd線程收到軟中斷請求后,將調(diào)用poll函數(shù)。poll函數(shù)將網(wǎng)絡(luò)數(shù)據(jù)包送到ip_rcv函數(shù)中,從而完成軟中斷的響應(yīng)過程。數(shù)據(jù)包到達網(wǎng)絡(luò)層之后,將被去除IP頭,如果此時數(shù)據(jù)包是發(fā)送給本機的,就會去除TCP或UDP協(xié)議類型;如果用的是TCP協(xié)議,數(shù)據(jù)包會被tcp_rcv函數(shù)進行處理,在函數(shù)tcp_rcv中去除TCP的頭部。在查找到對應(yīng)的socket后,網(wǎng)絡(luò)數(shù)據(jù)包中的數(shù)據(jù)會被拷貝到socket的接收緩沖區(qū)中。從應(yīng)用層的角度來看,當(dāng)使用read系統(tǒng)調(diào)用來讀取socket接收緩沖區(qū)中的數(shù)據(jù)的時候,如果發(fā)現(xiàn)沒有數(shù)據(jù),那么用戶空間的應(yīng)用程序就會被阻塞。當(dāng)接收緩沖區(qū)中出現(xiàn)數(shù)據(jù)的時候,內(nèi)核會將接收緩沖區(qū)的數(shù)據(jù)拷貝到用戶空間,最終應(yīng)用程序就會讀取到數(shù)據(jù)。

8 結(jié)語

非阻塞IO在讀取數(shù)據(jù)的時候雖然不需要阻塞等待數(shù)據(jù),但是為了查詢數(shù)據(jù)的到達狀態(tài),仍然需要執(zhí)行低效率的輪詢操作。阻塞IO在實現(xiàn)性能上表現(xiàn)不夠好,但是在編程實現(xiàn)上比較簡單。對于時效性要求比較高的IO操作,信號IO不太適用,原因是信號IO在信號準(zhǔn)備、發(fā)送和處理上需要一定的時間。但是信號IO編程模型比較簡單易懂。Linux操作系統(tǒng)提供了多種方式的多路復(fù)用IO實現(xiàn),分別是select、epoll和poll。其中poll和select均采用輪詢方式,這2種方式不能夠監(jiān)聽太多數(shù)量的文件描述符,使用上有限制;epoll由于使用了紅黑樹,對文件描述的增、刪、改的效率比較高,同時epoll采用了觸發(fā)機制來實現(xiàn)對IO的反饋,具有較高的執(zhí)行效率。Linux操作系統(tǒng)還提供了異步IO方式,與同步IO不同的是異步IO的編程模型更加復(fù)雜,且需要Linux操作系統(tǒng)的通知機制來完成IO事件的處理過程。在異步IO編程過程中需要特別注意死鎖問題和競爭條件的設(shè)置問題。

參考文獻

[1]趙夢茹.移動終端Linux存儲IO性能分析與優(yōu)化[D].西安:西安電子科技大學(xué),2014.

[2]段鍇,李永進,郝鵬,等.基于System V消息隊列的I/O多路復(fù)用方法[J].數(shù)字技術(shù)與應(yīng)用,2023(10):40-42.

[3]劉露.基于異步I/O的緩存框架研究與實現(xiàn)[D].綿陽:西南科技大學(xué),2023.

[4]賀慶.Linux實時信號驅(qū)動I/O的改進[D].成都:電子科技大學(xué),2005.

[5]溫冰.HP-UNIX下IO多路復(fù)用網(wǎng)絡(luò)服務(wù)器的設(shè)計方案[J].計算機光盤軟件與應(yīng)用,2014(15):139,141.

[6]劉華鎣,劉華煜,聶永丹.LINUX2.5下的異步I/O在FTP服務(wù)器上的應(yīng)用[J].大慶石油學(xué)院學(xué)報,2005(1):72-74,124.

[7]黃可杰,馬莉.Linux環(huán)境下I/O重定向與異步通信的實現(xiàn)[J].計算機應(yīng)用與軟件,2011(3):57-60.

[8]許會元,何利力.NodeJS的異步非阻塞I/O研究[J].工業(yè)控制計算機,2015(3):127-129.

[9]趙思遠.Java NIO與IO性能對比分析[J].軟件導(dǎo)刊,2021(4):214-219.

[10]蔡宇昂.分布式文件系統(tǒng)I/O擁塞控制研究[J].綠色科技,2018(24):184-186.

(編輯 沈 強)

Exploration of multiple IO mechanisms and applications in Linux

Wang" Min

(Management Office of Song Qingling Cemetery, Honorary President of the People’s Republic of China, Shanghai 200237, China)

Abstract: The application of Linux operating system in software engineering is relatively rich, and various commercial distribution versions of Linux are widely present in PC desktops, backend servers, and personal mobile terminals. The efficiency of data input and output in Linux directly determines the application execution efficiency of the operating system. In terms of hardware read and write speed, the data processing speed of the CPU is much faster than the data processing speed of the disk IO. Therefore, in Linux, optimizing IO performance has always been the focus of Linux efficiency optimization. There are five IO models in the Linux operating system: non blocking, blocking, multiplexing , signal driven, and asynchronous. These five IO models have different advantages and disadvantages, corresponding to different application scenarios.

Key words:Linux operating system; IO model; multiplexing; signal driven

主站蜘蛛池模板: 青青国产视频| 久久综合九九亚洲一区| 91色国产在线| 亚洲伊人电影| 色老头综合网| 久久一日本道色综合久久| 99热这里只有精品久久免费| 2021天堂在线亚洲精品专区| 亚洲第一视频网站| 亚洲一区二区三区香蕉| 色妞永久免费视频| 91蝌蚪视频在线观看| 香蕉eeww99国产在线观看| 试看120秒男女啪啪免费| 亚洲av无码牛牛影视在线二区| 免费观看无遮挡www的小视频| 国产精品无码翘臀在线看纯欲| 91在线无码精品秘九色APP | 久久综合丝袜日本网| 国产一二三区在线| 亚洲中文字幕在线观看| 在线观看国产小视频| 国产最新无码专区在线| 国内精自线i品一区202| 毛片手机在线看| 亚洲成人黄色在线观看| 亚洲精品波多野结衣| 中国特黄美女一级视频| 精品无码专区亚洲| 日韩视频精品在线| 欧美精品亚洲二区| www.91中文字幕| 精品国产www| 免费无码又爽又黄又刺激网站| 色亚洲成人| 中文字幕欧美日韩高清| 国产亚洲欧美在线专区| 国产好痛疼轻点好爽的视频| 久久福利片| 久久国产拍爱| 日韩视频福利| 玖玖免费视频在线观看| 国产在线无码一区二区三区| 亚洲区视频在线观看| 欧美啪啪精品| 凹凸精品免费精品视频| 国产高潮流白浆视频| 亚洲色无码专线精品观看| 欧美黄网站免费观看| 日韩乱码免费一区二区三区| www.精品国产| 免费国产无遮挡又黄又爽| 国产AV无码专区亚洲A∨毛片| 日韩人妻少妇一区二区| 亚洲视频无码| 欧美日本视频在线观看| 欧美三级日韩三级| 国产网站免费观看| 男女性午夜福利网站| 漂亮人妻被中出中文字幕久久| 国产免费a级片| 四虎永久免费地址| 免费女人18毛片a级毛片视频| 任我操在线视频| 国产第三区| 一区二区午夜| 国产日本欧美在线观看| 免费A级毛片无码无遮挡| 中文字幕久久波多野结衣| 在线免费亚洲无码视频| 在线播放精品一区二区啪视频| 国产高清无码麻豆精品| 色哟哟国产精品| 久久精品国产电影| 欧洲熟妇精品视频| 色哟哟国产精品| 亚洲成人在线免费观看| 久久无码av一区二区三区| 成年人免费国产视频| 玖玖免费视频在线观看| 欧美亚洲激情| 久久免费观看视频|