12.07.2015 Views

RedHawk Linux User's Guide version 6.3 日本語版

RedHawk Linux User's Guide version 6.3 日本語版

RedHawk Linux User's Guide version 6.3 日本語版

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>条 件 同 期 ツールの 適遚 用 5再 スケジューリング 変 数 、スピンロック、サーバ・システムコールは、 共 有 メモリ 領 域 内 のメールボックスの 使 用 を 通 して 生 産 者 プロセスと 消 費 者 プロセスのデータ 交 換 を 可 能 にする 機 能 を 設計 するために 使 用 することが 可 能 です。 消 費 者 が 空 のメールボックスを 見 つけた 時 、それは 新 しいデータが 到 着 するまでブロックします。 生 産 者 がメールボックスの 中 に 新 しいデータを 挿 入 した 後 、それは 待 機 中 の 消 費 者 を 起 こします。 消 費 者 がそれを 処 理 するよりも 早 く、 生 産 者 がデータを 生 成 した 時 、 類 似 の 状 況 が 発 生 します。 生 産 者 が 満 杯 のメールボックスを 見 つけた 時 、それはデータが 削 除 されるまでプロックします。 消 費 者 がデータを 削 除 した 後 、それは 待 機 中 の 生 産者 を 起 こします。メールボックスは 以 下 のように 表 すことが 可 能 です:struct mailbox {struct spin_mutex mx; /* serializes access to mailbox */queue_of consumers; /* waiting consumers */queue_of data; /* the data, type varies */};mx フィールドはメールボックスへ 順 番 にアクセスするために 使 用 されます。dataフィールドは生 産 者 から 消 費 者 へ 渡 される 情 報 を 表 します。fullフィールドはメールボックスが 満 杯 なのか 空なのかを 示 すために 使 用 されます。producerフィールドはメールボックスが 空 になるのを 待 っているプロセスを 確 認 します。consumerフィールドはデータの 到 着 を 待 っているプロセスを 確認 します。spin_acquireとspin_releaseの 機 能 の 使 用 して、 消 費 者 がメールボックスからデータを 取 り 出 すことが 可 能 になる 関 数 は 以 下 のように 定 義 することが 可 能 です:voidconsume (box, data)struct mailbox *box;any_t *data;{spin_acquire (&box–>mx, &rv);while (box–>data == empty) {enqueue (box–>consumers, rv.rv_glwpid);spin_unlock (&box–>mx);server_block (0, &rv, 0);spin_acquire (&box–>mx, &rv);}*data = dequeue (box–>data;spin_release (&box–>mx, &rv);}この 関 数 では、 消 費 者 プロセスはデータのチェックおよび 削 除 の 前 にメールボックスをロックすることに 注 意 してください。もしこれが 空 のメールボックス 見 つけた 場 合 、 生 産 者 がデータを 挿入 するのを 許 可 するためにメールボックスをアンロックし、データの 到 着 を 待 つためにserver_blockを 呼 び 出 します。 消 費 者 が 起 こされた 時 に 再 度 メールボックスをロックし、データをチェックする 必 要 があります( 消 費 者 が 早 期 にシグナルによって 起 こされる 可 能 性 があり、メールボックスがデータを 収 容 している 保 証 がない)。5-42

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!