GNU/Linux >> Linux の 問題 >  >> Linux

sig_atomic_t は実際にどのように機能しますか?

sig_atomic_t アトミック データ型ではありません。シグナルハンドラのコンテキストで使用できるのはデータ型だけです。それだけです。そのため、名前を「シグナル処理に関連するアトミック」と読んだほうがよいでしょう。

シグナル ハンドラーとの通信を保証するために必要なのは、アトミック データ型のプロパティの 1 つだけです。つまり、読み取りと更新は常に一貫した値を参照するという事実です。その他のデータ型 (おそらく long long など) ) は、下位部分と上位部分のいくつかのアセンブラー命令で記述できます。 sig_atomic_t 一度に読み書きできることが保証されています。

したがって、プラットフォームは sig_atomic_t として任意の整数ベース タイプを選択できます。 volatile sig_atomic_t であることを保証できます。 シグナルハンドラで安全に使用できます。多くのプラットフォームが int を選択しました int を知っているからです。 単一の命令で書かれています。

最新の C 標準である C11 にはアトミック型がありますが、これはまったく別のものです。それらの一部 (「ロックフリー」のもの) はシグナル ハンドラーでも使用できますが、これもまたまったく別の話です。


sig_atomic_t に注意してください スレッド セーフではなく、非同期シグナル セーフのみです。

アトミックには 2 種類のバリアが含まれます:

<オール>
  • コンパイラ バリア。コンパイラがアトミック変数からの読み取り/アトミック変数への読み取り/書き込みを、他の変数への読み取りおよび書き込みと比較して並べ替えないようにします。これが volatile です
  • CPU バリアと可視性。 CPU が読み取りと書き込みの順序を変更しないようにします。 x86 では、アラインされた 1、2、4、8 バイトのストレージへのすべてのロードとストアはアトミックです。可視性により、ストアが他のスレッドから見えるようになります。繰り返しになりますが、Intel CPU では、キャッシュ コヒーレンスとメモリ コヒーレンス プロトコル MESI により、ストアは他のスレッドからすぐに認識されます。しかし、それは将来変わるかもしれません。詳細については、Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A の §8.1 LOCKED ATOMIC OPERATIONS を参照してください。
  • このテーマの包括的な取り扱いについては、atomic Weapons:The C++ Memory Model and Modern Hardware をご覧ください。


    Linux
    1. NGINXとは何ですか?それはどのように機能しますか?

    2. Webサーバーとは何ですか?Webサーバーはどのように機能しますか?

    3. Awkの「!a [$ 0] ++」はどのように機能しますか?

    1. フォーク爆弾はどのように機能しますか?

    2. rm はどのように機能しますか? rm は何をしますか?

    3. Linux でデバッガーはどのように機能しますか?

    1. Makefileとは何ですか?どのように機能しますか?

    2. スティッキービットはどのように機能しますか?

    3. DNSとは何ですか?どのように機能しますか?