Apa yang terjadi pada proses Linux multithreaded jika mendapat sinyal?

20

Jika proses Unix (Posix) menerima sinyal, penangan sinyal akan berjalan.

Apa yang akan terjadi padanya dalam proses multithread? Utas mana yang menerima sinyal?

Menurut pendapat saya, API sinyal harus diperluas untuk menangani hal itu (yaitu utas penangan sinyal harus dapat ditentukan), tetapi memburu informasi di internet Saya hanya menemukan api sepanjang tahun di milis kernel linux dan di forum yang berbeda. Seperti yang saya pahami, konsep Linus berbeda dari standar Posix, dan pertama-tama beberapa lapisan compat dibuat, tetapi sekarang Linux mengikuti model posix.

Bagaimana keadaan saat ini?

peterh - Pasang kembali Monica
sumber
3
Duplikat stackoverflow.com/questions/11679568/... "pthreads (7) menjelaskan bahwa POSIX.1 memerlukan semua utas dalam atribut berbagi proses, termasuk disposisi sinyal"
steve
@steve Terima kasih, tetapi 1) ada di situs SE lain 2) spesifikasi ini tidak menentukan dengan jelas, apa yang sebenarnya akan terjadi. Apa artinya, penangan sinyal akan dipanggil pada semua utas, tetapi tampaknya sedikit surealis bagi saya. 3) Jawaban itu tidak merinci apa model Linus dan mengapa / bagaimana ia digunakan saat ini.
peterh

Jawaban:

9

Entri dalam POSIX pada " Pembangkitan Sinyal dan Pengiriman " dalam "Dasar Pemikiran: Antarmuka Sistem Informasi Umum" mengatakan

Sinyal yang dihasilkan untuk suatu proses dikirimkan hanya ke satu utas. Jadi, jika lebih dari satu utas memenuhi syarat untuk menerima sinyal, seseorang harus dipilih. Pilihan utas sepenuhnya diserahkan kepada implementasi, baik untuk memungkinkan jangkauan terluas dari implementasi yang sesuai dan untuk memberikan implementasi kebebasan untuk mengirimkan sinyal ke utas "yang paling mudah" jika ada perbedaan dalam kemudahan pengiriman antara utas yang berbeda.

Dari signal(7)manual di sistem Linux:

Sinyal dapat dihasilkan (dan dengan demikian ditangguhkan) untuk suatu proses secara keseluruhan (misalnya, ketika dikirim menggunakan kill(2)) atau untuk utas tertentu (misalnya, sinyal tertentu, seperti SIGSEGV dan SIGFPE, dihasilkan sebagai konsekuensi dari mengeksekusi mesin tertentu- instruksi bahasa diarahkan utas, demikian juga sinyal ditargetkan pada utas tertentu menggunakan pthread_kill(3)). Sinyal yang diarahkan pada proses dapat dikirimkan ke salah satu utas yang saat ini tidak memiliki sinyal yang diblokir. Jika lebih dari satu utas memiliki sinyal yang tidak diblokir, maka kernel memilih utas yang sewenang-wenang untuk mengirimkan sinyal.

Dan di pthreads(7):

Utas memiliki pengaturan tumpukan sinyal alternatif yang berbeda. Namun, pengaturan tumpukan sinyal thread baru disalin dari thread yang membuatnya, sehingga thread awalnya berbagi stack sinyal alternatif (diperbaiki di kernel 2.6.16).

Dari pthreads(3)manual pada sistem OpenBSD (sebagai contoh pendekatan alternatif):

Penangan sinyal biasanya dijalankan pada tumpukan utas yang saat ini sedang dijalankan.

(Saya saat ini tidak mengetahui bagaimana hal ini ditangani ketika beberapa utas mengeksekusi secara bersamaan pada mesin multi-prosesor)

Implementasi LinuxThread yang lebih tua dari utas POSIX hanya memungkinkan utas tunggal yang berbeda untuk ditargetkan oleh sinyal. Dari pthreads(7)pada sistem Linux:

LinuxThreads tidak mendukung gagasan sinyal yang diarahkan pada proses: sinyal hanya dapat dikirim ke utas tertentu.

Kusalananda
sumber