Apakah mungkin untuk membuktikan keamanan benang?

9

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?

Emiswelt
sumber
2
Ya, tetapi bahasa dunia nyata bisa menyebalkan karena semantik konkurennya tidak selalu didefinisikan dengan baik / diperbaiki. Juga, tidak semua hal dapat dipilih dalam setiap model. Ini bidang yang luas; google "Teori Konkurensi" untuk mendapatkan kesan. Secara khusus, ada teori kaya yang melibatkan jaring Petri.
Raphael

Jawaban:

9

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 Taba<bb<aST

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 < aabababa<bb<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 .

Logika Pengembaraan
sumber
6

Dari sisi praktis, ada sistem verifikasi VCC yang dapat digunakan untuk membuktikan secara resmi keamanan program C thread.

Ini adalah kutipan dari situs web:

VCC mendukung konkurensi - Anda dapat menggunakan VCC untuk memverifikasi program yang menggunakan konkurensi berbutir kasar dan berbutir halus. Anda bahkan dapat menggunakannya untuk memverifikasi primitif kontrol konkurensi Anda. Memverifikasi suatu fungsi secara implisit menjamin keamanan utangnya di setiap lingkungan bersamaan yang menghormati kontrak pada fungsi dan struktur datanya.

Anton Dergunov
sumber
2
Bagaimana cara kerjanya? Apa model formal yang mendasarinya? Perhatikan bahwa OP tidak (hanya) meminta alat!
Raphael
1

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:

vzn
sumber
1
Ini mungkin saran yang bagus (pemrograman), tetapi tidak menjawab pertanyaan (CS) sama sekali.
Raphael
1
?!? kritiknya tidak spesifik sama sekali
vzn