Komputer modern memiliki beberapa inti pemrosesan. Dengan asumsi ada pemrosesan yang cukup sehingga setiap inti dapat tetap sibuk terus menerus. mereka akan diberikan antrian item pekerjaan komputasi. Atau utas untuk diselesaikan oleh penjadwal.
Selama menjalankan utas ini, dimungkinkan untuk menelurkan utas baru atau item kerja. Ini adalah utas terpisah yang dapat diproses secara bersamaan. Mereka mungkin perlu memberikan hasil kembali ke program pemijahan atau tetap benar-benar terpisah tanpa batas waktu. Biasanya, utas anak ini ditugaskan ke inti pemrosesan yang sama dengan induknya.
Semua ini mengasumsikan bahwa semua inti tetap sibuk. Ini akan terjadi jika tidak ada utas yang berakhir atau utas baru yang muncul dengan kecepatan yang sama atau lebih cepat dari utas yang ada. Namun, di dunia nyata, beban kerja jangka panjang jarang sesederhana itu, terutama di perangkat komputasi pengguna akhir. Akhirnya, inti pemrosesan kemungkinan akan menyelesaikan semua tugas yang diberikan. Ketika ini terjadi, alih-alih duduk diam dan membuang-buang potensi kinerja, itu malah memeriksa antrian kerja dari inti pemrosesan lainnya dan mencuri item pekerjaan dari mereka.
Manfaat dan Kekurangannya
Pencurian pekerjaan berarti bahwa inti pemrosesan yang menganggur akan secara aktif mencari pekerjaan untuk diselesaikan. Ini mencegah sebagian besar prosesor secara keseluruhan dari duduk diam, yang sangat membantu. Pencurian pekerjaan bisa datang dengan beberapa biaya. Misalnya, inti pemrosesan baru kemungkinan harus memuat data apa pun yang relevan ke dalam memori cache.
Ini bisa memakan waktu, terutama jika harus diminta dari RAM sistem daripada dilayani oleh tingkat cache bersama. Ada kemungkinan bahwa prosesor asli dapat melanjutkan item pekerjaan itu dalam jangka waktu tersebut, yang mengarah ke eksekusi keseluruhan yang lebih cepat. Ini bahkan bisa terjadi jika inti pemrosesan dari mana item pekerjaan dicuri tidak pernah mulai memprosesnya. Beberapa nilai yang di-cache mungkin identik antara utas induk dan anak.
Implementasi
Beberapa bahasa pemrograman memiliki runtime yang dapat menjadwalkan pekerjaan secara langsung pada prosesor khusus. Misalnya, bahasa pemrograman Cilk, runtime Rust Tokio, dan .Net Task Parallel Library dapat melakukan ini. Atau, sistem operasi mungkin bertanggung jawab untuk menjadwalkan waktu prosesor yang sebenarnya. Dengan program hanya menambahkan tugas ke kumpulan "utas pekerja", yang dijadwalkan sendiri oleh sistem operasi.
Ini terjadi dalam sistem di mana program tidak memiliki akses langsung khusus ke inti pemrosesan tetapi harus berbagi akses dengan proses lain. Perhatian ekstra harus dilakukan dalam skenario ini untuk memastikan bahwa utas tidak dicuri berulang kali saat tidak digunakan.
Ada berbagai pendekatan tentang bagaimana item pekerjaan dipilih untuk dicuri. Dalam konsep aslinya, pendekatannya adalah memilih inti acak lainnya. Jika ada satu atau lebih item pekerjaan dalam antriannya, ambil yang terakhir. Tergantung pada preferensi apakah proses anak segera dieksekusi oleh prosesor asal. Atau, jika didorong ke antrian prosesor dan proses induk terus dijalankan, utas induk atau anak akan dicuri.
Itu semua dapat disimpulkan sebagai Work Stealing, teknik penyeimbangan beban yang memastikan bahwa beban kata tersebar merata di antara prosesor yang tersedia. Dengan begitu, semua prosesor melakukan sesuatu untuk membantu.
Kesimpulan
Pencurian kerja adalah proses yang terjadi secara otomatis di CPU multicore. Setiap inti memiliki antrian tugas untuk dilakukan. Ketika prosesor menyelesaikan tugasnya, ia kemudian mencuri tugas lain dari antrian inti pemrosesan lain. Ini membantu mencegah prosesor dari memiliki beberapa inti yang menganggur sementara yang lain masih memiliki antrian tugas untuk dilakukan.