apa yang terjadi jika Interupsi terjadi setelah kunci mutex diperoleh

Saya memiliki program C/C++ multi-utas yang sangat sering melayani permintaan baca dan tulis. Untuk tujuan sinkronisasi, saya telah menggunakan mutex untuk mengunci dan membuka kunci. Semua thread baca dan tulis memperoleh kunci sebelum melakukan operasinya. Apa yang terjadi jika salah satu thread memperoleh kunci dan sebelum thread tersebut dapat melepaskan kuncinya, terjadi interupsi? Apakah thread akan melanjutkan eksekusi atau saya harus menanganinya secara manual?


person user3296247    schedule 06.03.2014    source sumber
comment
Tidak ada seorang pun yang secara ajaib akan membuka kunci mutex yang terkunci. Pemrograman dengan kunci memiliki kelemahan yaitu waktu tunggu bisa sangat lama dan kebuntuan dapat terjadi. (Meskipun demikian, penangan interupsi biasanya mengembalikan eksekusi ke titik terakhirnya.)   -  person Kerrek SB    schedule 06.03.2014


Jawaban (3)


Kunci sisi pengguna, termasuk Mutex, tidak memblokir interupsi. Hal ini penting, karena sering kali Mutex dapat digunakan untuk melindungi pembacaan file di disk, atau melindungi penerimaan paket dari jaringan, dan sebagainya, yang hasilnya bergantung pada interupsi.

Intinya, “tidak ada” yang terjadi jika ada interupsi. Interupsi ditangani oleh OS, sama seperti waktu lainnya. Tidak ada yang perlu dilakukan program Anda dalam kasus ini, hanya diperlukan beberapa mikrodetik atau milidetik lebih lama untuk melakukan apa pun yang Anda programkan untuk dilakukan jika hal ini terjadi.

Beberapa kunci sisi kernel, seperti SpinLocks memang memblokir interupsi (pada inti prosesor tersebut) untuk memastikan bahwa proses/utas lain tidak terjadwal selama proses ini. Ada juga batasan pada fungsi apa yang dapat digunakan oleh kernel dalam keadaan ini - misalnya, fungsi pemblokiran tidak dapat dipanggil (seperti sleep, wait-for-event, atau file-read atau file-write) selama kali ini, karena hal itu berpotensi menyebabkan kernel terkunci.

person Mats Petersson    schedule 06.03.2014

Thread pada akhirnya akan melanjutkan eksekusi, hal ini mungkin terjadi segera setelah kernel melayani interupsi atau penjadwal kernel mungkin memutuskan untuk mengirimkan thread lain yang siap dijalankan. Jika thread yang terputus telah memperoleh kunci yang sangat diperebutkan, maka thread lain yang mencoba memperoleh kunci tersebut akan memblokir (atau berputar, atau berputar dan kemudian memblokir, tergantung pada implementasi mutex) hingga thread yang terputus dikirim lagi, selesai bagian penting yang dilindungi oleh kunci, dan membukanya.

Dalam sistem yang memerlukan kinerja hampir real-time, penyetelan yang cermat dilakukan untuk menetapkan thread penting ke inti mereka sendiri (afinitas cpu) dan untuk memetakan interupsi ke inti lainnya. Selain itu, perhatian juga diberikan pada penggunaan kunci, terkadang menggunakan algoritma yang tidak memiliki kunci.

person amdn    schedule 06.03.2014

Fakta bahwa suatu thread memiliki kunci tidak dipengaruhi oleh sinyal. Jika thread memiliki kunci dan menerima sinyal, tidak ada hal istimewa yang akan terjadi. Faktanya, sinyal dan thread tidak tercampur dengan baik karena sinyal dirancang dengan mempertimbangkan proses. Itu karena Anda tidak bisa mengetahui thread mana yang akan mendapatkan sinyal. Cara yang tepat untuk mengatasinya adalah dengan memiliki thread khusus untuk mengelola sinyal, misalnya memblokir semua sinyal di setiap thread kecuali satu thread, yang tugasnya hanya menangani sinyal. Itulah cara yang tepat untuk menangani sinyal dalam perangkat lunak yang memiliki thread.

person neuro    schedule 06.03.2014