主頁 > 軟體設計 > 網路篇面試題

網路篇面試題

2021-12-29 07:54:43 軟體設計

網路篇面試題

  • 網路篇面試題
    • 1. 打開瀏覽器訪問www.baidu.com 發生了什么事情
      • 1.1 域名決議的流程
      • 1.2 http使用了tcp協議嗎
      • 1.3 三次握手
        • 1.3.1 第一次握手
        • 1.3.2 第二次握手
        • 1.3.3 第三次握手
      • 1.4 為什么必須是三次
      • 1.5 四次揮手
        • 1.5.1 第一次揮手
        • 1.5.2 第二次揮手
        • 1.5.3 第三次揮手
        • 1.5.4 第四次揮手
      • 1.6 為什么是四次揮手
      • 1.7 為什么關閉連接需要等待2MSL
      • 1.8 說下TCP粘包半包
        • 1.8.1 粘包原因
        • 1.8.2 半包原因
        • 1.8.3 解決粘包半包問題
    • 2. http和https的區別
      • 2.1 https的通訊流程嗎
    • 4. 什么是RPC通訊
      • 4.1 RPC和HTTP的區別
      • 4.2 RPC和RMI的區別
      • 4.3 自己設計一個RPC
        • 4.3.5 說一下RPC請求程序
    • 5. Linux IO模型有幾種分別是什么
      • 5.1 常見的IO模型
        • 5.1.1 阻塞IO
        • 5.1.2 非阻塞IO(輪詢)
        • 5.1.3 多路復用IO模型
        • 5.1.4 信號驅動IO模型
        • 5.1.5 異步IO模型
      • 5.2 什么是同步?什么是異步
      • 5.3 什么是阻塞?什么是非阻塞?

網路篇面試題

1. 打開瀏覽器訪問www.baidu.com 發生了什么事情

當我們在瀏覽器地址欄中輸入baidu.com訪問后會自動跳轉到百度首頁展現頁面,發生了以下這些事情

  1. 瀏覽器查找該域名的 IP 地址
  2. 瀏覽器和對應的IP建立TCP連接
  3. 瀏覽器根據決議得到的IP地址向 web 服務器發送一個 HTTP 請求
  4. 服務器收到請求并進行處理
  5. 服務器回傳一個回應
  6. 瀏覽器對該回應進行解碼,渲染顯示,
  7. 頁面顯示完成后,瀏覽器發送異步請求,

1.1 域名決議的流程

瀏覽器是如何查找域名對應的IP地址的呢?

  1. IP地址是指互聯網協議地址,每個處于互聯網中的設備都有IP 地址,形如 192.168.0.1 局域網 IP和公網 IP 是有差別的,每個主機在網路中都是IP為標識的,IP才是主機在網路中的位置,域名只是為了方便用戶記憶而已,這就要求瀏覽器能夠識別域名并且將其轉化為對應的IP地址
  2. 所以瀏覽器會有一個DNS快取,其中記錄了一些域名與IP的對應關系,供瀏覽器快速查找需要的IP,但是這個DNS快取不可能存下所有的域名-IP地址,何況IP地址有時候還會變化,因此當在瀏覽器DNS快取中沒有找到的時候,就要先向DNS服務器請求域名決議,DNS域名決議時用的是UDP協議

1.2 http使用了tcp協議嗎

http使用了tcp協議嗎,http協議的特點是什么

  1. TCP協議對應于傳輸層,而HTTP協議對應于應用層,從本質上來說,二者沒有可比性,
  2. Http協議是建立在TCP協議基礎之上的,當瀏覽器需要從服務器獲取網頁資料的時候,會發出一次Http請求
  3. Http會通過TCP建立起一個到服務器的連接通道,當本次請求需要的資料完畢后,Http會立即將TCP連接斷開,這個程序是很短的,所以Http連接是一種短連接,是一種無狀態的連接,
  4. 所謂的無狀態,是指瀏覽器每次向服務器發起請求的時候,不是通過一個連接,而是每次都建立一個新的連接,如果是一個連接的話,服務器行程中就能保持住這個連接并且在記憶體中記住一些資訊狀態,而每次請求結束后,連接就關閉,相關的內容就釋放了,所以記不住任何狀態,成為無狀態連接,

1.3 三次握手

在這里插入圖片描述
TCP三次握手

1.3.1 第一次握手

客戶端向服務端發送連接請求報文段,該報文段的頭部中SYN=1,ACK=0,seq=x,請求發送后,客戶端便進入SYN-SENT狀態,

  1. 向目的主機發送TCP連接請求報文
  2. 該TCP報文中SYN標志位為1,產生一個亂數x,表示連接請求,x為本次TCP通信的位元組流的初始
    序號,
  3. 該TCP報文通過獲取的ip(DNS)找到服務器主機,然后獲得MAC地址(ARP),通過網關,最終
    到達目的主機,
    TCP規定:SYN=1的報文段不能有資料部分,但要消耗掉一個序號,

1.3.2 第二次握手

服務端收到連接請求報文段后,如果同意連接,則會發送一個應答:SYN=1,ACK=1,seq=y,ack=x+1
該應答發送完成后便進入SYN-RCVD狀態,

  1. 目的主機收到資料幀后,通過ip協議傳輸幀,再到TCP協議,封裝成請求應答報文;
  2. 該報文中SYN標志為1,產生一個亂數y,ack標志位x+1,表示連接請求應答
  3. 該請求應答報文通過接收到的源ip->Mac(arp)->網關,發送到我的主機;

1.3.3 第三次握手

當客戶端收到連接同意的應答后,還要向服務端發送一個確認報文段,表示:服務端發來的連接同意應答已經成功收到,
該報文段的頭部為:ACK=1,seq=x+1,ack=y+1, 客戶端發完這個報文段后便進入ESTABLISHED狀態,服務端收到這個應答后也進入ESTABLISHED狀態,此時連接的建立完成

  1. 我的主機收到資料幀,通過ip協議傳輸幀,再到TCP協議,封裝成請求確認報文
  2. 該請求確認報文通過目標ip->Mac(arp)->網關,發送到目的主機
  3. 請求確認報文的ack為y +1,表示請求確認;
  4. 目的主機接收到資料幀,連接建立完成

1.4 為什么必須是三次

為什么要三次握手

  1. 防止失效的連接請求報文段被服務端接收,從而產生錯誤,
  2. 若建立連接只需兩次握手,客戶端并沒有太大的變化,仍然需要獲得服務端的應答后才進入ESTABLISHED狀態,而服務端在收到連接請求后就進入ESTABLISHED狀態,
  3. 此時如果網路擁塞,客戶端發送的連接請求遲遲到不了服務端,客戶端便超時重發請求,如果服務端正確接收并確認應答,雙方便開始通信,通信結束后釋放連接,
  4. 此時,如果那個失效的連接請求抵達了服務端,由于只有兩次握手,服務端收到請求就會進入ESTABLISHED狀態,等待發送資料或主動發送資料,但此時的客戶端早已進入CLOSED狀態,服務端將會一直等待下去,這樣浪費服務端連接資源,

三次握手的目的是建立可靠的通信信道,說到通訊,簡單來說就是資料的發送與接收,而三次握手最主要的目的就是雙方確認自己與對方的發送與接收是正常的,

第一次握手:Client 什么都不能確認;Server 確認了對方發送正常,自己接收正常

第二次握手:Client 確認了:自己發送、接收正常,對方發送、接收正常;Server 確認了:對方發送正常,自己接收正常

第三次握手:Client 確認了:自己發送、接收正常,對方發送、接收正常;Server 確認了:自己發送、接收正常,對方發送、接收正常(server確認了自己發送也正常)

所以三次握手就能確認雙發收發功能都正常,缺一不可,

1.5 四次揮手

能說下四次揮手的流程嗎
資料傳輸結束之后需要斷開連接,與建立連接不同,斷開連接需要多一次手,四次揮手
在這里插入圖片描述

1.5.1 第一次揮手

若A認為資料發送完成,則它需要向B發送連接釋放請求,該請求只有報文頭,頭中攜帶的主要引數為:FIN=1,seq=u,此時,A將進入FIN-WAIT-1狀態

  1. 瀏覽器向目的主機發出連接結束報文,此時進入FIN WAIT狀態;
  2. 連接結束報文標志位FIN=1,并且產生序號 u
  3. TCP連接結束請求報文通過ip->Mac(arp)->網關->目的主機

1.5.2 第二次揮手

B收到連接釋放請求后,會通知相應的應用程式,告訴它A向B這個方向的連接已經釋放,此時B進入CLOSE-WAIT狀態,并向A發送連接釋放的應答,其報文頭包含:ACK=1,seq=v,ack=u+1

  1. 目的主機接收到資料幀,通過ip->tcp,通過tcp協議單元回應結束應答報文
  2. 結束應答報文中ack = u + 1,表示收到結束請求,當前只是進行回應,因為目的主機可能還有資料
    要傳,并不急著斷開連接,
    第二次揮手完成后,A到B方向的連接已經釋放,B不會再接收資料,A也不會再發送資料,但B到A方向
    的連接仍然存在,B可以繼續向A發送資料,

1.5.3 第三次揮手

當B向A發完所有資料后,向A發送連接釋放請求,請求頭:FIN=1,ACK=1,seq=w,ack=u+1, B便進入LAST-ACK狀態,

  1. 等到瀏覽器發送完所有資料后,目的主機向我的主機發出tcp連接結束請求報文;
  2. 該報文FIN標志位1,并且產生亂數w,表示結束請求
  3. tcp結束請求報文通過ip->Mac(arp)->網關->我的主機

1.5.4 第四次揮手

A收到釋放請求后,向B發送確認應答,此時A進入TIME-WAIT狀態,該狀態會持續2MSL時間,若該時間段內沒有B的重發請求的話,就進入CLOSED狀態,撤銷TCB,當B收到確認應答后,也便進入CLOSED狀態,撤銷TCB,

  1. 我的主機收到資料幀,通過ip->tcp,tcp協議單元回應結束應答報文,此時進入TIME WAIT狀態,因為不相信網路是可靠的,如果目的主機沒收到,還能夠重發結束應答報文
  2. 該回應結束應答報文中的FIN標志為1,ack=N+1;表示結束應答,該tcp報文通過ip->Mac(arp)->網關->目的主機;目的主機關閉連接,如果TIME WAIT等待結束后,沒有收到回復,說明目的主機連接正常關閉了,我的主機也關閉連接

1.6 為什么是四次揮手

為什么斷開連接需要四次揮手而不是兩次

因為建立連接時,目的主機可以直接發送SYN+ACK應答報文,而當目的主機收到FIN后,可能還有資料
要發,并不一定直接斷開,所以先發送一次應答,告知我的主機收到了連接結束請求,等確認所有資料
都發完了,在發送FIN,同時等待我的主機應答,這里的FIN和ACK不能一起發送,因為可能還有資料要
傳輸,所以需要四次

1.7 為什么關閉連接需要等待2MSL

為什么從TIME_WAIT到CLOSE需要等待2MSL

  1. 在Client發送出最后的ACK回復,但該ACK可能丟失,Server如果沒有收到ACK,將不斷重復發送FIN片段,所以Client不能立即關閉,它必須確認Server接收到了該ACK,
  2. Client會在發送出ACK之后進入到TIME_WAIT狀態,Client會設定一個計時器,等待2MSL的時間,
    如果在該時間內再次收到FIN,那么Client會重發ACK并再次等待2MSL,
  3. 所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime),MSL指一個片段在網路中最大的存活時間,2MSL就是一個發送和一個回復所需的最大時間,如果直到2MSL,Client都沒有再次收到FIN,那么Client推斷ACK已經被成功接收,則結束TCP連接,

1.8 說下TCP粘包半包

說一下 TCP 粘包半包產生的原因以及解決方案

1.8.1 粘包原因

發送方產生粘包
采用TCP協議傳輸資料的客戶端與服務器經常是保持一個長連接的狀態(一次連接發一次資料不存在粘
包),雙方在連接不斷開的情況下,可以一直傳輸資料;但當發送的資料包過于的小時,那么TCP協議
默認的會啟用Nagle演算法,將這些較小的資料包進行合并發送(緩沖區資料發送是一個堆壓的程序)

這個合并程序就是在發送緩沖區中進行的,也就是說資料發送出來它已經是粘包的狀態了;
接收方產生粘包
接收方采用TCP協議接收資料時的程序是這樣的:資料到底接收方,從網路模型的下方傳遞至傳輸層,
傳輸層的TCP協議處理是將其放置接識訓沖區,然后由應用層來主動獲取(C語言用recv、read等函
數);這時會出現一個問題,就是我們在程式中呼叫的讀取資料函式不能及時的把緩沖區中的資料拿出
來,而下一個資料又到來并有一部分放入的緩沖區末尾,等我們讀取資料時就是一個粘包
;(放資料的
速度 > 應用層拿資料速度)

1.8.2 半包原因

可能是IP分片傳輸導致的,也可能是傳輸程序中丟失部分包導致出現的半包,還有可能就是一個包可能被分成了兩次傳輸,在取資料的時候,先取到了一部分(還可能與接收的緩沖區大小有關系),總之就
一個資料包被分成了多次接收

1.8.3 解決粘包半包問題

由于底層的TCP無法理解上層的業務資料,所以在底層是無法保證資料包不被拆分和重組的,這個問題只能通過上層的應用協議堆疊設計來解決,根據業界的主流協議的解決方案,可以歸納如下,
客戶端解決粘包半包

  1. 發送產生是因為Nagle演算法合并小資料包,那么可以禁用掉該演算法;
  2. TCP提供了強制資料立即傳送的操作指令push,當填入資料后呼叫操作指令就可以立即將資料發送,而不必等待發送緩沖區填充自動發送;
  3. 資料包中加頭,頭部資訊為整個資料的長度(最廣泛最常用)
    服務端解決粘包半包
  4. 決議資料包頭部資訊,根據長度來接收;
  5. 自定義資料格式:在資料中放入開始、結束標識;決議時根據格式抓取資料,缺點是資料內不能含
    有開始或結束標識;

2. http和https的區別

在這里插入圖片描述
HTTP:是互聯網上應用最為廣泛的一種網路協議,是一個客戶端和服務器端請求和應答的標準(TCP),用于從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網路傳輸減少,
HTTPS:是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全
基礎是SSL,因此加密的詳細內容就需要SSL,
HTTPS協議的主要作用可以分為兩種:一種是建立一個資訊安全通道,來保證資料傳輸的安全;另一種
就是確認網站的真實性

2.1 https的通訊流程嗎

能說下https的通訊以及加密流程嗎
HTTPS能夠加密資訊,以免敏感資訊被第三方獲取,所以很多銀行網站或電子郵箱等等安全級別較高的
服務都會采用HTTPS協議,
在這里插入圖片描述
客戶端在使用HTTPS方式與Web服務器通信時有以下幾個步驟,如圖所示,
在這里插入圖片描述

  1. 客戶使用https的URL訪問Web服務器,要求與Web服務器建立SSL連接,
  2. Web服務器收到客戶端請求后,會將網站的證書資訊(證書中包含公鑰)傳送一份給客戶端,
  3. 客戶端的瀏覽器與Web服務器開始協商SSL連接的安全等級,也就是資訊加密的等級,
  4. 客戶端的瀏覽器根據雙方同意的安全等級,建立會話密鑰,然后利用網站的公鑰將會話密鑰加密,
    并傳送給網站,
  5. Web服務器利用自己的私鑰解密出會話密鑰,
  6. Web服務器利用會話密鑰加密與客戶端之間的通信,

4. 什么是RPC通訊

RPC(Remote Promote Call) 一種行程間通信方式,允許像呼叫本地服務一樣呼叫遠程服務,RPC框架的主要目標就是讓遠程服務呼叫更簡單、透明
RPC框架負責屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式(XML/JSON/二進制)和通信細節,
開發人員在使用的時候只需要了解誰在什么位置提供了什么樣的遠程服務介面即可,并不需要關心底層
通信細節和呼叫程序,

在這里插入圖片描述

4.1 RPC和HTTP的區別

RPC和HTTTP不是一個并行的概念,RPC是遠程程序呼叫,針對于業務應用來說的,而Http只是一
個網路協議,RPC可以采用http協議來實作,也可以通過更底層的TCP或者socket來實作

RPC,是遠程方法呼叫,只要是調外部的方法,都算, 至于怎么呼叫,有很多實作,HTTP+json和
dubbo只是實作方式的兩種而已,

4.2 RPC和RMI的區別

RMI:Java遠程方法呼叫,即Java RMI(Java Remote Method Invocation)是Java編程語言里, 一種用
實作遠程程序呼叫的應用程式編程介面,它使客戶機上運行的程式可以呼叫遠程服務器上的物件,
RMI 只能在 Java 語言中使用, 可以把 RMI 看作面向物件的 Java RPC ,

RPC(Remote Procedure Call Protocol)遠程程序呼叫協議,通過網路從遠程計算機上請求呼叫某種服務,

兩者區別如下:

  • RPC 跨語言,而 RMI只支持Java
  • RMI 呼叫遠程物件方法,允許方法回傳 Java 物件以及基本資料型別,而RPC 不支持物件的概念

4.3 自己設計一個RPC

能夠描述下如何設計一個RPC框架,并描述下每一個組件的作用
我:
服務層
服務層Service,其中主要部分就是動態代理,主要用于將服務提供者的介面通過動態代理將我們的直接方法呼叫變為網路請求呼叫
過濾器層
主要完成過濾器鏈的嵌入,在動態代理階段做一些事情,比如限流,負載均衡,失敗通知,服務監控等等
RPC層
RPC層主要用來屏蔽遠程呼叫的細節,對上層呼叫透明,也是 RPC 框架的核心部分,包括通信框
架,序列化框架,還有用于屏蔽底層通信框架和序列化框架的抽象介面,
其他組件
服務注冊中心
負責服務的發布和通知,通常支持對等集群部署,某個節點宕機不會影響整個集群不可用,即使全部宕
機,只影響新的節點注冊和發布,不影響現有的,因為客戶端需要快取服務路由資訊,
服務治理中心
服務治理中心通常包括服務治理介面和服務治理 Portal,架構師,測驗人員和系統運維人員通過服務治理 Portal 對服務的運行狀態,歷史資料,健康度和呼叫關系等進行可視化的分析和維護,目標是要持續優化服務,防止服務架構腐化,保證服務高質量運行

4.3.5 說一下RPC請求程序

  1. 首先服務的提供方和呼叫方啟動的時候會將服務地址注冊到注冊中心中,然后服務也會拉取對應的
    注冊中心的注冊資訊
  2. 我們呼叫介面的時候,服務會將呼叫方的介面通過動態代理從代理到遠程介面,
  3. 通過過濾器鏈從本地存根或者注冊中心中獲取到呼叫的服務器串列,然后進行負載均衡篩選出來一
    個呼叫地址
  4. 然后通過統一的遠程呼叫介面進行網路呼叫
  5. 先對請求的引數進行序列化
  6. 通過netty或者http對遠程地址進行呼叫,引數是序列化后的地址
  7. 服務提供方收到請求后,對引數進行反序列化然后根據呼叫地址找到需要呼叫的目標方法
  8. 呼叫目標方法將引數傳入后呼叫方法回傳介面再將回傳的結果進行序列化
  9. 通過網路請求將結果回傳給呼叫發起方,然后將引數進行反序列化
  10. 最終將結束輸出

5. Linux IO模型有幾種分別是什么

說說常見的IO模型有幾種,以及他們之間的區別
阻塞IO、非阻塞IO、多路復用IO、信號驅動IO以及異步IO

5.1 常見的IO模型

5.1.1 阻塞IO

我們釣魚的時候,有一種方式比較愜意,比較輕松,那就是我們坐在魚竿面前,這個程序中我們什么也不做,雙手一直把著魚竿,就靜靜的等著魚兒咬鉤,一旦手上感受到魚的力道,就把魚釣起來放入魚簍中,然后再釣下一條魚,

最傳統的一種IO模型,即在讀寫資料程序中會發生阻塞現象,

在這里插入圖片描述
當用戶執行緒發出IO請求之后,內核會去查看資料是否就緒,如果沒有就緒就會等待資料就緒,而用戶線
程就會處于阻塞狀態,用戶執行緒交出CPU,當資料就緒之后,內核會將資料拷貝到用戶執行緒,并回傳結
果給用戶執行緒,用戶執行緒才解除block狀態,

data = socket.read();

如果資料沒有就緒,就會一直阻塞在read方法,
優點:程式簡單,在阻塞等待資料期間行程/執行緒掛起,基本不會占用 CPU 資源,
缺點:每個連接需要獨立的行程/執行緒單獨處理,當并發請求量大時為了維護程式,記憶體、執行緒切換開
銷較大,這種模型在實際生產中很少使用,

5.1.2 非阻塞IO(輪詢)

我們釣魚的時候,在等待魚兒咬鉤的程序中,我們可以做點別的事情,比如玩一把王者榮耀、看一集《延禧攻略》等等,但是,我們要時不時的去看一下魚竿,一旦發現有魚兒上鉤了,就把魚釣上來,

當用戶執行緒發起一個read操作后,并不需要等待,而是馬上就得到了一個結果,
在這里插入圖片描述
如果結果是一個error時,它就知道資料還沒有準備好,于是它可以再次發送read操作,一旦內核中的資料準備好了,并且又再次收到了用戶執行緒的請求,那么它馬上就將資料拷貝到了用戶執行緒,然后回傳,
所以事實上,在非阻塞IO模型中,用戶執行緒需要不斷地詢問內核資料是否就緒,也就說非阻塞IO不會交出CPU,而會一直占用CPU,

while(true){ 
   data = socket.read(); 
   if(data!= error){ 
       處理資料 
       break; 
    } 
}

但是對于非阻塞IO就有一個非常嚴重的問題,在while回圈中需要不斷地去詢問內核資料是否就緒,這樣會導致CPU占用率非常高,因此一般情況下很少使用while回圈這種方式來讀取資料,
優點:不會阻塞在內核的等待資料程序,每次發起的 I/O 請求可以立即回傳,不用阻塞等待,實時性較
好,
缺點:輪詢將會不斷地詢問內核,這將占用大量的 CPU 時間,系統資源利用率較低,所以一般 Web 服
務器不使用這種 I/O 模型,

5.1.3 多路復用IO模型

我們釣魚的時候,為了保證可以最短的時間釣到最多的魚,我們同一時間擺放多個魚竿,同時釣魚,然后哪個魚竿有魚兒咬鉤了,我們就把哪個魚竿上面的魚釣起來,

多路復用IO模型是目前使用得比較多的模型,Java NIO實際上就是多路復用IO,

在這里插入圖片描述
在多路復用IO模型中,會有一個執行緒不斷去輪詢多個socket的狀態,只有當socket真正有讀寫事件時,才真正呼叫實際的IO讀寫操作,因為在多路復用IO模型中,只需要使用一個執行緒就可以管理多個socket,系統不需要建立新的行程或者執行緒,也不必維護這些執行緒和行程,并且只有在真正有socket讀寫事件進行時,才會使用IO資源,所以它大大減少了資源占用,
在Java NIO中,是通過selector.select()去查詢每個通道是否有到達事件,如果沒有事件,則一直阻塞在
那里,因此這種方式會導致用戶執行緒的阻塞,
優點:可以基于一個阻塞物件,同時在多個描述符上等待就緒,而不是使用多個執行緒(每個檔案描述符一
個執行緒),這樣可以大大節省系統資源,
缺點:當連接數較少時效率相比多執行緒+阻塞 I/O 模型效率較低,可能延遲更大,因為單個連接處理需
要 2 次系統呼叫,占用時間會有增加,

5.1.4 信號驅動IO模型

我們釣魚的時候,為了避免自己一遍一遍的去查看魚竿,我們可以給魚竿安裝一個報警器,當有魚兒咬鉤的時候立刻報警,然后我們再收到報警后,去把魚釣起來,

在信號驅動IO模型中,當用戶執行緒發起一個IO請求操作,會給對應的socket注冊一個信號函式,然后用戶執行緒會繼續執行,當內核資料就緒時會發送一個信號給用戶執行緒,用戶執行緒接收到信號之后,便在信號函式中呼叫IO讀寫操作來進行實際的IO請求操作
在這里插入圖片描述
優點:執行緒并沒有在等待資料時被阻塞,可以提高資源的利用率,
缺點:信號 I/O 在大量 IO 操作時可能會因為信號佇列溢位導致沒法通知,

實際在呼叫io讀取資料的的時候還是阻塞的

我們把釣魚程序,可以拆分為兩個步驟:1、魚咬鉤(資料準備),2、把魚釣起來放進魚簍里(資料拷貝),無論以上提到的哪種釣魚方式,在第二步,都是需要人主動去做的,并不是魚竿自己完成的,所以,這個釣魚程序其實還是同步進行的,

5.1.5 異步IO模型

在這里插入圖片描述

我們釣魚的時候,采用一種高科技釣魚竿,即全自動釣魚竿,可以自動感應魚上鉤,自動收竿,更厲害的可以自動把魚放進魚簍里,然后,通知我們魚已經釣到了,他就繼續去釣下一條魚去了,

異步IO模型才是最理想的IO模型,在異步IO模型中,當用戶執行緒發起read操作之后,立刻就可以開始去做其它的事,而另一方面,從內核的角度,當它收到一個asynchronous read之后,它會立刻回傳,說明read請求已經成功發起了,因此不會對用戶執行緒產生任何block,然后,內核會等待資料準備完成,然后將資料拷貝到用戶執行緒,當這一切都完成之后,內核會給用戶執行緒發送一個信號,告訴它read操作完成了,也就說用戶執行緒完全不需要知道實際的整個IO操作是如何進行的,只需要先發起一個請求,當接收內核回傳的成功信號時表示IO操作已經完成,可以直接去使用資料了
也就說在異步IO模型中,IO操作的兩個階段都不會阻塞用戶執行緒,這兩個階段都是由內核自動完成,然后發送一個信號告知用戶執行緒操作已完成,用戶執行緒中不需要再次呼叫IO函式進行具體的讀寫,這點是和信號驅動模型有所不同的,在信號驅動模型中,當用戶執行緒接收到信號表示資料已經就緒,然后需要用戶執行緒呼叫IO函式進行實際的讀寫操作;而在異步IO模型中,收到信號表示IO操作已經完成,不需要再在用戶執行緒中呼叫iO函式進行實際的讀寫操作,
優點:異步 I/O 能夠充分利用 DMA 特性,讓 I/O 操作與計算重疊,
缺點:要實作真正的異步 I/O,作業系統需要做大量的作業,目前 Windows 下通過 IOCP 實作了真正的
異步 I/O,

參考

5.2 什么是同步?什么是異步

主要關注的是結果訊息的通信機制
同步:同步的意思就是呼叫方需要主動等待結果的回傳
異步:異步的意思就是不需要主動等待結果的回傳,而是通過其他手段比如,狀態通知,回呼函式等
重點看是否是同一個執行緒回傳

5.3 什么是阻塞?什么是非阻塞?

主要關注的是等待結果回傳呼叫方的狀態
阻塞:是指結果回傳之前,當前執行緒被掛起,不做任何事
非阻塞:是指結果在回傳之前,執行緒可以做一些其他事,不會被掛起

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/396143.html

標籤:其他

上一篇:秒殺專案面試-專案經驗(58.3萬高QPS,高并發)

下一篇:PHPstudy隱藏index.php前綴

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more