Linuxでの私の5種類について話す/ Oモデル
、I / Oモデルを導きます
我々は、すべてのOS等のセキュリティを考慮するために、ことを知っているプロセスを直接操作することができない、カーネルのシステムコールによって、I / O要求行動を支援するために完了しなければならないI / Oデバイスを、各I / O機器のメンテナンスのためのカーネルをバッファ。下図のように:
全体のプロセスのための要求: プロセスを開始するためのユーザ要求は、カーネルはバッファへのI / Oデバイスからデータを取得するための要求を受信し、ユーザプロセスのアドレス空間にコピーバッファ内のデータは、ユーザー・プロセスは、データを取得し、クライアントに応答します。
プロセス要求を通して、バッファへのデータ入力は、時間がかかり、そしてバッファからのプロセスにデータをコピーすることは時間がかかります。したがって、2つの時間、I / O操作を待つに異なる方法によれば、以下の5つのモードに分けることができます。
(1)阻塞I / O(ブロッキングI / O)
(2)非ブロッキングI / O(I / Oを非ブロッキング)
(3) I/O复用(I/O Multiplexing)
(4)I / Oを駆動するための信号(シグナル駆動型I / O)
(5)非同期I / O(Asynchrnous I / O)
第二に、I / Oモデルの部門
ブロッキング:呼び出し元のプロセスは、操作が完了するまで待機している状態でした。
ノンブロッキング:カーネル内のデータの準備ができていない、あなたはすぐに戻り、プロセスは買い物や他のものに行くことができます。
同期、非同期、ブロッキングから、見て2次元を非ブロック:
3つは、I / Oモデルは以下のように記述されています
1、ブロックI / O
マップからは、データが完了し準備ができているとき、ユーザプロセスは、システムコールを行うと、カーネルは最初のフェーズI / Oを開始し、バッファにデータを準備し、データをプロセス全体を見ることができますその後、ユーザプロセスの状態の再実行をブロックする持ち上げる前に、ユーザプロセスのメモリにカーネルバッファにコピーします。
だから、I / O機能をブロックすると、I / Oブロックの実行された2つの段階にあります。
2、非ブロックI / O
あなたは二つの段階I / Oの実行中に見ることができるマップからは、唯一のプロセスの第二段階では、ユーザーがブロックされ、第一段階がブロックされていないが、最初の段階では、プロセスは、ユーザーや他のブラインドする必要があります、データの準備ができているので、モデルは、より多くのCPU集約型であれば、カーネルが確認するためにポーリングを停止します。
3、I / Oの多重化
マップからあなたは、I / Oは、ユーザー・プロセスによって実行される2つの段階がブロックされているI / Oの多重化モデルに見ることができますが、二相が完全なI / O操作で、独立しており、ユーザプロセスは、2つのシステム・コールを開始しています。
図4に示すように、駆動信号I / O
イベント駆動型に基づいて、また、I / Oモデルとして知られているモデルは、あなただけのI / Oの第2段階でユーザプロセスをブロック、このモデルを見ることができる第一段階で行わ遮断されません。
一見感と、非ブロッキングモデルは、実際には、I / Oがデータの準備が完了した後に行われる、データをユーザに通知するためのイニシアチブを取る最初の段階でのモデルは、そのユーザー、プロセスを完了する準備ができているという事実で異なる非常に似ていますコールバックを行うためのプロセス。ユーザは、エッジトリガ、一度だけ通知するための通知、両者を送信することであったであろうプロセスに応答しない場合、通知は、つまり、2つのトリガ・レベルのための1つに分割されています。
5、异步I/O
ユーザーはシステムコールのプロセスを開始したときにI / Oを2つのフェーズで実行されるまで、このモデルでは、あなたはすぐに、他の事をする開始する、とすることができます完了すると、カーネルはユーザプロセス操作がされたことの通知を送信するために、ユーザ・プロセスを提供します完了しました。
四、五モデルの概要
、I / Oモデルを導きます
我々は、すべてのOS等のセキュリティを考慮するために、ことを知っているプロセスを直接操作することができない、カーネルのシステムコールによって、I / O要求行動を支援するために完了しなければならないI / Oデバイスを、各I / O機器のメンテナンスのためのカーネルをバッファ。下図のように:
全体のプロセスのための要求: プロセスを開始するためのユーザ要求は、カーネルはバッファへのI / Oデバイスからデータを取得するための要求を受信し、ユーザプロセスのアドレス空間にコピーバッファ内のデータは、ユーザー・プロセスは、データを取得し、クライアントに応答します。
プロセス要求を通して、バッファへのデータ入力は、時間がかかり、そしてバッファからのプロセスにデータをコピーすることは時間がかかります。したがって、2つの時間、I / O操作を待つに異なる方法によれば、以下の5つのモードに分けることができます。
(1) 阻塞I/O (Blocking I/O)
(2) 非阻塞I/O (Non-Blocking I/O)
(3) I/O复用(I/O Multiplexing)
(4) 信号驱动的I/O (Signal Driven I/O)
(5) 异步I/O (Asynchrnous I/O)
二、关于I/O模型的划分
阻塞:调用的进程一直处于等待状态,直到操作完成。
非阻塞:在内核的数据还未准备好时,会立即返回,进程可以去干其他事情。
从同步异步,以及阻塞、非阻塞两个维度来划分来看:
三、I/O模型分述
1、阻塞I/O
从上图可以看到在整个过程中,当用户进程进行系统调用时,内核就开始了I/O的第一个阶段,准备数据到缓冲区中,当数据都准备完成后,则将数据从内核缓冲区中拷贝到用户进程的内存中,这时用户进程才解除block的状态重新运行。
所以,Blocking I/O的特点就是在I/O执行的两个阶段都被block了。
2、非阻塞I/O
从上图可以看到在I/O执行的两个阶段中,用户进程只有在第二个阶段被阻塞了,而第一个阶段没有阻塞,但是在第一个阶段中,用户进程需要盲等,不停的去轮询内核,看数据是否准备好了,因此该模型是比较消耗CPU的。
3、I/O复用
从上图可以看到在I/O复用模型中,I/O执行的两个阶段都是用户进程都是阻塞的,但是两个阶段是独立的,在一次完整的I/O操作中,该用户进程是发起了两次系统调用。
4、信号驱动的I/O
该模型也叫作基于事件驱动的I/O模型,可以看到该模型中,只有在I/O执行的第二阶段阻塞了用户进程,而在第一阶段是没有阻塞的。
乍看起来感觉和非阻塞模型很相似,其实不同之处就在于,该模型在I/O执行的第一阶段,当数据准备完成之后,会主动的通知用户进程数据已经准备完成,即对用户进程做一个回调。该通知分为两种,一为水平触发,即如果用户进程不响应则会一直发送通知,二为边缘触发,即只通知一次。
5、异步I/O
在该模型中,当用户进程发起系统调用后,立刻就可以开始去做其它的事情,然后直到I/O执行的两个阶段都完成之后,内核会给用户进程发送通知,告诉用户进程操作已经完成了。
四、五种模型总结