自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

說說高并發(fā)IO原理及模型,結(jié)果沒結(jié)果了

存儲 存儲軟件
read調(diào)用,并不是直接從物理磁盤讀取,同樣,write調(diào)用也不是直接把數(shù)據(jù)寫進(jìn)物理磁盤,在他們中間還有一層,就是緩沖區(qū),而緩沖區(qū)又包括:內(nèi)核(kernel)緩沖區(qū)和用戶進(jìn)程緩沖區(qū)。

 被虐前奏

面試官:說一下高并發(fā)IO底層原理?

面試者:呃。。。嗯。。。這個那個。。。我們都是用XX框架

結(jié)果:卒

理解一下高并發(fā)原理,展現(xiàn)真正的實力

[[324201]]

一、IO讀寫基礎(chǔ)原理

IO讀寫分為read和write兩塊,在不同的操作系統(tǒng)中,IO讀寫的底層調(diào)用可能有些區(qū)別,但基本功能是一樣的。read調(diào)用,并不是直接從物理磁盤讀取,同樣,write調(diào)用也不是直接把數(shù)據(jù)寫進(jìn)物理磁盤,在他們中間還有一層,就是緩沖區(qū),而緩沖區(qū)又包括:內(nèi)核(kernel)緩沖區(qū)和用戶進(jìn)程緩沖區(qū)。具體可以看下圖

 

面試官:說說高并發(fā)IO原理及模型,結(jié)果沒結(jié)果了

 

在Java中,完整的Socket請求和響應(yīng)如下:

  • 客戶端調(diào)用:系統(tǒng)通過網(wǎng)卡讀取客戶端的請求,將數(shù)據(jù)讀取到內(nèi)核緩沖區(qū);
  • 程序請求數(shù)據(jù):Java通過read命令,將數(shù)據(jù)從內(nèi)核緩沖區(qū)送入Java的用戶緩沖區(qū);
  • Java服務(wù)端數(shù)據(jù)處理:在Java用戶空間中處理客戶請求數(shù)據(jù);
  • Java服務(wù)端返回數(shù)據(jù):數(shù)據(jù)處理完,通過write命令,將構(gòu)建好的響應(yīng)數(shù)據(jù)從用戶緩沖區(qū)寫入內(nèi)核緩沖區(qū);
  • 發(fā)送數(shù)據(jù)到客戶端:內(nèi)核通過網(wǎng)絡(luò)IO,將內(nèi)核緩沖區(qū)中的數(shù)據(jù)通過網(wǎng)卡,適時將數(shù)據(jù)發(fā)送給目標(biāo)客戶端。

二、四種常見的IO模型

1、同步阻塞IO(Blocking IO)

我們先了解一下概念:

同步與異步:同步指的是用戶空間是主動發(fā)起IO請求的一方,內(nèi)核空間是被動接受的一方;異步則是將以上過程反過來;

阻塞與非阻塞:阻塞指的用戶空間發(fā)起請求后,需要等待內(nèi)核空間徹底完成后,才將數(shù)據(jù)返回到用戶空間;非阻塞指的是用戶空間不需要等待內(nèi)核空間操作完成,可以立即返回用戶用戶空間的過程 。

傳統(tǒng)的IO模型都是同步阻塞IO,在Java中,默認(rèn)創(chuàng)建的socket都是同步阻塞的。Java應(yīng)用從發(fā)起IO調(diào)用開始,直到系統(tǒng)調(diào)用返回,Java進(jìn)程都是阻塞的,直到有數(shù)據(jù)返回成功后,應(yīng)用程序才能開始處理用戶緩沖區(qū)的數(shù)據(jù),具體流程如下:

 

面試官:說說高并發(fā)IO原理及模型,結(jié)果沒結(jié)果了

 

由上圖可以看出,每一步必須等待上一步的完成才能進(jìn)行。

同步阻塞IO優(yōu)點:開發(fā)簡單,容易入門;在阻塞等待期間,用戶線程掛起,在掛起期間不會占用CPU資源。

同步阻塞IO缺點:一個線程維護(hù)一個IO,不適合大并發(fā),在并發(fā)量大的時候需要創(chuàng)建大量的線程來維護(hù)網(wǎng)絡(luò)連接,內(nèi)存、線程開銷灰常大。

2、同步非阻塞IO(Non-blocking IO)

參考以上概念,當(dāng)處于非阻塞IO時,用戶空間與內(nèi)核空間可以更快的交互,只要拿到內(nèi)核返回的狀態(tài)值,就可以繼續(xù)干自己的事情,而不用做無謂的等待。

在Java中,將socket的屬性設(shè)置為NONBLOCK即為非阻塞模式。在這個模式中,會有以下兩種情況:

在內(nèi)核緩沖區(qū)沒有數(shù)據(jù)時,系統(tǒng)調(diào)用會馬上返回失敗狀態(tài)給調(diào)用方;

在內(nèi)核緩沖區(qū)有數(shù)據(jù)時,此時是會阻塞的,直到數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到用戶緩沖區(qū),復(fù)制完成后,系統(tǒng)調(diào)用返回成功,繼而用戶的應(yīng)用進(jìn)程開始處理用戶空間的數(shù)據(jù),具體流程如下:

 

面試官:說說高并發(fā)IO原理及模型,結(jié)果沒結(jié)果了

 

由上圖可以看出,在內(nèi)核還沒有準(zhǔn)備好數(shù)據(jù)的時候,用戶線程發(fā)起IO請求,會立即返回;為了最終讀取到數(shù)據(jù),用戶線程需要不斷發(fā)起IO調(diào)用;歷經(jīng)多次探險后,終于有數(shù)據(jù)到達(dá)內(nèi)核時,此時,用戶線程會進(jìn)入阻塞狀態(tài),當(dāng)數(shù)據(jù)成功復(fù)制到用戶緩沖區(qū),用戶線程成功讀取到數(shù)據(jù)后,才會解除阻塞狀態(tài),重新運行起來。

同步非阻塞IO優(yōu)點:每次發(fā)起IO調(diào)用,在內(nèi)核等待數(shù)據(jù)的過程中可以立即返回,用戶線程不會阻塞,實時性較好。

同步非阻塞IO缺點:多個線程不斷輪詢內(nèi)核是否有數(shù)據(jù),占用大量CPU時間,效率不高。一般Web服務(wù)器不會采用此模式。

3、IO多路復(fù)用(IO Multiplexing)

如何解決同步非阻塞IO輪詢造成效率低下的問題,這時IO多路復(fù)用出現(xiàn)了。

經(jīng)典的Reactor反應(yīng)器設(shè)計模式,也可稱為異步阻塞IO,是眾多高性能高并發(fā)服務(wù)器的基礎(chǔ),比如Nginx、Netty、Redis等。Java中NIO(New IO)里的Selector選擇器也是基于此模式。在Linux系統(tǒng)中,對應(yīng)的系統(tǒng)調(diào)用為select/epoll系統(tǒng)調(diào)用,當(dāng)內(nèi)核緩沖區(qū)可讀或者可寫時,內(nèi)核將就緒的狀態(tài)主動通知相應(yīng)的用戶程序,應(yīng)用程序收到就緒狀態(tài),進(jìn)行相應(yīng)的IO調(diào)用,具體流程如下:

 

面試官:說說高并發(fā)IO原理及模型,結(jié)果沒結(jié)果了

 

由上圖可以看出,該模式下,read操作流程如下:

  • 注冊選擇器,將read操作的目標(biāo)socket提前注冊到select/epol選擇器中(類比Java中NIO的selector);
  • 輪詢,通過選擇器的查詢方法,查詢注冊過的所有socket連接的就緒狀態(tài),內(nèi)核個就緒的socket列表(當(dāng)內(nèi)核監(jiān)控到注冊過的socket有數(shù)據(jù)準(zhǔn)備好了,就會將該socket加入到就緒列表)。注意,當(dāng)用戶調(diào)用select查詢方法時,此時整個線程會處于阻塞狀態(tài);
  • 用戶線程獲取到就緒列表后,根據(jù)其中的socket連接,發(fā)起read請求,用戶線程阻塞,內(nèi)核開始復(fù)制數(shù)據(jù),將數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到用戶緩沖區(qū);
  • 復(fù)制完成后,內(nèi)核返回結(jié)果,用戶線程才會解除阻塞,待用戶線程讀取成功數(shù)據(jù)后,線程繼續(xù)。

IO多路復(fù)用優(yōu)點:系統(tǒng)不必創(chuàng)建維護(hù)大量線程,只使用一個線程,一個選擇器即可同時處理成千上萬個連接,大大減少了系統(tǒng)開銷。

IO多路復(fù)用缺點:本質(zhì)上,select/epoll系統(tǒng)調(diào)用是阻塞式的,屬于同步IO,需要在讀寫事件就緒后,由系統(tǒng)調(diào)用進(jìn)行阻塞的讀寫。

4、異步IO(Asynchronous IO)

異步IO,指的是用戶空間與內(nèi)核空間的調(diào)用方式返過來。內(nèi)核空間是主動調(diào)用者,用戶空間變成被動接收者。用戶空間的線程向內(nèi)核空間注冊各種IO事件的回調(diào)函數(shù),由內(nèi)核主動觸發(fā)調(diào)用。

AIO的基本流程是:用戶線程通過系統(tǒng)調(diào)用,向內(nèi)核注冊某個IO操作。在整個內(nèi)核的數(shù)據(jù)處理中, 包括數(shù)據(jù)從網(wǎng)卡到內(nèi)核緩沖區(qū),內(nèi)核緩沖區(qū)到用戶緩沖區(qū),用戶程序都不需要阻塞。具體流程如下:

 

面試官:說說高并發(fā)IO原理及模型,結(jié)果沒結(jié)果了

 

由上圖可以看出,該模式下,在內(nèi)核等待數(shù)據(jù)和復(fù)制數(shù)據(jù)的兩個階段,用戶線程都不會阻塞。read操作流程如下:

  • 用戶發(fā)起read請求,內(nèi)核立刻返回成功狀態(tài),用戶不會阻塞,可以馬上去做其它事情;
  • 內(nèi)核開始準(zhǔn)備數(shù)據(jù),待數(shù)據(jù)準(zhǔn)備好了,內(nèi)核會主動將數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到用戶緩沖區(qū);
  • 此時,內(nèi)核會給用戶線程發(fā)送一個信號,或者回調(diào)用戶線程注冊的回調(diào)接口,通知用戶read操作完成了;
  • 用戶線程收到通知后,讀取用戶緩沖區(qū)的數(shù)據(jù),完成后續(xù)業(yè)務(wù)。

異步IO優(yōu)點:真正實現(xiàn)了異步非阻塞,吞吐量在這幾種模式中是最高的。

異步IO缺點:應(yīng)用程序只需要進(jìn)行事件的注冊與接收,其余工作都交給了操作系統(tǒng)內(nèi)核,所以需要內(nèi)核提供支持。在Linux系統(tǒng)中,異步IO在其2.6才引入,目前也還不是灰常完善,其底層實現(xiàn)仍使用epoll,與IO多路復(fù)用相同,因此在性能上沒有明顯占優(yōu)。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2024-01-10 08:01:55

高并發(fā)場景悲觀鎖

2021-07-01 07:34:09

LinuxIO模型

2020-04-10 08:03:04

分布式鎖Redlock算法流行算法

2020-05-19 13:18:45

網(wǎng)頁前端Web

2018-12-18 14:08:01

Java內(nèi)存volatile

2025-01-03 09:36:22

Nginx高并發(fā)進(jìn)程

2018-03-01 15:13:42

Ryzen APU內(nèi)存通道

2020-09-22 12:00:23

Javahashmap高并發(fā)

2009-10-13 14:50:19

C#中b=a

2019-05-27 08:11:13

高并發(fā)Synchronize底層

2025-01-09 10:54:27

2010-01-14 10:52:13

VB.NET水晶報表

2011-08-30 10:22:14

MongoDB

2020-09-02 07:05:56

手機支付

2019-06-28 10:55:04

預(yù)熱高并發(fā)并發(fā)高

2009-09-14 10:09:26

LINQ查詢結(jié)果

2022-08-01 10:15:06

AI模型Meta

2020-04-13 08:33:39

高并發(fā)秒殺系統(tǒng)

2020-09-03 14:30:40

Tomcat 拆解調(diào)優(yōu)

2020-09-23 22:36:27

分布式架構(gòu)系統(tǒng)
點贊
收藏

51CTO技術(shù)棧公眾號