操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    一、零拷貝的由來和定義

    1. 基本概念

    內(nèi)核態(tài):Ring0級別,運行在內(nèi)核空間中,可以執(zhí)行任何操作并且在資源的使用上沒有限制。

    用戶態(tài):Ring3級別,運行在用戶空間中,訪問資源受限。

    內(nèi)核緩沖區(qū):Page Cache,在操作系統(tǒng)級別,提高磁盤IO效率,優(yōu)化磁盤文件的讀寫操作。

    讀文件:

    time cat rocket.log >/dev/null

    執(zhí)行時間:

    real        0m9.797s
    user        0m0.085s
    sys         0m2.546s
    

    查看緩存情況 vmtouch rocket.log :

    Files: 1 
    Directories: 0 
    Resident Pages: 240561/240561  939M/939M  100% 
    Elapsed: 0.020697 seconds 
    

    再次執(zhí)行cat:

    real        0m0.138s 
    user        0m0.009s 
    sys         0m0.130s 
    

    寫文件:

    將更改數(shù)據(jù)寫入到PageCache,并標(biāo)記為dirty,隨后操作系統(tǒng)負責(zé)將數(shù)據(jù)刷新到磁盤中。 回寫機制包括: write back和write through。

    異步刷盤:
    dd if=/dev/zero of=async_write.txt bs=64M count=16 iflag=fullblock 
        記錄了16+0 的讀入
        記錄了16+0 的寫出
        1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.903126 s, 1.2 GB/s
        
    同步:
    dd if=/dev/zero of=sync_write.txt bs=64M count=16 iflag=fullblock oflag=sync
        記錄了16+0 的讀入
        記錄了16+0 的寫出
        1073741824 bytes (1.1 GB, 1.0 GiB) copied, 8.959 s, 120 MB/s
    

    用戶緩沖區(qū):目的是為了減少系統(tǒng)調(diào)用次數(shù),從而降低操作系統(tǒng)在用戶態(tài)與核心態(tài)切換所耗費的時間。在讀取文件時,會先申請一塊內(nèi)存數(shù)組buffer,然后每次調(diào)用read,讀取一定字節(jié)長度的數(shù)據(jù),寫入buffer。

    Socket緩沖區(qū):Socket輸入緩沖區(qū)和輸出緩沖區(qū)。

    2. IO傳輸過程

    在 Linux 系統(tǒng)中,標(biāo)準(zhǔn)的文件讀寫方式是通過 write() 和 read() 兩個系統(tǒng)調(diào)用函數(shù)實現(xiàn)的,通過 read() 函數(shù)讀取文件到到緩沖區(qū)中,然后通過 write() 方法把緩存中的數(shù)據(jù)輸出到網(wǎng)絡(luò)端口

    int read (int fd,void*buff,int size);
    int write ( int fd,void *buff ,int datalen);
    

    Step1:read 系統(tǒng)調(diào)用會觸發(fā)從用戶態(tài)到內(nèi)核態(tài)的上下文切換,隨后如果PageCache沒有緩存數(shù)據(jù), 就執(zhí)行磁盤文件數(shù)據(jù)拷貝過程。

    1. 由 CPU 通過設(shè)備驅(qū)動程序向設(shè)備寄存器寫入一個通知信號,告知設(shè)備控制器要讀取數(shù)據(jù);
    2. 設(shè)備控制器啟動磁盤讀取的過程,把數(shù)據(jù)從磁盤拷貝到磁盤緩沖區(qū)里;
    3. 完成后,磁盤控制器通過中斷控制器發(fā)出IO中斷信號;
    4. CPU收到信號后,停止當(dāng)前工作,保護當(dāng)前上下文,然后從地址總線取出設(shè)備編號,通過編號找到中斷向量所包含的中斷服務(wù)的入口地址,壓入 PC 寄存器,開始運行磁盤中斷服務(wù),把數(shù)據(jù)從磁盤控制器的緩沖區(qū)拷貝到內(nèi)核緩沖區(qū);

    Step2: CPU將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶緩沖區(qū),read系統(tǒng)調(diào)用返回,并完成從內(nèi)核態(tài)到用戶態(tài)的上下文切換。

    Step3:執(zhí)行write調(diào)用,用戶態(tài)再次切換到內(nèi)核態(tài),CPU執(zhí)行從用戶緩沖區(qū)到Socket緩沖區(qū)的數(shù)據(jù)拷貝,隨后再將數(shù)據(jù)拷貝到網(wǎng)卡中,write調(diào)用返回。

    整個文件數(shù)據(jù)傳輸過程,CPU完成4次的數(shù)據(jù)拷貝,并存在多次的上下文切換。

    DMA優(yōu)化:

    DMA控制器,直接存儲器存取,是一種用來提供在外設(shè)和存儲器之間的高速數(shù)據(jù)傳輸。整個過程無須 CPU 參與,數(shù)據(jù)直接通過 DMA 控制器進行快速地移動拷貝,節(jié)省 CPU 的資源去做其他工作。

    工作流程:

    1、進程發(fā)起read調(diào)用,用戶態(tài)切換到內(nèi)核態(tài),CPU會將內(nèi)核緩沖區(qū)地址和磁盤地址寫入到DMA控制器的寄存器中;

    2、DMA控制器會通知磁盤控制器執(zhí)行磁盤讀取的流程,隨后會引導(dǎo)磁盤控制器將數(shù)據(jù)傳輸?shù)郊拇嫫髦械膬?nèi)核緩沖區(qū)的地址。執(zhí)行完成后會返回一個ack給DMA控制器;

    3、DMA收到ack信號后,會通過中斷控制器向CPU發(fā)送一個中斷信號;

    4、CPU收到信號后,會保護好當(dāng)前上下文,并執(zhí)行從內(nèi)核緩沖區(qū)到用戶緩沖區(qū)的數(shù)據(jù)拷貝,隨后切換到用戶態(tài)。

    5、進程發(fā)起write調(diào)用,上下文由用戶態(tài)切換到內(nèi)核態(tài),CPU執(zhí)行用戶空間到Socket緩沖區(qū)的拷貝。

    6、DMA控制器完成從Socket緩沖區(qū)到網(wǎng)卡的數(shù)據(jù)拷貝。

    7、write執(zhí)行完成,并切換回用戶態(tài)。

    通過引入DMA,使得在整個read/write調(diào)用過程中減少了兩次CPU拷貝過程,在我們外設(shè)和主存之間的數(shù)據(jù)拷貝不再需要CPU的參與。

    3. 傳統(tǒng)IO傳輸?shù)谋锥?/h1>

    雖然通過引入 DMA,已經(jīng)把 Linux 的 整個I/O 傳輸過程中的 CPU 拷貝次數(shù)從 4 次減少到了 2 次,但是仍然存在內(nèi)核緩沖區(qū)和用戶緩沖區(qū)之間的CPU 拷貝。同時系統(tǒng)調(diào)用引起的上下文切換在一定程度也影響了系統(tǒng)性能。特別是那些頻繁 I/O 的場景,頻繁的CPU 拷貝以及上下文切換都會降低整體性能。

    上下文切換的代價:

    • 保留用戶態(tài)現(xiàn)場(上下文、寄存器、用戶棧等)
    • 復(fù)制用戶態(tài)參數(shù),用戶棧切到內(nèi)核棧,進入內(nèi)核態(tài)
    • 額外的檢查(因為內(nèi)核代碼對用戶不信任)
    • 執(zhí)行內(nèi)核態(tài)代碼
    • 復(fù)制內(nèi)核態(tài)代碼執(zhí)行結(jié)果,回到用戶態(tài)
    • 恢復(fù)用戶態(tài)現(xiàn)場(上下文、寄存器、用戶棧等)

    為了降低、甚至是完全避免 CPU 拷貝,降低上下文切換的次數(shù),零拷貝技術(shù)應(yīng)運而生!

    4. 零拷貝的定義

    Wikipedia定義:

    "Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is frequently used to save CPU cycles and memory bandwidth when transmitting a file over a network.
    

    零拷貝技術(shù)主要是指當(dāng)計算機在執(zhí)行操作時,CPU并不需要將數(shù)據(jù)從某個內(nèi)存區(qū)域移動到另外一個區(qū)域,其能夠在進行網(wǎng)絡(luò)文件傳輸時節(jié)省CPU周期和內(nèi)存帶寬。

    零拷貝作用:

    • 減少或避免不必要的CPU數(shù)據(jù)拷貝,從而釋放CPU去執(zhí)行其他任務(wù)
    • 減少用戶態(tài)和內(nèi)核態(tài)的上下文切換
    • 減少內(nèi)存的占用

    二、零拷貝的分類

    在 Linux 中零拷貝技術(shù)主要有 3 個實現(xiàn)思路:繞過內(nèi)核緩沖區(qū)的直接 I/O、減少數(shù)據(jù)拷貝次數(shù)以及寫時復(fù)制技術(shù)。

    1、繞過內(nèi)核緩沖區(qū)的直接IO

    思想:直接繞過內(nèi)核緩沖區(qū),數(shù)據(jù)直接從用戶空間寫入到磁盤中。

    要在塊設(shè)備中執(zhí)行直接 I/O,進程必須在打開文件的時候設(shè)置對文件的訪問模式為 O_DIRECT,這樣就等于告訴操作系統(tǒng)進程在接下來使用 read() 或者 write() 系統(tǒng)調(diào)用去讀寫文件的時候使用的是直接 I/O 方式,所傳輸?shù)臄?shù)據(jù)均不經(jīng)過內(nèi)核緩沖區(qū)。

    int open(const char *pathname, int flags, mode_t mode);
    
     dd if=/dev/zero of=sync_write.txt bs=64M count=16 iflag=fullblock oflag=direct
      
    

    優(yōu)點:完全避免了內(nèi)核空間和用戶空間的數(shù)據(jù)拷貝,如果傳輸?shù)臄?shù)據(jù)量很大,可大大提高性能。

    缺點:如果數(shù)據(jù)不在應(yīng)用程序緩存中,每次都會直接從磁盤加載,導(dǎo)致異常緩慢。

    誰會使用直接IO?

    自緩存應(yīng)用程序

    對于某些應(yīng)用程序來說,它會有它自己的數(shù)據(jù)緩存機制,比如,它會將數(shù)據(jù)緩存在應(yīng)用程序地址空間,這類應(yīng)用程序完全不需要使用操作系統(tǒng)內(nèi)核中的高速緩沖存儲器,這類應(yīng)用程序就被稱作是自緩存應(yīng)用程序( self-caching applications )。

    例如,應(yīng)用內(nèi)部維護一個緩存空間,當(dāng)有讀操作時,首先讀取應(yīng)用層的緩存數(shù)據(jù),如果沒有,那么就通過 Direct I/O 直接通過磁盤 I/O 來讀取數(shù)據(jù)。緩存仍然在應(yīng)用,只不過應(yīng)用覺得自己實現(xiàn)一個緩存比操作系統(tǒng)的緩存更高效。

    實際應(yīng)用:自緩存應(yīng)用,數(shù)據(jù)庫,如Mysql。

    2、減少甚至避免用戶空間和內(nèi)核空間的數(shù)據(jù)拷貝

    1、mmap

    內(nèi)存映射,memory map,將一個進程的地址空間中的一段虛擬地址映射到磁盤文件地址。

    mmap的目的是將內(nèi)核緩沖區(qū)與用戶緩沖區(qū)進行映射,從而實現(xiàn)內(nèi)核緩沖區(qū)與應(yīng)用程序內(nèi)存的共享。大致的流程如下圖所示:

    1. 用戶進程系統(tǒng)調(diào)用 mmap(),從用戶態(tài)陷入內(nèi)核態(tài),將內(nèi)核緩沖區(qū)映射到用戶緩沖區(qū);
    2. DMA 控制器將數(shù)據(jù)從磁盤緩沖區(qū)拷貝到內(nèi)核緩沖區(qū);
    3. mmap() 返回,上下文從內(nèi)核態(tài)切換回用戶態(tài);
    4. 用戶進程調(diào)用 write(),再次陷入內(nèi)核態(tài);
    5. CPU 將內(nèi)核緩沖區(qū)中的數(shù)據(jù)拷貝到套接字緩沖區(qū);
    6. DMA 控制器將數(shù)據(jù)從套接字緩沖區(qū)拷貝到網(wǎng)卡完成數(shù)據(jù)傳輸;
    7. write() 返回,上下文從內(nèi)核態(tài)切換回用戶態(tài)。

    優(yōu)點: 相比于傳統(tǒng)的read_write系統(tǒng)調(diào)用,內(nèi)存映射機制不需要將內(nèi)核緩沖區(qū)數(shù)據(jù)拷貝到用戶緩沖區(qū),即少了一次CPU拷貝,節(jié)省內(nèi)存。

    Rocketmq在commitLog、ConsumeQueue等文件讀寫時使用了mmap+write的方式,主要通過MappedByteBuffer 對文件進行讀寫操作。其中,利用了 NIO 中的 FileChannel 模型將磁盤上的物理文件直接映射到用戶態(tài)的內(nèi)存地址中。

    MappedFile(負責(zé)將消息寫入Page Cache緩沖區(qū)中(commit方法),或者將消息刷入磁盤(flush)):

    MappedByteBuffer內(nèi)存映射機制有個限制,一次只能映射 1.5-2G 的文件至用戶態(tài)的虛擬內(nèi)存,故 RocketMQ 的文件存儲都使用定長結(jié)構(gòu)來存儲(單個 CommitLog 日志數(shù)據(jù)文件為 1G),方便一次將整個文件映射至內(nèi)存。

    mmap缺點:當(dāng)另一個進程截斷同一文件時,比如調(diào)用truncate,調(diào)用write,此時的write系統(tǒng)調(diào)用將被總線錯誤信號SIGBUS打斷,因為你執(zhí)行了一個錯誤的內(nèi)存訪問。該信號的默認行為是殺死進程并dumpcore。

    2、sendfile

    sendfile 系統(tǒng)調(diào)用在 Linux 內(nèi)核版本 2.1 中被引入,目的是簡化通過網(wǎng)絡(luò)在兩個通道之間進行的數(shù)據(jù)傳輸過程。sendfile 系統(tǒng)調(diào)用的引入,不僅減少了 CPU 拷貝的次數(shù),還減少了上下文切換的次數(shù),它的偽代碼如下:

    ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
    

    通過 sendfile 系統(tǒng)調(diào)用,數(shù)據(jù)可以直接在內(nèi)核空間內(nèi)部進行 I/O 傳輸,從而省去了數(shù)據(jù)在用戶空間和內(nèi)核空間之間的來回拷貝。與 mmap 內(nèi)存映射方式不同的是, sendfile 調(diào)用中 I/O 數(shù)據(jù)對用戶空間是完全不可見的。也就是說,這是一次完全意義上的數(shù)據(jù)傳輸過程。

    基于 sendfile(), 整個數(shù)據(jù)傳輸過程中共發(fā)生 2 次 DMA 拷貝和 1 次 CPU 拷貝,這個和 mmap() + write() 相同,但是因為 sendfile() 只是一次系統(tǒng)調(diào)用,因此比前者少了用戶態(tài)和內(nèi)核態(tài)的上下文切換開銷。

    優(yōu)點:減少了數(shù)據(jù)拷貝次數(shù)以及系統(tǒng)調(diào)用次數(shù)。

    缺點:不能對數(shù)據(jù)進行修改,只能是一次單純的數(shù)據(jù)傳輸過程,適合于靜態(tài)文件傳輸。

    sendfile仍然需要進行一次從內(nèi)核緩沖區(qū)到Socket緩沖區(qū)的拷貝。因此,為了將僅有的一次CPU拷貝也去掉,在Linux2.4引入了sendile with DMA Scatter/Gather Copy。

    1. 用戶進程調(diào)用 sendfile(),從用戶態(tài)陷入內(nèi)核態(tài);
    2. DMA 控制器使用 scatter 功能把數(shù)據(jù)從磁盤拷貝到內(nèi)核緩沖區(qū)進行離散存儲;
    3. CPU 把包含內(nèi)存地址和數(shù)據(jù)長度的緩沖區(qū)描述符拷貝到套接字緩沖區(qū),DMA 控制器能夠根據(jù)這些信息生成網(wǎng)絡(luò)包數(shù)據(jù)分組的報頭和報尾
    4. DMA 控制器根據(jù)緩沖區(qū)描述符里的內(nèi)存地址和數(shù)據(jù)大小,使用 scatter-gather 功能開始從內(nèi)核緩沖區(qū)收集離散的數(shù)據(jù)并組包,最后直接把網(wǎng)絡(luò)包數(shù)據(jù)拷貝到網(wǎng)卡完成數(shù)據(jù)傳輸;
    5. sendfile() 返回,上下文從內(nèi)核態(tài)切換回用戶態(tài)。

    優(yōu)點:進一步減少CPU數(shù)據(jù)拷貝的次數(shù);

    缺點:需要硬件支持。

    3、splice

    Linux在2.6.17中引入了splice系統(tǒng)調(diào)用。和sendfile一樣,其在數(shù)據(jù)傳輸過程中,避免了CPU的數(shù)據(jù)拷貝,此外也不需要硬件支持。

    1. 用戶進程系統(tǒng)調(diào)用pipe(),從用戶態(tài)切換到內(nèi)核態(tài),創(chuàng)建單向管道,從內(nèi)核態(tài)切換會用戶態(tài)。
    2. 調(diào)用splice() 向內(nèi)核(kernel)發(fā)起系統(tǒng)調(diào)用,上下文從用戶態(tài)(user space)切換為內(nèi)核態(tài)(kernel space)。
    3. CPU 利用 DMA 控制器將數(shù)據(jù)從磁盤拷貝到內(nèi)核緩沖區(qū),從管道寫入端“寫入”管道。splice返回,從內(nèi)核態(tài)切換回用戶態(tài)。
    4. 再次調(diào)用splice,CPU將數(shù)據(jù)從管道拷貝到Socket緩沖區(qū)。
    5. CPU 利用 DMA 控制器將數(shù)據(jù)從Socket緩沖區(qū)(socket buffer)拷貝到網(wǎng)卡進行數(shù)據(jù)傳輸。
    6. 上下文從內(nèi)核態(tài)(kernel space)切換回用戶態(tài)(user space),splice 系統(tǒng)調(diào)用執(zhí)行返回。

    splice是基于pipe buffer機制實現(xiàn)的,因為必須有一個要是管道設(shè)備。

    管道就是一個特殊的文件,一個實現(xiàn)FIFO的隊列,有匿名管道和命名管道。

    創(chuàng)建匿名管道:

    匿名管道(父子進程):
        grep -rl "xiaomi" | wc -l
        
    命名管道:
    mkfifo namedpipe
    echo "xiaomiyoupin" > namedpipe
    
    另一個進程:
         cat namedpipe
    

    相比于sendfile,其多了一個pipe系統(tǒng)調(diào)用,有兩次的splice調(diào)用,增加了上下文切換次數(shù)。但它在寫入讀出時并沒有使用 pipe_write()/pipe_read() 真正地在管道緩沖區(qū)寫入讀出數(shù)據(jù),而是通過把數(shù)據(jù)在內(nèi)存緩沖區(qū)中的物理內(nèi)存頁框指針、偏移量和長度賦值給前文提及的 pipe_buffer 中對應(yīng)的三個字段來完成數(shù)據(jù)的"拷貝",也就是其實只拷貝了數(shù)據(jù)的內(nèi)存地址等元信息。

    優(yōu)點:在實現(xiàn)了“零次”CPU拷貝的情況下,不需要硬件支持。

    缺點:因為其是基于管道的,管道是固定大小的緩沖區(qū),因此在每次傳輸上是有字節(jié)數(shù)的限制的。此外,每次系統(tǒng)調(diào)用都會創(chuàng)建pipe,頻繁調(diào)用影響性能。

    優(yōu)化方案:通過pipe pool避免頻繁創(chuàng)建pipe,比如HAProxy。

    3、寫時復(fù)制

    COW(Copy on Write), 在Linux中,通過 fork 系統(tǒng)調(diào)用創(chuàng)建子進程時,并不會把父進程所有占用的內(nèi)存頁復(fù)制一份,而是與父進程共用相同的內(nèi)存頁,而當(dāng)子進程或者父進程對內(nèi)存頁進行修改時才會進行復(fù)制 。

    fork子進程時,將父進程的虛擬內(nèi)存物理內(nèi)存映射關(guān)系復(fù)制到子進程中,并將內(nèi)存設(shè)置為只讀(設(shè)置為只讀是為了當(dāng)對內(nèi)存進行寫操作時觸發(fā) 缺頁異常)。

    當(dāng)子進程或者父進程對內(nèi)存數(shù)據(jù)進行修改時,便會觸發(fā) 寫時復(fù)制 機制:將原來的內(nèi)存頁復(fù)制一份新的,并重新設(shè)置其內(nèi)存映射關(guān)系,將父子進程的內(nèi)存讀寫權(quán)限設(shè)置為可讀寫。

    優(yōu)點:減少內(nèi)存的占用

    一個典型的例子:Redis的bgsave持久化命令。

    三、零拷貝實踐

    實現(xiàn)功能:Socket網(wǎng)絡(luò)文件傳輸。SocketServer負責(zé)網(wǎng)絡(luò)數(shù)據(jù)接收;Client分別實現(xiàn)零拷貝和傳統(tǒng)數(shù)據(jù)傳輸。

    實驗機器配置:Ubuntu20.04 8 CPU+16G內(nèi)存

    傳輸數(shù)據(jù)大小:1.9G(已存在內(nèi)核緩存數(shù)據(jù)的情況下),每個客戶端傳輸10次。

    1)SocketServer.py:

    """
     *=======================================* @Author : haibo
     * @Email  : wanghaibo6
     * @File   : server.py
     *======================================="""
    
    
    
    import socket
    import time
    
    BUFFER_SIZE=8 * 1024
    
    
    class Server:
    
        def __init__(self, ip, port):
            self.server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.server.bind((ip, port))
    
        def start(self):
            self.server.listen(5)
            print("Server started SuccessFully")
            while True:
                client_socket, addr=self.server.accept()
                print("new socket:", addr)
                start=time.time()
                while True:
                    data=client_socket.recv(BUFFER_SIZE)
                    if not data:
                        break
                client_socket.close()
                print("Server received finished. it costs:", time.time() - start)
    
    
    if __name__=="__main__":
        server=Server("127.0.0.1", 6667)
        server.start()
    

    2)非零拷貝client.py

       """
     *=======================================* @Author : haibo
     * @Email  : wanghaibo6
     * @File   : common_client.py
     *======================================="""
    
    
    import socket 
    import time
    
    CHUNK_SIZE=8 * 1024
    
    def send_file_by_socket():
        client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect(('127.0.0.1', 6667))
        start=time.time()
        i=0
        while i < 10:
            with open("/home/haibo/baseserver.zip", "rb") as f:
                print("Start to send file")
                data=f.read(CHUNK_SIZE)
                while data:
                    client.send(data)
                    data=f.read(CHUNK_SIZE)
            i +=1
        end=time.time()
        print("transfer finish")
        print("it cost:", end - start)
    
    
    send_file_by_socket()
    

    3)零拷貝client.py

       """
     *=======================================* @Author : haibo
     * @Email  : wanghaibo6
     * @File   : zerocopy_client.py
     *======================================="""
    
    import socket
    import time
    import os
    
    CHUNK_SIZE=8 * 1024
    
    def send_file_by_socket():
        client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect(('127.0.0.1', 6667))
        start=time.time()
        i=0
        while i < 10:
            with open("/home/haibo/baseserver.zip", "rb") as f:
                print("Start to send file")
                ret=offset=0
                while True:
                    ret=os.sendfile(client.fileno(), f.fileno(), offset, CHUNK_SIZE)
                    if ret==0:
                        break
                    offset +=ret
            i +=1
        end=time.time()
        print("transfer finish")
        print("it cost:", end - start)
    
    
    send_file_by_socket()
    

    性能對比(存在緩存的情況下):

    common_client.py

    zerocopy_client.py

    10.1201s

    5.7624s

    10.3032s

    5.9959s

    9.8249s

    6.1553s

    從實驗結(jié)果上可知,通過零拷貝技術(shù)使得網(wǎng)絡(luò)文件傳輸?shù)男阅苌系玫搅藰O大的提升!

    四、總結(jié)

    零拷貝技術(shù)主要目的在于優(yōu)化IO傳輸性能,由于其能極大提升IO傳輸效率,得到了廣泛的使用,尤其是當(dāng)今的應(yīng)用幾乎屬于IO密集型應(yīng)用。目前,Netty,Rocketmq,Nginx,HAproxy,Kafka,lettuce等優(yōu)秀的框架以及基礎(chǔ)組件都有所使用。

    本文介紹了幾種不同的零拷貝技術(shù),不同的分類有著不同的業(yè)務(wù)場景。比如mmap更適合于大文件的傳輸;sendfile更適合于靜態(tài)文件的傳輸;直接IO更適合于實現(xiàn)自緩存的應(yīng)用等。在實際應(yīng)用中,可根據(jù)自身的業(yè)務(wù)特點來做選擇。


    參考資料:

    深入剖析Linux IO原理和幾種零拷貝機制的實現(xiàn) - 知乎

    Linux I/O 原理和 Zero-copy 技術(shù)全面揭秘 - 知乎

    淺談Linux內(nèi)核IO體系之磁盤IO - 知乎

    Linux 中直接 I/O 機制的介紹_DivineH的博客-CSDN博客

    RocketMQ源碼分析(六)之Broker存儲MappedFile_jannals的博客-CSDN博客

    零拷貝(Zero-copy)及其應(yīng)用詳解 - 簡書

    想要入行做程序員,那務(wù)必得對代碼編輯器有一定的了解,一款好的編輯器不僅能夠精簡代碼長度,最大化減少BUG的出現(xiàn),還能大幅度提升功能性,今天讓我們一起來研究研究有哪些好用又免費的編輯器吧~

    推薦一:Notepad++

    .

    作為一款免費的文本編輯器,Notepad++以小巧精悍著稱,不僅支持在MS Windows環(huán)境下運行多種編程語言,而且支持超過50種編程、腳本和標(biāo)記語言的語法高亮顯示及代碼折疊,讓開發(fā)者可以迅速減小或擴大代碼段以便于查閱文檔。且因為Notepad++是使用C++封裝的Windows句柄以及Api來實現(xiàn),對于一些初學(xué)者而言,研究其源碼非常有利于學(xué)習(xí)如何封裝自己簡單的庫。


    Notepad亮點功能羅列:

    1.所見即所得功能、語法高亮、字詞自動完成功能;

    2.支持同時編輯多重文檔、自定義語言;

    3.對于HTML網(wǎng)頁編程代碼,可直接選擇在不同的瀏覽器中打開查看,以方便進行調(diào)試;

    4.自動檢測文件類型,根據(jù)關(guān)鍵字顯示節(jié)點,節(jié)點可自由折疊/打開,可顯示縮進引導(dǎo)線,使代碼富有層次感;

    5.可打開雙窗口,在分窗口中又可打開多個子窗口,允許快捷切換全屏顯示模式(F11);

    6.支持鼠標(biāo)滾輪改變文檔顯示比例;

    7.可顯示選中文本的字節(jié)數(shù),并非普通編輯器所顯示的字數(shù);提供了一些實用工具,如鄰行互換位置、宏功能等。

    Win版下載地址:http://www.anxia.com/w/notepad_14765


    推薦二:Vim

    .

    Vim是大名鼎鼎Unix編輯器Vi的深度改良版,相信許多有開發(fā)經(jīng)驗的小伙伴都對其有所耳聞,它的一個顯著特色是所有命令都采用普通的鍵盤字符輸入,保障了使用者的高速操作,而且還可以將功能鍵映射到某些命令上。總的說來Vim主要有以下這么幾個特性:

    1.跨平臺及統(tǒng)一環(huán)境

    無論是在Windows或是Linux系統(tǒng),Vim都是一款極其出色的跨平臺文本編輯器,甚至可以在CentOS,Ubuntu直接配置使用。

    2.定制化及可擴展

    Vim提供了Vimrc的配置文件來配置Vim,并且自己可以定制一些插件來實現(xiàn)文件瀏覽(Nerd Tree),代碼補全(YouCompleteMe,語法檢查(Syntastic),文件模糊搜索(Ctrlp),顯示Vim狀態(tài)欄(Vim Powerline),主題顏色(Molokai),顯示文件結(jié)構(gòu)(Tagbar)等多種功能。

    3.高效命令行

    在Vim上進行文本編輯,多數(shù)時候只需要在鍵盤上操作即可,按一次鍵就能以詞、行、塊或函數(shù)為單位移動,十分高效。一些重復(fù)刪除、粘貼的操作也只需要一條命令就能完成。

    Win版下載地址:http://www.anxia.com/w/vim_68649

    Mac版下載地址:http://www.anxia.com/m/vimr-for-mac-v0170


    推薦三:Atom

    .

    這款軟件非常適合套用一句廣告語:漂亮得不像實力派,作為一款免費的跨系統(tǒng)編碼軟件,Atom的高顏值為其籠絡(luò)了不少用戶,但更值得稱贊的是其良好的易用性和可拓展性,因此當(dāng)Atom在2014年推出后,立即被眾多大型社區(qū)迅速采用。現(xiàn)在為大家盤點下Atom較為鮮明的幾個優(yōu)勢:

    1.涵括各種開源包

    支持用戶從數(shù)以千計的開源包進行選擇為Atom添加各種個性化功能,也可以完全重新開始構(gòu)建一個包并發(fā)布給相關(guān)人員使用。

    2.多樣化的主題

    Atom在黑暗和淺色中預(yù)裝了四個UI及八類語法主題供用戶選擇,如果覺得不合適,用戶也可以自行安裝Atom社區(qū)創(chuàng)建的主題或是自己創(chuàng)建主題。

    3.個性化定制

    想要設(shè)計和定制Atom非常的簡單,開發(fā)者可以利用Css或是Less調(diào)整UI的外觀,并通過Html和JavaScript為其添加主要功能。

    4.結(jié)合Markdown輕松協(xié)作

    軟件支持直接安裝Markdown插件,讓用戶可以在Atom上獲得與Github上完全一致的轉(zhuǎn)換語法,功能比簡書更加強大,能夠識別多種語法操作。


    Win版下載地址:http://www.anxia.com/w/atombianjiqi

    Mac版下載地址:http://www.anxia.com/m/atom-v1180-macban

    Linux64下載地址:http://www.anxia.com/l/atom-v1180-linux-64wei


    推薦四:Pspad

    .

    Pspad同樣是一款業(yè)界有口皆碑的經(jīng)典編輯器,不僅免費而且配備官方中文版,降低了不少操作難度,對英文不好的小伙伴來說可謂是一個絕佳的選擇。軟件不僅支持語法高亮顯示,而且還會自動保存上一次的編輯狀態(tài),讓用戶在下一次打開編輯器時能夠直接查看原來的文件,同時支持多文檔編輯,作為完整的十六進制編輯器用起來十分順手。

    Win版下載地址:http://www.anxia.com/w/pspad

網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有