Diberikan program yang terdiri dari variabel dan instruksi yang memodifikasi variabel-variabel ini, dan primitif sinkronisasi (monitor, mutex, kunci java disinkronkan atau kunci C #), apakah mungkin untuk membuktikan bahwa program seperti itu aman untuk digunakan?
Apakah ada model formal untuk menggambarkan hal-hal seperti keselamatan benang atau kondisi balap?
Jawaban:
Membuktikan bahwa sebuah program "amankan" adalah sulit. Namun, adalah mungkin untuk secara konkret dan formal mendefinisikan istilah "ras data". Dan adalah mungkin untuk menentukan apakah suatu jejak eksekusi dari suatu menjalankan program tertentu tidak atau tidak memiliki ras data dalam waktu sebanding dengan ukuran jejak. Jenis analisis setidaknya kembali ke tahun 1988: Barton P. Miller, Jong-Deok Choi, "Mekanisme untuk Debugging Efisien dari Program Paralel", Conf. pada Prog. Lang. Dsgn. dan Impl. (PLDI-1988): 135-144 .
Diberikan jejak eksekusi, pertama-tama kita menentukan urutan-sebelum-sebagian antara peristiwa dalam jejak. Mengingat dua kejadian dan yang terjadi pada utas yang sama maka atau . (Peristiwa pada utas yang sama membentuk urutan total yang diberikan oleh semantik berurutan dari bahasa pemrograman.) Peristiwa sinkronisasi (ini bisa berupa perolehan dan pelepasan mutex, misalnya), memberikan inter-utas tambahan yang terjadi sebelum pesanan parsial. (Jika utas merilis mutex dan kemudian utas memperoleh mutex itu, kami katakan bahwa pelepasan terjadi sebelum sebelum mengakuisisi.)b a < b b < a S TSebuah b a < b b < a S T
Kemudian diberi dua akses data (membaca atau menulis ke variabel yang bukan variabel sinkronisasi) dan yang ke lokasi memori yang sama, tetapi dengan utas yang berbeda dan di mana atau adalah operasi tulis, kami mengatakan bahwa ada data- balapan antara dan jika tidak atau .b a b a b a < b b < aa b a b a b a<b b<a
Standar C ++ 11 adalah contoh yang baik. (Bagian yang relevan adalah 1,10 dalam spesifikasi draf yang tersedia online.) C ++ 11 membedakan antara objek sinkronisasi (mutex, dan variabel yang dideklarasikan dengan
atomic<>
tipe) dan semua data lainnya. Spesifikasi C ++ 11 mengatakan bahwa programmer dapat beralasan tentang akses data pada jejak program multithreaded seolah-olah konsisten secara berurutan jika akses data semuanya bebas data-ras.Alat Helgrind (bagian dari Valgrind) melakukan pendeteksian data-raced yang terjadi sebelum data berdasarkan seperti halnya beberapa alat komersial (misalnya, Intel Inspector XE.) Algoritma dalam alat modern didasarkan pada menjaga jam vektor yang terkait dengan setiap utas dan sinkronisasi obyek. Saya pikir teknik ini menggunakan jam vektor untuk deteksi ras data dipelopori oleh Michiel Ronsse; Koen De Bosschere: "RecPlay: catatan praktis / sistem replay yang terintegrasi penuh", ACM Trans. Komputasi. Syst. 17 (2): 133-152, 1999 .
sumber
Dari sisi praktis, ada sistem verifikasi VCC yang dapat digunakan untuk membuktikan secara resmi keamanan program C thread.
Ini adalah kutipan dari situs web:
sumber
Ini adalah area yang sangat sulit untuk memastikan kebenaran program sejauh mengesampingkan kondisi balapan, semacam "tumit achilles" dari pemrosesan paralel. Pendekatan terbaik untuk kebenaran program umumnya untuk menghindari primitif tingkat rendah dan bekerja dengan pola desain tingkat tinggi (misalnya dari perpustakaan) yang memastikan sinkronisasi utas. Ada satu model CSP, yang mengkomunikasikan proses berurutan oleh Hoare, yang memiliki beberapa bukti kebenaran mengingat bahwa pengembang membatasi diri pada "kerangka kerja". Ini memiliki beberapa kesamaan konseptual & originasi kronologis / tumpang tindih untuk unix "pipa dan filter" meskipun belum menemukan hubungan langsung di antara keduanya.
Dua kerangka kerja lain yang berupaya meningkatkan kebenaran paralelisasi melalui pola desain, dan yang memiliki sebagian besar algoritma pola desain / standar yang diketahui untuk tujuan ini:
sumber