導入された、IOモデル
レビュー:同期、非同期、ブロック、非ブロック
同期:ペースが相乗的であることを意味します。今相乗効果と呼ばれ、これに少なくとも二つ以上のものが存在するがなければなりません。相乗結果:することはできませんより多くの物事は、以前のものの終了後、一つ一つにする必要があり、次の事が始まりました。
非同期:ペースが異なっているが、あなたはあなたがいたものよりも、私は、すべてのものが同時に進行している人、コントロールしていないに行われます
要約:同期を同時に起動することはできません複数のものを同時に起動することができ、非同期複数のもの。
妨害:閉塞中に発生したタスクを実行するため、タスクにつながるには、待機状態で実行することはできません
ノンブロッキング:ブロックに遭遇しなかった使命は、あなたは常にタスクを実行することができます
概要:バックプログラム、停止して待つ意味もブロックし、非ブロックのショーダウンを続行することができます。
1.ブロッキングI / Oモデル(ブロッキングI / O)
(I / Oをnoblocking)2.ノンブロッキングI / Oモデル
3.I / O多重化、マルチチャネル(I / O多重化)
4.駆動信号I / O(信号駆動I / O)
5.异步I / O(非同期I / O)
前四个I/O都被称之为同步I/O
I/O发生时涉及的对象和步骤
:ネットワークI / O(ネットワークI / O)(ここでは例えばリード)の場合、それは2つのシステムオブジェクトを伴うだろう、プロセス(またはスレッド)のI / Oへの呼び出しで、もう一方は(システムのカーネルですカーネル)。読み出し動作が発生した場合、操作は二つの段階を通過します。
- データの準備を待ち(ウェイティングデータ)
- プロセスにカーネルからデータをコピーする(コピーデータ)
注:2点、上記と異なるため、I / Oモデルの重要な2つの相が異なる有する上記の場合
第二に、ブロックI / Oモデル
Linuxでは、デフォルトでは、すべてのソケットは、このような何かを、典型的な読み出し動作プロセスをブロックしています。
理解することは、単純な:つまり、サーバーにデータ要求を送信するときに、サーバーが即時リターンデータが得られない場合があり、サーバがユーザ・プロセスの結果データ、待つ必要があり、ユーザー・プロセスは、サーバーのデータが準備されるまで待機している場所になっていますユーザメモリに独自のメモリからデータをコピーで、その後、ユーザプロセスは、その後、彼の操作は同じ日に行われ実行されます。
阻塞I/O特点
:I / O機能をブロックすると、2段階のI / Oの実行である(データ用の2つのウェイトとデータフェーズをコピー)ブロックされています。
実際には:ほとんどすべて(ソケットインタフェースを含む)I / Oインタフェースのブロックされています。これは、ネットワークプログラミングは、RECV(1024)を呼び出すと同時に、などの問題の多くをもたらした与え、スレッドがこの時間中にブロックされ、スレッドが任意の操作を実行したり、任意のネットワーク要求に応答することができません。
2.1溶液(マルチスレッド/マルチプロセスをイネーブル)
サーバー側では、複数のスレッド(またはプロセス)を使用。目的マルチスレッド(またはプロセス)は、各接続は個別のスレッド(またはプロセス)を有することを可能にすることであるので、接続を遮断する任意の他の接続に影響を与えないであろう。
問題の2.2方法
道路の数百に接続要求に対応しながらかかわらず、マルチスレッドやマルチプロセスが真剣にシステムリソースを占有し、外の世界に応じて、システム効率を低下させるの、顔に複数のプロセスやスレッドにすべての方法を回し、ほかのスレッドやプロセス自体仮死状態に簡単にアクセス。
2.3改善プログラム(スレッドプール/プロセスプール)
多くのプログラマは、「スレッド・プール」または使用して検討するかもしれない「コネクションプーリングを。」スレッドの合理的な数を維持する、スレッドの作成と破壊の頻度を減らし、アイドルスレッドは再び新しいタスクに任せるために、「スレッド・プール」。「接続プール」接続を作成し、近くの頻度を減らし、既存の接続を再利用しようとすると、バッファプールの接続を維持します。両方の技術は、システムのオーバーヘッドを減らすために非常に良いことができ、それは広くなどのWebSphere、Tomcatとデータベースの多様など、多くの大規模なシステムで使用されてきました。
問題の後に2.4改善プログラム
唯一ある程度「スレッド・プール」と「接続プール」技術は、リソース使用量をもたらすためにI / Oインタフェースを頻繁に呼び出しを和らげます。上限よりもはるかに高い要求があった場合また、いわゆる「プール」は常に、その上限が、プールははるかに良い効果でないときよりも良い外の世界への応答からなる「プール」システム。だから、「プール」を使用して、その顔の大きさ、および調整の規模に応じて、「プール」の大きさに応じて考慮されなければなりません。
また、何千回または数千ものクライアント要求、「スレッド・プール」または「接続プール」を発生したり、圧力の一部を緩和するのではなく、すべての問題を解決することはできません顔の一例に相当します。要するに、マルチスレッドモデルは、小規模なサービス要求、サービス要求に便利で効率的なソリューションであることができるが、大規模の面では、マルチスレッドモデルはボトルネックが発生し、非ブロッキングインタフェースがこの問題を解決しようとするために使用することができます。
第三に、非ブロックI / Oモデル
サーバへのユーザ処理要求データは、データが直ちにユーザプロセスに送信されていない場合、サーバは、この時点でのデータがありません。図から分かるように、その後、次回ユーザがこの中に読み出しクエリを開始することができます時間間隔内で他のことを行う、あるいは再び直接読み出し動作を送りました。データ・サーバは準備ができて、そして再びシステムを受け取ったら、ユーザー・プロセスを呼び出し、それはすぐに(この段階はまだブロックされている)ユーザメモリにデータをコピーして、返されます。
その非ブロックユーザー資本recvformシステムは、コールの後に呼び出し、プロセスがブロックされていないデータの準備ができていない場合、カーネルはすぐに、プロセスに戻さ、それはエラーが返されます。復帰処理の後、あなたは何かを行う、その後recvformシステムコールを開始することができます。上記のプロセスを繰り返し、サイクルがrecvformシステムコールになります。このプロセスは、一般的にポーリングと呼ばれています。データの準備ができるまで、カーネルのポーリングデータを確認し、データ処理のために、プロセスにデータをコピーします。全体のプロセスのためのデータのコピーは、プロセスがまだブロッキング状態に属していることに注意してください。そのため、I / Oを非ブロック、ユーザプロセスは、実際には常にデータ・レディか、サーバーについて質問することが必要です。
3.1ノンブロッキングI / Oインスタンス
#服务端
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen()
server.setblocking(False)#设置socket的接口为非阻塞,只要没人连服务端就报错
conn_lis = []
del_conn = []
while True:
try: # 只要没客户端连就报错,所以捕捉异常
conn,addr = server.accept()
conn.lis.append(conn)
except:
for conn in conn_lis:
try:# recv也是一个阻塞阶段,只要没人发数据就报错,所以捕捉异常
msg = conn.recv(1024)
if msg == b'':
del_conn.append(conn)
continue
print(msg)
conn.send(b'byebye')
except:pass
for conn in del_conn:
conn_lis.remove(conn)
conn.close()
del_conn.clear()
#客户端
import socket
import time
from threading import thread
def action():
while True:
client = socket.socket()
client.connect(('127.0.0.1',8080))
client.send(b'hello')
time.sleep(2)
client.recv(1024)
print(msg)
client.close()
for i in range(20):
t = thread(target=action)
t.start()
重要:非ブロックI / Oモデルは推奨されません。
タスク完了時間待ちで他の活動を行うことが可能ものの(つまり、他のタスクの提出を含め、「背景」とは、複数のタスク、「」しばらく「」実行を持つことができます)。
しかし、RECVを呼び出すために私たちの世論調査では大幅に遅くなり、効率が得られ、CPU占有率が向上します
タスク完了の応答遅れがポーリングに、読み出し動作の前に時間の各期間ので、増加され、そしてタスクがポーリングの間の任意の時間で完了することができます。これは、全体的なデータスループットにつながります。
四、I / Oマルチプレクサ
I / O多重化(I / O多重化)機構は、オペレーティングシステムによって提供され、選択/ポーリングモジュールを使用して、選択/ポーリングの利点は、単一のユーザプロセスがIながら、複数のネットワーク接続を扱うことができるということです/ O. その基本原理は、すべてのソケットの選択/世論調査は、ソケットがデータが到着していたときに、ポーリングの責任であり続けるだろう、とユーザー・プロセスに通知するということです。その流れが示されています:
ユーザーは、プロセスの呼び出しを選択すると同時に、サーバは「監視」されますが、すべてを担当しながら、その後、全体のプロセスは、ブロックされるソケットのいずれかにデータが準備でき、選択戻ったとき、ソケットを選択します。このときのユーザプロセスは、データをユーザプロセスにオペレーティング・システムからコピーされ、読み出し動作。
この数字がさらに悪化し、実際には、実際にはあまり違いはありません。図(I / Oをブロック)ブロックI / O。この2つのシステムコール(選択とのrecvfrom)を使用する必要があるため、I / Oをブロックしながら、のみシステムコール(のrecvfrom)を呼び出します。しかし、それは複数の接続を処理選択することができるという利点を持ちます。
注意:
処理は接続の非常に高い数値でない場合は選択を使用/ポーリングWebサーバは、必ずしもではないマルチスレッド+ブロックI / O性能が優れたWebサーバであるよりも、その後、遅延も大きくてもよいです。長所選択/世論調査は、より速く処理できる単一の接続のためではありませんが、それはより多くの接続を処理することができます。
上記のように多重化モデルでは、各ソケットに対して、通常、非ブロッキングに設定され、しかし、ユーザの全体のプロセスは、実際にはブロックされています。プロセスは単にソケットI / Oをブロックするのではなく、機能ブロックを選択しています。
結論:利点は、あなたが接続プロセスを複数選択することができるということです単一の接続には適用されません。
4.1ネットワークI / Oモデルを選択
#服务端
import socket
import select
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen()
server.setblocking(False)#设置socket的接口为非阻塞,只要没人连服务端就报错
re_lis = [server]
while True:
r_lis,w_lis,x_lis = select.select(re_lis,[],[])
for i in r_lis:
if i == server:
conn,addr = server.accept()
re_lis.append(conn)
else:
try:
msg = conn.recv(1024)
if msg == b'':
conn.close()
re_lis.remove(conn)
continue
print(msg)
conn.send(b'byebye')
except:pass
#客户端
import socket
import time
from threading import thread
def action():
while True:
client = socket.socket()
client.connect(('127.0.0.1',8080))
client.send(b'hello')
time.sleep(2)
client.recv(1024)
print(msg)
client.close()
for i in range(20):
t = thread(target=action)
t.start()
4.2のepollモデル
唯一のWindowsシステムを選択します
プールは、Windows、Linuxで使用することができます
唯一のLinuxでのepoll
select/pool这两种机制,用法都是一样的:
但实际上这两种方法虽然都是可以解决我们的阻塞,由于这两种方法也都是利用了轮询的方式去处理阻塞的问题,所以当有很多个用户同时来访问服务端的时候,可能我第一个连接对象没有给我发送请求的时候,我顺延的执行了第二个连接对象的而请求,然后一直顺延下去,当有10000个连接对象的话,我就要等到10000个连接对象都执行完了,我才能回过头去处理第一个连接队形的请求
所以select和pool这种方法都因为轮询的原因造成了执行任务的效率降低
epollをモデル私たちのためのpythonが残念ですが、我々はまた、メカニズムは、それが自動的にモデルの種類とそれを選択するために、私たちを助けることができるセレクタを呼びかけているPYTHON、それが実際にコールバックですので、それは、Linuxでのみ使用することができますので、解決する機能
第五に、駆動信号I / Oモデル(こちら)
例の一例を購入するため、モデルの概要:
# 老王去火车站买票,给售票员留下电话,有票后,售票员电话通知老王,然后老王去火车站交钱领票。
# 耗费:往返车站2次,路上2小时,免黄牛费100元,无需打电话
信号駆動型I / Oは、一般的に、実際に使用されていないので、私たちは理解するのは簡単です。
信号駆動型I / Oモデルは、アプリケーション・プロセスは、カーネルを伝えるために:データグラムの準備が整ったら、私に信号、SIGI / O信号の取り込み、信号処理を送信し、報告されたデータを得るために、私の関数を呼び出します。
第六に、非同期I / Oモデル
例の一例を購入するため、モデルの概要:
# 老王去火车站买票,给售票员留下电话,有票后,售票员电话通知老王并快递送票上门。
# 耗费:往返车站1次,路上1小时,免黄牛费100元,无需打电话
Linuxでは/ Oの下で非同期Iは実際にはカーネルバージョン2.6から導入され、多くの使用します。その過程を見てください:
ユーザーが読み取り操作のプロセスを開始した後、すぐに他の事をする開始することができます。一方、ビューのカーネルの点から、それはまず、非同期読み出しに供されたときに直ちに返され、それは、ユーザ・プロセスをブロックしないであろう。次に、データ準備のためのカーネルの待機が完了し、そしてそれはすべて完全だときに、ユーザメモリにデータをコピーし、カーネルは、操作が完了した読み伝える、信号を送信するために、ユーザ・プロセスを提供します。
七、I / Oモデルの比較分析
非ブロック対ブロッキング:
操作が完了するまで、I / Oブロックは、常に対応するプロセスに住むことになり、ブロッキング呼び出し、
また、カーネル内のデータを準備している場合、ノンブロッキングI / Oにすぐに戻ります。
同期I / Oおよび非同期I / Oの間の差:
定義:
要求プロセスにおけるI / Oオペランド/ O Nの結果は、I / Oオペランド/ Oまでブロックされたn終了する同期。
非同期I / Oオペランド/ O N要求プロセスがブロックされてはなりません。
違い:
同期I / O「I / O operatI / OをN行う 」 プロセスは、この定義に従って、4つのI / Oモデルは、前Iは、I / Oのブロッキング、非ブロッキングに、二つのカテゴリーに分けることができ、ブロックされる場合/ O、I / Oマルチプレクサは、カテゴリのすべての同期I / Oであり、非同期I / Oは後者のカテゴリに属しています。
いくつかは、ああI / Oブロックを非ブロックしていない、と言うかもしれません。そこに非常に「トリッキー」の場所は、あるの定義にいう「I / O operatI / O N」これはのrecvfromシステム・コールの例であり、実際のI / O操作を指します。カーネルデータの準備ができていない場合、このシステムコールのrecvfromの実装ではI / Oをノンブロッキング、この時間は、プロセスをブロックしません。しかし、カーネルデータの準備ができているとき、のrecvfromは、ユーザメモリにカーネルからデータをコピーします、プロセスをブロックするには、この時間は、この時点で、プロセスはブロックである、です。
非同期I / O:プロセスはI / O操作によって開始された場合、カーネルはプロセスを知らせる信号を送信するまで、それはもはや直接リターンを無視し、I / Oの完了は述べています。このプロセス全体では、プロセスが完全にブロックではありません。
各I / O示すようにモデル比較:
上記の説明の後、あなたは、I / Oは、まだ非常に明白である、ノンブロッキングI / Oと非同期の違いがあります。非ブロックI / Oには、ほとんどの時間は、プロセスはブロックされませんが、それはまだチェックして主導権を取るためのプロセスが必要であり、データは、プロセスの完了後に準備ができているときにも、ユーザーにデータをコピーするために、再度のrecvfrom呼び出すためのイニシアチブをとる必要があるが、メモリ。そして、非同期I / Oは完全に異なっています。それは終了する他人を合図そして、完成された他人(カーネル)に、全ユーザプロセスI / O操作のようなものです。この間、ユーザプロセスがI / Oの動作状態を確認する必要はありません、それはアクティブなデータをコピーする必要はありません。
そのように、I / O>非ブロッキングI / O>マルチプレクサI / O>信号ドライバI / O>非同期I / Oブロック:のように高いために、低からつ以上の閉塞モデルの範囲を見ることができるように効率がローからハイにあります。