GNU/Linux >> Belajar Linux >  >> Linux

Siapa yang menggunakan sinyal realtime POSIX dan mengapa?

Itu pertanyaan lama, tapi tetap saja.

Utas POSIX di Linux di glibc (NPTL) diimplementasikan menggunakan dua sinyal waktu nyata. Mereka disembunyikan dari pengguna (dengan menyesuaikan konstanta angka min/maks). Semua kejadian di mana panggilan perpustakaan harus disebarkan ke semua utas (seperti setuid ) dilakukan melalui itu:memanggil utas mengirim sinyal ke semua utas untuk menerapkan perubahan, menunggu pengakuan dan melanjutkan.


I/O asinkron.

Sinyal waktu nyata adalah mekanisme kernel untuk memberi tahu sistem Anda ketika operasi I/O telah selesai.

struct aiocb membuat koneksi antara permintaan I/O asinkron dan nomor sinyal.


Pertama-tama, perhatikan bahwa jawaban Ben benar. Sejauh yang saya tahu, seluruh tujuan sinyal waktu nyata di POSIX adalah sebagai mekanisme pengiriman waktu nyata untuk AIO, pemberitahuan antrean pesan, kedaluwarsa pengatur waktu, dan sinyal yang ditentukan aplikasi (baik internal maupun antar-proses).

Dengan demikian, sinyal secara umum adalah cara yang sangat buruk untuk melakukan sesuatu:

  • Penangan sinyal bersifat asinkron, dan kecuali jika Anda memastikan bahwa mereka tidak mengganggu fungsi async-signal-unsafe, mereka hanya dapat menggunakan fungsi async-signal-safe, yang sangat membatasi apa yang dapat mereka lakukan.
  • Pengendali sinyal adalah keadaan global. Pustaka tidak dapat menggunakan sinyal tanpa kontrak dengan program pemanggil terkait sinyal mana yang boleh digunakan, apakah diizinkan untuk membuatnya menginterupsi syscall, dll. Dan secara umum, status global hanyalah Hal Buruk .
  • Jika Anda menggunakan sigwait (atau Linux signalfd ekstensi) daripada penangan sinyal untuk memproses sinyal, mereka tidak lebih baik dari mekanisme IPC/notifikasi lainnya, dan masih berpotensi lebih buruk.

IO asinkron jauh lebih baik dicapai dengan mengabaikan API POSIX AIO yang dirancang dengan buruk dan hanya membuat utas untuk melakukan IO pemblokiran normal dan memanggil pthread_cond_signal atau sem_post ketika operasi selesai. Atau, jika Anda mampu membayar sedikit biaya kinerja, Anda bahkan dapat meneruskan kembali data yang baru dibaca ke diri Anda sendiri melalui pipa atau pasangan soket, dan meminta proses utas utama membaca file biasa secara asinkron dengan select atau poll seperti yang Anda lakukan pada soket/pipa/ttys.


Linux
  1. Mengapa Data Penting Dan Bagaimana Cara Melindunginya

  2. Kapan Dan Mengapa Saya Harus Menggunakan Pembaruan Apt-get?

  3. Python - Jebak semua sinyal

  1. signalfd() melewatkan sinyal

  2. Mengapa kita menggunakan su - dan bukan hanya su?

  3. Bisakah sinyal diabaikan (hilang)?

  1. Komunikasi antar-proses di Linux:Soket dan sinyal

  2. Hashing Kata Sandi Dan Mengapa Kami Membutuhkannya

  3. Linux – Mengapa Kami Menggunakan Su – Dan Bukan Hanya Su?