Sementara saya tahu pertanyaan tentang hal ini sudah dibahas (mis. Https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), saya merasa saya tidak mendapat jawaban yang memuaskan .
Pertanyaannya adalah: mengapa JVM tidak mendukung thread hijau lagi?
Ia mengatakan ini pada FAQ gaya kode Java :
Thread hijau mengacu pada mode operasi untuk Java Virtual Machine (JVM) di mana semua kode dieksekusi dalam utas sistem operasi tunggal.
Dan ini berakhir di java.sun.com :
Kelemahannya adalah bahwa menggunakan utas hijau berarti utas sistem di Linux tidak dimanfaatkan dan oleh karenanya mesin virtual Java tidak dapat diskalakan ketika CPU tambahan ditambahkan.
Tampak bagi saya bahwa JVM dapat memiliki kumpulan proses sistem yang sama dengan jumlah core, dan kemudian menjalankan thread hijau di atasnya. Ini dapat menawarkan beberapa keuntungan besar ketika Anda memiliki jumlah utas yang sangat besar yang sering diblokir (sebagian besar karena JVM saat ini membatasi jumlah utas).
Pikiran?
sumber
Jawaban:
Saya ingat JVM meninggalkan thread hijau dan pindah ke thread asli. Ini karena dua alasan sederhana: benang hijau adalah sampah yang jujur, dan ada kebutuhan untuk mendukung prosesor multi-inti dengan upaya pengembang terbatas yang tersedia di Sun.
Ini memalukan - utas hijau memberikan abstraksi yang jauh lebih baik, memungkinkan konkurensi menjadi alat yang berguna bukan batu sandungan. Tetapi benang hijau tidak ada gunanya jika beberapa rintangan tidak dapat diatasi:
mereka harus menggunakan semua core cpu yang tersedia untuk mereka
switching konteks harus murah
I / O dapat memblokir utas yang terlibat di dalamnya, tetapi bukan utas lainnya dan tentu saja tidak semua utas lainnya, yang merupakan kasus dalam beberapa implementasi awal.
Saya sering bertanya-tanya mengapa multi-threading sangat sulit di Jawa tetapi sekarang menjadi lebih jelas - itu akhirnya berkaitan dengan beralih ke utas asli, yaitu:
pandai menggunakan semua core cpu
pandai benar-benar berbarengan, menyediakan I / O independen, dll
lambat pada pengalihan konteks (dibandingkan dengan implementasi thread hijau terbaik)
mengerikan serakah dengan memori, karenanya membatasi jumlah maksimum yang dapat digunakan dari mereka
abstraksi yang buruk untuk dasar apa pun untuk mengekspresikan dunia nyata, yang tentu saja sangat bersamaan.
Saat ini, banyak waktu programmer sekarang masuk ke coding I / O non-blocking, futures dll. Sayang sekali kami tidak memiliki tingkat abstraksi yang lebih baik.
Sebagai perbandingan, selain Erlang bahasa Go baru melakukan pekerjaan yang baik dengan konkurensi besar. Cucu dari mereka semua tetap Occam , masih merupakan proyek penelitian yang sedang berlangsung.
sumber
Satu proses memalsukan banyak utas memiliki banyak masalah. Salah satunya adalah bahwa semua thread palsu terhenti karena kesalahan halaman.
Alternatif yang Anda sarankan, kumpulan proses, memiliki beberapa kelebihan dan kekurangan. Keuntungan terbesar, isolasi 'utas', benar-benar tidak akan membuat Anda banyak di sini. Kerugian besar, kesulitan implementasi yang ekstrem, dan sinkronisasi yang kurang efisien, adalah pembunuh di sini.
Namun, saya setuju bahwa ada beberapa aplikasi (bukan Java) di mana kumpulan proses yang dapat Anda gunakan seperti kumpulan thread (tetapi dengan lebih banyak isolasi) akan menjadi hal yang hebat untuk dimiliki. Utas berbagi hampir semua. Dengan proses, Anda dapat secara khusus memilih apa yang akan dibagikan. Sepengetahuan saya, belum ada yang berusaha untuk mengimplementasikannya.
sumber
Tidak akan ada manfaat sama sekali untuk kode Java rata-rata. Java bukan Erlang, dan programmer Java tidak memiliki pola pikir yang sama dengan programmer Erlang. Bahasa itu tidak pernah dimaksudkan untuk digunakan dengan cara ini.
Jika Anda menginginkan proseses yang benar-benar ringan - gunakan Erlang dan buat ribuan utas berkomunikasi melalui pesan. Di Jawa Anda akan memiliki selusin utas berbagi memori yang sama dengan mutex dan semaphore. Ini hanya model pemrograman yang berbeda, yang dirancang untuk serangkaian masalah yang berbeda.
sumber