15

名前付きセマフォと名前なしセマフォの類似点と相違点を理解しようとしているので、Google検索でこれが得られまし。ページの文言について質問がありましたが、次のように書かれています。

  • 名前のないセマフォは、複数のプロセスで使用できる可能性があります
  • 名前付きセマフォは複数のプロセスで共有可能

これらの 2 つの単語は、これら 2 つのタイプのセマフォの間に重要な違いを生み出しますか?それとも無関係ですか?

これまでのところ、私が持っているものは次のとおりです。

Similarities
    -Several processes can do something with the semaphore

Difference
    -Named are referenced with pathname and unnamed are referenced by pshared value

その定義から読み取れるのはそれだけです。それはすべてであり、それらは正しいですか?それとも、重要な概念が欠けていますか?

4

3 に答える 3

19

がセマフォにアクセスできるかという観点から考えてください。

名前のないセマフォ (それらを見つけるための名前やハンドルがない) は、事前に合意されたメモリ ロケーションに存在する必要があります。通常、それは(1)fork子プロセスの場合の共有メモリ(の後に子によって継承される)です。または (2) 共有メモリ、グローバル変数、または単一プロセスのスレッド間で共有される場合のヒープ。ここで重要なことは、親、子、またはスレッドのコードがセマフォのアドレスを既に知っているということです。

名前付きセマフォは、無関係なプロセスに必要です。たとえば、プロデューサーとコンシューマーが 2 人の異なる開発者によって作成され、まったく関係のないプロセスとして実行される場合があります。ただし、セマフォで保護する必要のあるリソースを共有する必要があります。名前付きセマフォは、セマフォへのパスを提供します。

実際には、すべてのシナリオで名前付きセマフォを使用できますが、プログラムが関連しており、名前なしセマフォにアクセスする方法を既に知っている場合、不要なパスやアクセス許可などを処理する必要があるため、少し余分な荷物が伴います。たとえば、スレッド間でリソースを共有するために名前付きセマフォを使用するのは少しばかげています。スレッドは、名前のないセマフォが存在する可能性のある同じメモリに既にアクセスしています。

于 2012-10-30T22:06:01.717 に答える
8

受け入れられた答えは間違っています(@electronによって与えられた他の答えも同様です)。名前のない POSIX セマフォは、無関係なプロセスで使用できます。ここに示すように、関連するプロセスからアクセス可能な共有メモリにデータ構造を保存し、共有可能フラグを 1 に設定して初期化するだけです (恥知らずにhttp://blog.superpat.com/2010/07/14/からコピー)。セマフォ-on-linux-sem_init-vs-sem_open/ ):

int shm;
sem_t * mutex;

if ((shm = shm_open("myshm", O_RDWR | O_CREAT, S_IRWXU))   0) {
    perror("shm_open");
    exit(1);
}

if (ftruncate(shm, sizeof(sem_t)) < 0 ) {
    perror("ftruncate");
    exit(1);
}

if ((mutex = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED, shm, 0)) == MAP_FAILED) {
    perror("mmap");
    exit(1);
}

if (sem_init(mutex, 1, 1) < 0) {
    perror("semaphore initialization");
    exit(1);
}

その共有メモリをそのアドレス空間にマッピングする別のプロセスは、同じセマフォにアクセスし、元のプロセスと同期できます。sem_init()の POSIX 仕様とそのLinux の man ページも参照してください。

于 2015-11-17T01:50:53.170 に答える
-2

名前付きセマフォには がありactual name、複数の無関係なプロセスfile systemによって存在する可能性があります。shared

名前のないセマフォは、同じプロセスthreadsに属している場合にのみ使用できます。

セマフォは関数を使用して作成されます

                 sem init(ptr_semaphore, flag, initial_value);

どこ

ptr_semaphore : セマフォへのポインタ

flag : 共有レベルを示すフラグ

initial_value : セマフォの初期値

に渡すflag=0sem_init()セマフォを作成したプロセスに属するスレッドのみがセマフォを共有できます。したがって、名前のないセマフォが作成されます。

          sem_init(ptr_semaphore,0,initial_value)   //unamed semaphore

ゼロ以外の値を渡すと、allow 他のプロセスもセマフォにアクセスします。したがって、名前付きセマフォになります。

          sem_init(ptr_semaphore,1,initial_value)   //named semaphore
于 2015-07-28T12:52:36.910 に答える