偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

 被虐前奏

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

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

結(jié)果:卒

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

[[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請(qǐng)求和響應(yīng)如下:

  • 客戶端調(diào)用:系統(tǒng)通過網(wǎng)卡讀取客戶端的請(qǐng)求,將數(shù)據(jù)讀取到內(nèi)核緩沖區(qū);
  • 程序請(qǐng)求數(shù)據(jù):Java通過read命令,將數(shù)據(jù)從內(nèi)核緩沖區(qū)送入Java的用戶緩沖區(qū);
  • Java服務(wù)端數(shù)據(jù)處理:在Java用戶空間中處理客戶請(qǐng)求數(shù)據(jù);
  • Java服務(wù)端返回?cái)?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í)將數(shù)據(jù)發(fā)送給目標(biāo)客戶端。

二、四種常見的IO模型

1、同步阻塞IO(Blocking IO)

我們先了解一下概念:

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

阻塞與非阻塞:阻塞指的用戶空間發(fā)起請(qǐng)求后,需要等待內(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)點(diǎn):開發(fā)簡(jiǎn)單,容易入門;在阻塞等待期間,用戶線程掛起,在掛起期間不會(huì)占用CPU資源。

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

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

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

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

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

在內(nèi)核緩沖區(qū)有數(shù)據(jù)時(shí),此時(shí)是會(huì)阻塞的,直到數(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ù)的時(shí)候,用戶線程發(fā)起IO請(qǐng)求,會(huì)立即返回;為了最終讀取到數(shù)據(jù),用戶線程需要不斷發(fā)起IO調(diào)用;歷經(jīng)多次探險(xiǎn)后,終于有數(shù)據(jù)到達(dá)內(nèi)核時(shí),此時(shí),用戶線程會(huì)進(jìn)入阻塞狀態(tài),當(dāng)數(shù)據(jù)成功復(fù)制到用戶緩沖區(qū),用戶線程成功讀取到數(shù)據(jù)后,才會(huì)解除阻塞狀態(tài),重新運(yùn)行起來。

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

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

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

如何解決同步非阻塞IO輪詢?cè)斐尚实拖碌膯栴},這時(shí)IO多路復(fù)用出現(xiàn)了。

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

 

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

 

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

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

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

IO多路復(fù)用缺點(diǎn):本質(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)核空間是主動(dòng)調(diào)用者,用戶空間變成被動(dòng)接收者。用戶空間的線程向內(nèi)核空間注冊(cè)各種IO事件的回調(diào)函數(shù),由內(nèi)核主動(dòng)觸發(fā)調(diào)用。

AIO的基本流程是:用戶線程通過系統(tǒng)調(diào)用,向內(nèi)核注冊(cè)某個(gè)IO操作。在整個(gè)內(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ù)的兩個(gè)階段,用戶線程都不會(huì)阻塞。read操作流程如下:

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

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

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

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

2024-01-10 08:01:55

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

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)存通道

2025-01-09 10:54:27

2011-08-30 10:22:14

MongoDB

2020-09-02 07:05:56

手機(jī)支付

2020-09-22 12:00:23

Javahashmap高并發(fā)

2025-06-30 00:00:00

2019-05-27 08:11:13

高并發(fā)Synchronize底層

2009-10-13 14:50:19

C#中b=a

2010-01-14 10:52:13

VB.NET水晶報(bào)表

2019-06-28 10:55:04

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

2020-04-13 08:33:39

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

2024-06-20 08:06:51

2024-07-16 18:05:19

延遲隊(duì)列MQRabbitMQ
點(diǎn)贊
收藏

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