RedHawk Linux User's Guide version 6.3 æ¥æ¬èªç
RedHawk Linux User's Guide version 6.3 æ¥æ¬èªç
RedHawk Linux User's Guide version 6.3 æ¥æ¬èªç
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