TEDIA会員に登録したメールアドレスとパスワードを入力してください

メールアドレス:

     パスワード:


パスワードを忘れた方はパスワードの確認を行ってください。

TEDIA会員へのご登録がお済みで無い方はこちらで登録ができます


>> テクノロジーポータル TEDIA トップページへ戻る <<

Think IT Software Developer's Think IT Find-IT 失敗しないソフト選び Find-IT TEDIA テクノロジーポータル TEDIA インストールマニアックス2008 インストールマニアックス2008

TEDIA SponsorsOpen Source Web Development Tutorials - Dev Shed

Linuxカーネルに与えるファイルI/Oのアドバイス
(2009/03/24公開)

同期化動作、同期動作、非同期動作

 Unixシステムでは、synchronized(同期化)、nonsynchronized(非同期化)、synchronous(同期)、asynchronous(非同期)という言葉が頻繁に使われます。実際、これらの用語はずいぶん紛らわしいのですが、その点はあまり考慮されていません-英語では、“synchronous”と“synchronized”の意味はさほど違わないのです!

 Synchronous(同期)書き込み動作は、書き込んだデータが-少なくとも-カーネルのバッファキャッシュに格納されるまで戻りません。Synchronous(同期)読み出し動作は、読み出したデータがアプリケーションによって与えられたユーザースペースのバッファに格納されるまで戻りません。一方、asynchronous(非同期)書き込み動作は、データがユーザースペースを出る前でも戻る可能性があります。Asynchronous(非同期)読み出し動作は、読み出しデータが得られる前に戻る可能性があります。すなわち、これらの動作は、後のために、待ち行列に入ることができるのです。もちろん、その場合は、実際にその動作が完了した時や成功度を特定する何らかのメカニズムが必要です。

 Synchronized(同期化)動作は、単なる同期動作より制限的かつ安全です。Synchronized(同期化)書き込み動作はデータをディスクにフラッシュするので、ディスク上のデータは、常時かつ確実に、対応するカーネルバッファと同期化されています。Synchronized(同期化)読み出し動作は、常に、(おそらくディスクから)データの一番新しいコピーを戻します。

 要するに、synchronous(同期)とasynchronous(非同期)は、I/O動作が何らかのイベント(例えば、データの格納)の発生を待ってから戻るか否かを意味します。一方、synchronized(同期化)とnonsynchronized(非同期化)は、厳密に発生すべきイベントの内容(例えば、データをディスクへ書き込む)を指摘します。

 通常、Unixの書き込み動作はsynchronous(同期)かつnonsynchronized(非同期化)であり、読み出し動作はsynchronous(同期)かつasynchronous(非同期)です。書き込み動作では、以下に示すとおり、2つの特性のあらゆる組み合わせが可能です。

Synchronous(同期)× Synchronized(同期化)
 書き込み動作は、データがディスクにフラッシュされるまで戻りません。ファイルオープン時にO_SYNCが指定されている時の動作です。

Synchronous(同期)×Nonsynchronized(非同期化)
 書き込み動作は、データがカーネルバッファに格納されるまで戻りません。これが通例の動作です。

Asynchronous(非同期)×Synchronized(同期化)
 書き込み動作は、要求が待ち行列に入ると直ちに戻ります。最終的に書き込み動作が実行されると、データがディスク上に存在することが保証されます。

Asynchronous(非同期)×Nonsynchronized(非同期化)
 書き込み動作は、要求が待ち行列に入ると直ちに戻ります。最終的に書き込み動作が実行されると、データは少なくともカーネルバッファに格納されていることが保証されます。

 失効したデータを読み出しても意味がありませんから、読み出し動作は常にsynchronized(同期化)です。しかし、以下に示すとおり、読み出し動作はsynchronous(同期)とasynchronous(非同期)の両方が可能です。

同期化
同期

 読み出し動作は、最新のデータが与えられたバッファに格納されるまで戻りません。(これが通例の動作です)

非同期
 読み出し動作は、要求が待ち行列に入ると直ちに戻ります。しかし、最終的に読み出し動作が実行されると、戻されるデータは最新の内容に更新されています。

 第2章では、(O_SYNCflagを利用して)書き込みを同期化(synchronized)する方法、および、(fsync()と友人を利用して)ある時点現在ですべてのI/Oの同期化を確保する方法を解説しました。では、読み出しと書き込みを非同期(asynchronous)にする方法を見てみましょう。


前のページ     1    2    3    4    次のページ

Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.