JAVA學習 IO模型(補充)

2021-09-12 01:11:21 字數 1748 閱讀 6115

昨天在整理reactor 模型和proactor模型的時候發現最開始對io模型的理解還是比較膚淺,然後繼續查詢資料後找到一篇講的很精闢的文章。

現在把內容結合我個人理解整理出來

對於乙個network io (這裡我們以read舉例),它會涉及到兩個系統物件,

呼叫這個io的process (or thread),

系統核心(kernel)。

等待資料準備 (waiting for the data to be ready)(資料準備階段)

將資料從核心拷貝到程序中 (copying the data from the kernel to the process)(資料拷貝階段)

所有的socket(套接字)都是阻塞的

ps.套接字這個翻譯真的是懵逼的,socket這個功能讓我想起以前見過的連線套筒ε=(´ο`*)))唉。

當使用者程序呼叫了recvfrom(資料請求),

資料準備階段:準備資料。對於network io來說,很多時候資料在一開始還沒有到達,這個時候kernel(核心)就要等待足夠的資料到來。而在使用者程序這邊,整個程序會被阻塞。

資料拷貝階段:當kernel(核心)等到資料準備好了,它就會將資料從kernel(核心)中拷貝到使用者記憶體,然後kernel返回結果,使用者程序才解除block的狀態,重新執行起來。

所以,blocking io的特點就是在io執行的兩個階段都被block了。

所有的socket(套接字)都是非阻塞的

流程

當使用者程序呼叫了recvfrom(資料請求),

資料準備階段:如果kernel(核心)中的資料還沒有準備好,那麼它並不會block(阻塞)使用者程序,而是立刻返回乙個error。從使用者程序角度講 ,它發起乙個read操作後,並不需要等待,而是馬上就得到了乙個結果。使用者程序判斷結果是乙個error時,它就知道資料還沒有準備好,於是它可以再次傳送read操作。

資料拷貝階段:一旦kernel(核心)中的資料準備好了,並且又再次收到了使用者程序的system call(呼叫),那麼它馬上就將資料拷貝到了使用者記憶體,然後返回。

所以,使用者程序其實是需要不斷的主動詢問kernel(核心)資料好了沒有。

當使用者程序呼叫了select,那麼整個程序會被block,而同時,kernel會「監視」所有select負責的socket。

資料準備階段:當任何乙個socket中的資料準備好了,select就會返回。

資料拷貝階段:這個時候使用者程序再呼叫read操作,將資料從kernel拷貝到使用者程序。

使用者程序發起read操作之後,立刻就可以開始去做其它的事。

資料準備階段:kernel的角度,當它受到乙個asynchronous read之後,首先它會立刻返回,所以不會對使用者程序產生任何block。然後,kernel會等待資料準備完成。

資料拷貝階段:將資料拷貝到使用者記憶體,當這一切都完成之後,kernel會給使用者程序傳送乙個signal,告訴它read操作完成了。

stevens給出的定義給出的定義是

定義中所指的」io operation」是指真實的io操作,所以可以這麼解釋。

ps.看完這篇文章才發現自己把非同步、非同步io有點搞混了。

Java中的IO模型

一 同步 非同步 阻塞與非阻塞 從核心角度看i o操作分為兩步 使用者層api呼叫 核心層完成系統呼叫 發起i o請求 所以同步 非同步針對的是使用者的api的呼叫 阻塞 非阻塞針對的是io請求。同步指的是函式完成之前會一直等待 阻塞指的是系統呼叫的時候程序會被設定為sleep狀態,直到等待的資料發...

I O模型 I O模型

輸入 輸出 i o 是在主存和外部裝置 例如磁碟驅動器 終端和網路 之間複製資料的過程。輸入操作是從 i o 裝置複製資料到主存,輸出資料是從主存複製資料到 i o 裝置。描述的是使用者執行緒與核心的互動方式 描述的是使用者執行緒呼叫核心 i o 操作的方式 乙個 i o 操作其實分成了兩個步驟 發...

Java學習筆記 004 補充

抽象類 關鍵字 abstract 語法 public abstract class person 作用 抽象類只能被繼承,不能例項化。抽象方法 語法 public abstract void sleep 作用 子類必須重寫父類的抽象方法,乙個都不能少。如果實在不想寫實現方法,可以繼續用抽象類建立。但...