1. Beberapa konsep penting tentang konkurensi tinggi
1.1 sinkron dan asinkron
Pertama -tama, sinkronisasi dan asinkron yang disebutkan di sini merujuk pada aspek panggilan fungsi/metode.
Jelas, panggilan sinkron akan menunggu metode ini untuk kembali, dan panggilan asinkron akan kembali secara instan, tetapi panggilan asinkron akan kembali secara instan tidak berarti bahwa tugas Anda telah selesai. Ini akan mengatur utas di latar belakang untuk melanjutkan tugas.
1.2 Concurrency dan paralelisme
Concurrency dan paralelisme serupa dalam penampilan eksternal. Seperti yang ditunjukkan pada gambar, paralelisme adalah ketika dua tugas dilakukan secara bersamaan, sementara konkurensi adalah melakukan satu tugas pada satu waktu dan kemudian beralih ke tugas lain. Oleh karena itu, satu CPU tidak dapat paralel, itu hanya bisa konkurensi.
1.3 Zona Kritis
Area kritis digunakan untuk mewakili sumber daya publik atau data bersama. Ini dapat digunakan oleh beberapa utas, tetapi hanya satu utas yang dapat menggunakannya sekaligus. Setelah sumber daya area kritis ditempati, utas lain harus menunggu jika mereka ingin menggunakan sumber daya ini.
1.4 Pemblokiran dan non-blocking
Pemblokiran dan non-blocking biasanya menggambarkan pengaruh timbal balik antara beberapa utas. Misalnya, jika utas menempati sumber daya area kritis, maka semua utas lain yang membutuhkan sumber ini harus menunggu di area kritis ini, dan menunggu akan menyebabkan utas digantung. Ini memblokir. Pada saat ini, jika utas yang menempati sumber daya tidak mau melepaskan sumber daya, maka semua utas lainnya memblokir di area kritis ini tidak dapat berfungsi.
Non-blocking memungkinkan beberapa utas untuk memasuki zona kritis secara bersamaan
Oleh karena itu, kinerja pemblokiran umumnya tidak terlalu baik. Menurut statistik umum, jika utas ditangguhkan di tingkat sistem operasi dan telah membuat saklar konteks, biasanya dibutuhkan 80.000 siklus waktu untuk melakukan ini.
1.5 kebuntuan, kelaparan, kunci hidup
Kebuntuan yang disebut mengacu pada penyumbatan yang disebabkan oleh sumber daya yang bersaing atau berkomunikasi satu sama lain selama proses pelaksanaan dua atau lebih proses. Tanpa kekuatan eksternal, mereka tidak akan dapat maju. Pada saat ini, sistem disebut Deadlocked atau sistem memiliki kebuntuan. Proses -proses ini yang selalu menunggu satu sama lain disebut proses kebuntuan. Sama seperti mobil di gambar di bawah ini ingin bergerak maju, tetapi tidak ada yang bisa bergerak maju.
Namun, meskipun kebuntuan adalah fenomena yang buruk, itu adalah masalah statis. Setelah kebuntuan terjadi, prosesnya macet dan tingkat hunian CPU juga 0. Ini tidak akan menempati CPU, itu akan dipanggil. Relatif berbicara, relatif mudah ditemukan dan dianalisis.
Sesuai dengan kebuntuan adalah kunci langsung.
Kunci langsung berarti bahwa hal -hal yang dapat 1 dapat menggunakan sumber daya, tetapi memungkinkan hal -hal lain untuk menggunakan sumber daya terlebih dahulu; Hal -hal 2 dapat menggunakan sumber daya, tetapi juga memungkinkan hal -hal lain untuk menggunakan sumber daya terlebih dahulu, sehingga keduanya rendah hati dan tidak dapat menggunakan sumber daya.
Misalnya, Anda bertemu seseorang di jalan, yang kebetulan berjalan ke arah Anda yang berlawanan dan bertemu dengan Anda secara langsung, Anda semua ingin melepaskan satu sama lain. Anda pindah ke kiri, dan dia pindah ke kiri, tetapi mereka berdua masih tidak bisa pergi ke sana. Pada saat ini, Anda pindah ke kanan dan dia bergerak ke kanan, dan melanjutkan dengan cara ini.
Ketika utas mendapatkan sumber daya, ia menemukan bahwa utas lain juga memikirkan sumber daya ini karena mereka belum memperoleh semua sumber daya, jadi untuk menghindari kebuntuan, mereka menyerahkan semua sumber daya yang mereka miliki. Jika utas lain melakukan hal yang sama, mereka membutuhkan sumber daya yang sama, seperti A memegang sumber daya, B memiliki sumber daya B, dan setelah melepaskan sumber daya, A memperoleh sumber daya B, dan B memperoleh sumber daya, dan ini diulangi, kunci langsung terjadi.
Kunci langsung lebih sulit dideteksi daripada kebuntuan, karena kunci langsung adalah proses yang dinamis.
Kelaparan berarti satu atau lebih utas tidak dapat memperoleh sumber daya yang diperlukan karena berbagai alasan, yang membuat mereka tidak dapat dieksekusi.
1.6 Level Konkurensi
Level Concurrency: Pemblokiran dan non-blocking (non-blocking dibagi menjadi bebas hambatan, bebas kunci, dan bebas menunggu)
1.6.1 Pemblokiran
Saat satu utas memasuki bagian kritis, utas lain harus menunggu
1.6.2 Aksesibilitas
Dibandingkan dengan penjadwalan non-blocking, penjadwalan pemblokiran adalah strategi pesimistis, yang percaya bahwa memodifikasi data bersama-sama cenderung membuat data menjadi buruk. Alih -alih memblokir penjadwalan, ini adalah strategi yang optimis, yang percaya bahwa memodifikasi data mungkin tidak selalu membuat data menjadi buruk. Namun, ini adalah strategi masuk yang luas dan keluar yang ketat. Ketika menemukan bahwa suatu proses memiliki kompetisi data dan konflik di area kritis, metode penjadwalan bebas penghalang akan mengembalikan data.
Dalam metode penjadwalan bebas hambatan ini, semua utas setara dengan mengambil snapshot dari suatu sistem. Mereka akan terus berusaha mengambil snapshot sampai valid.
1.6.3 Lockless
Itu bisa diakses
Pastikan ada utas yang bisa menang
Dibandingkan dengan aksesibilitas, aksesibilitas tidak menjamin bahwa operasi dapat diselesaikan ketika ada persaingan, karena jika menemukan konflik di setiap operasi, itu akan terus berusaha. Jika utas di area kritis saling mengganggu, itu akan menyebabkan semua utas macet di area kritis, dan kemudian kinerja sistem akan memiliki dampak yang besar.
Lockless menambahkan kondisi baru untuk memastikan bahwa satu utas dapat memenangkan setiap kompetisi, yang memecahkan masalah kehebatan penghalang. Setidaknya itu memastikan bahwa semua utas dijalankan dengan lancar.
Kode berikut adalah kode perhitungan bebas kunci khas di java
Tanpa kunci adalah umum di java
while (! atomicvar.comppareandset (localvar, localvar+1)) {localvar = atomicvar.get (); }1.6.4 Tidak Menunggu
Tanpa kunci
Semua utas harus diselesaikan dalam langkah terbatas
Tidak ada kelaparan
Pertama-tama, premis No Waiting adalah berdasarkan bebas kunci. Bebas kunci hanya memastikan bahwa harus ada masuk dan keluar di area kritis. Namun, jika prioritas masuk sangat tinggi, maka beberapa utas dengan prioritas rendah di area kritis mungkin lapar dan tidak dapat meninggalkan area kritis. Maka tidak akan menunggu akan menyelesaikan masalah ini, yang memastikan bahwa semua utas harus diselesaikan dalam langkah terbatas, dan tentu saja tidak ada kelaparan.
Tidak ada menunggu adalah tingkat paralelisme tertinggi, yang dapat memungkinkan sistem ini untuk mencapai keadaan optimal.
Kasus -kasus khas tanpa menunggu:
Jika hanya ada utas baca dan tidak ada utas utas, maka ini pasti tanpa menunggu.
Jika ada keduanya baca utas dan utas tulis, dan sebelum setiap utas tulis, salin data dan kemudian ubah salinan alih -alih memodifikasi data asli, karena tidak ada konflik dalam modifikasi salinan, maka proses modifikasi juga tanpa menunggu. Sinkronisasi akhir hanya untuk menimpa data tertulis.
Karena persyaratan bebas menunggu relatif tinggi dan sulit untuk diterapkan, bebas kunci akan digunakan lebih luas.
2. Dua undang -undang penting tentang paralelisme
Kedua undang -undang tersebut terkait dengan rasio akselerasi
2.1 Hukum Amdahl
Tentukan rumus perhitungan dan batas atas teoritis dari rasio akselerasi setelah paralelisasi sistem serial
Definisi Rasio Akselerasi: Rasio Akselerasi = Waktu Sistem Dikonsumsi Sebelum Optimasi / Waktu Sistem yang Dikonsumsi Setelah Optimasi
Misalnya:
Rasio Akselerasi = Waktu Sistem Dikonsumsi Sebelum Optimasi / Waktu Sistem Dikonsumsi Setelah Optimasi = 500/400 = 1.25
Teorema ini menunjukkan bahwa meningkatkan jumlah prosesor CPU tidak selalu memainkan peran yang efektif dalam meningkatkan proporsi modul paralel dalam sistem. Hanya dengan meningkatkan jumlah prosesor paralel secara wajar, rasio akselerasi maksimum dapat diperoleh dengan investasi terkecil.
2.2 Hukum Gustafson
Jelaskan hubungan antara jumlah prosesor, rasio serial dan rasio akselerasi
Kemudian rasio akselerasi = NF (N-1) // Proses derivasi dihilangkan
Selama ada paralelisasi yang cukup, rasio percepatan sebanding dengan jumlah CPU.