Selamat datang ke Bahagian 2 siri multithreading kami! Dalam Bahagian 1, kami meneroka Atomicity dan Immutability.
Dalam bahagian ini, kami akan menyelam lebih dalam untuk memahami kebuluran kerana ia penting untuk jurutera, kerana ia memastikan keadilan dan prestasi sistem. Dengan mengiktiraf risiko kebuluran, jurutera boleh mereka sistem yang mengutamakan keadilan, menghalang monopoli sumber dan memastikan semua rangkaian mendapat masa dan sumber CPU yang diperlukan untuk berfungsi secara optimum.
Bayangkan anda bermain permainan berbilang pemain dalam talian dan anda cuba menyertai lobi untuk mod permainan popular, seperti pertempuran berpasukan. Anda telah menunggu di lobi untuk seketika, tetapi setiap kali perlawanan bermula, kumpulan pemain baharu dengan internet yang lebih pantas atau kedudukan kemahiran yang lebih tinggi akan diutamakan dan ditambahkan pada permainan sebelum anda. Anda melihat perlawanan bermula berulang kali, tetapi anda nampaknya tidak akan dapat menyertainya!
Secara teknikal anda berada dalam baris gilir, tetapi kerana pemain lain yang mempunyai masa tindak balas yang lebih pantas atau pangkat yang lebih tinggi terus memasuki permainan terlebih dahulu, anda ditinggalkan di lobi selama-lamanya. Walaupun mempunyai sistem yang berfungsi dengan sempurna, anda dinafikan peluang untuk bermain kerana algoritma mencari jodoh secara tidak adil mengutamakan orang lain.
Kebuluran ialah situasi di mana proses terus-menerus dinafikan akses kepada sumber yang diperlukan untuk diteruskan, walaupun sumber tersebut tersedia. Proses tersebut kekal dalam keadaan menunggu kerana proses keutamaan yang lebih tinggi atau dasar peruntukan sumber lain menghalangnya daripada memperoleh sumber yang diperlukan. Tidak seperti kebuntuan, sumber tidak tersedia sepenuhnya, tetapi proses tidak dapat mengaksesnya kerana penjadualan yang tidak adil.
Penyongsangan Keutamaan: Apabila proses keutamaan yang lebih tinggi sedang menunggu sumber yang dipegang oleh proses keutamaan yang lebih rendah, proses keutamaan yang lebih rendah mungkin kehilangan masa CPU jika keutamaan yang lebih tinggi yang lain proses terus tiba.
Dasar Peruntukan Sumber: Sesetengah algoritma penjadualan mungkin memihak kepada proses tertentu (biasanya yang mempunyai keutamaan yang lebih tinggi), yang membawa kepada situasi di mana proses keutamaan yang lebih rendah jarang diperuntukkan sumber.
Algoritma Rekaan Yang Tidak Baik: Jika algoritma peruntukan sumber tidak seimbang atau adil, ia boleh menyebabkan proses tertentu diabaikan secara berterusan.
Permintaan Sumber Tinggi: Jika segelintir proses menuntut jumlah sumber yang berlebihan, mereka boleh menyebabkan kebuluran proses lain dengan memonopoli sumber tersebut.
Waktu Menunggu Yang Lama: Proses yang kerap didahulukan atau yang mendapati diri mereka bersaing untuk mendapatkan sumber terhad mungkin mengalami kebuluran.
Java ReentrantLock menyediakan pilihan untuk menguatkuasakan keadilan. Dengan menggunakan pembina ReentrantLock dengan hujah yang benar, kami boleh memastikan bahawa utas memperoleh kunci dengan cara yang dia dapat dahulu, dilayan dahulu (FCFS), mencegah kebuluran.
private final Lock lock = new ReentrantLock(true); // Fair lock
Satu Semaphore digunakan untuk mengawal akses kepada bilangan sumber yang terhad. Dengan menggunakan semaphore dengan kesaksamaan didayakan, kami boleh memastikan bahawa benang memperoleh permit dalam susunan yang adil, mengelakkan kebuluran.
private final Semaphore sp = new Semaphore(1, true); // Fair semaphore
Semaphore(1, true) ialah semaphore dengan hanya satu permit dan kesaksamaan didayakan.
Dalam masalah pengeluar-pengguna tradisional, kebuluran mungkin berlaku jika pengeluar mengatasi pengguna atau jika pengguna dinafikan akses kepada sumber yang dikongsi. BlockingQueue menghalang perkara ini kerana ia secara automatik mengendalikan penyegerakan antara pengeluar dan pengguna. Kedua-dua pengeluar dan pengguna disekat apabila baris gilir penuh atau kosong, masing-masing. Ini memastikan keseimbangan yang adil antara kedua-duanya dan menghalang satu daripada mengatasi yang lain, sekali gus mengelakkan kebuluran.
Dalam senario di mana berbilang tugasan dicabangkan dan disambungkan, ForkJoinPool dalam Java menyediakan cara untuk mengimbangi kerja secara adil antara utas. Ia memastikan kerja mencuri, menghalang kebuluran benang yang kurang aktif. ForkJoinPool Java mengendalikan pemisahan dan pengimbangan tugas dengan cekap, memastikan tiada benang kelaparan untuk bekerja. Ini dicapai menggunakan algoritma mencuri kerja, di mana benang terbiar mencuri tugas daripada benang sibuk untuk memastikan semuanya bergerak lancar
Sistem pengendalian (OS) menggunakan pelbagai teknik untuk mengelakkan kebuluran—keadaan di mana proses atau rangkaian tertentu dinafikan sumber yang diperlukan (seperti masa CPU, memori atau akses I/O) untuk tempoh yang berpanjangan kerana tugas keutamaan yang lebih tinggi mendominasi. Berikut ialah beberapa cara biasa OS menghalang kebuluran:
No. | Method | Description | Prevents Starvation By |
---|---|---|---|
1 | Aging | Gradually increases priority of waiting processes. | Prevents long waits by adjusting priority based on wait time. |
2 | Round-Robin Scheduling | Allocates CPU time in a fixed cyclic order. | Ensures all processes get CPU time, avoiding starvation. |
3 | Completely Fair Scheduler | Allocates CPU based on fairness, independent of priority. | Ensures fair distribution of CPU time. |
4 | Priority Boosting | Temporarily raises the priority of starved processes holding important resources. | Prevents priority inversion and ensures high-priority tasks get needed resources. |
5 | Multilevel Feedback Queues | Dynamically adjusts process priorities based on behavior. | Promotes long-waiting processes to higher-priority queues. |
6 | Semaphores with Fairness | Ensures fair access to resources through FIFO queues. | Prevents low-priority tasks from being perpetually blocked by higher-priority tasks. |
7 | Fair Resource Allocation | Distributes system resources like CPU and memory based on process demand and need. | Prevents resource-hogging processes from starving others. |
8 | Fair I/O Scheduling | Prioritizes I/O requests to ensure timely completion for all processes. | Prevents disk I/O starvation for processes making low-priority requests. |
Dengan melaksanakan strategi ini, sistem pengendalian boleh memastikan tiada proses atau utas yang kebuluran sumber selama-lamanya, menggalakkan penggunaan sumber sistem yang lebih adil dan cekap.
Terima kasih yang tidak terhingga kepada dokumentasi dalam talian, komuniti dan semua sumber yang tersedia yang membolehkan penulisan ini.
Atas ialah kandungan terperinci Konsep Multithreading Bahagian Kebuluran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!