Gesaan dan Konteks Berkenaan
Sistem masa nyata prapenebusan keutamaan tetap teras tunggal mempunyai tiga tugasan. Nombor keutamaan yang lebih besar bermaksud keutamaan yang lebih tinggi:
| Tugasan | Keutamaan | Tingkah Laku |
|---|---|---|
| H | 90 | Memerlukan bus_mutex selepas bangun dan mempunyai tarikh akhir relatif 10ms |
| M | 50 | Tidak pernah menggunakan muteks dan memerlukan 20ms kerja CPU tanpa gangguan selepas bangun |
| L | 10 | Sudah memiliki bus_mutex dan mempunyai baki 3ms kerja CPU dalam seksyen kritikal |
Pada t=0, L memiliki muteks tersebut. H kemudian bangun, memprapenebus L, cuba mendapatkan muteks, dan disekat. Selepas H disekat selama 1ms, M menjadi sedia untuk dijalankan (runnable). Terangkan urutan pelaksanaan dengan muteks biasa dan dengan pewarisan keutamaan, kira batas masa menunggu kunci bagi H, dan bincangkan perkara berikut:
- apa yang menjadikan ini songsangan keutamaan tidak terbatas (unbounded);
- bagaimana keutamaan merambat dan dipulihkan dengan berbilang muteks, penunggu, dan sekatan bersarang;
- pertukaran (trade-off) antara protokol pewarisan keutamaan dan siling keutamaan;
- mengapa semafor biasa, hirisan masa (time slice) yang lebih pendek, atau satu lagi peningkatan keutamaan H bukanlah penyelesaian yang setara;
- bagaimana surihan penjadual dan metrik tarikh akhir dapat membuktikan bahawa penyelesaian tersebut berfungsi.
Soalan ini sesuai untuk peranan terbenam, RTOS, Linux masa nyata, robotik, audio/video, kawalan industri, dan perisian sistem. Keutamaan serta nilai 3ms, 20ms, dan 10ms ialah kekangan latihan, bukan tuntutan tentang julat keutamaan RTOS tertentu atau ambang pengeluaran.
Perkara yang Dinilai oleh Penemu Duga
Lapisan pertama ialah membezakan sekatan sumber langsung daripada kelewatan yang diperkenalkan oleh kerja yang tidak berkaitan. H yang menunggu L melepaskan sumber sudah merupakan songsangan keutamaan. Bahagian yang memusnahkan kebolehramalan ialah M tidak menggunakan sumber tersebut tetapi boleh memprapenebus pemilik kunci berkeutamaan rendah L secara berulang kali, memanjangkan masa menunggu H dengan jumlah kerja keutamaan sederhana yang sewenang-wenangnya.
Lapisan kedua ialah melukis urutan peristiwa dan bukannya sekadar menghafal definisi. Dengan muteks biasa, L boleh dijalankan selepas H disekat tetapi diprapenebus apabila M bangun. H menunggu selama 20ms bagi M ditambah baki 3ms bagi L, iaitu kira-kira 23ms, yang melebihi tarikh akhir 10ms. Dengan pewarisan, H menderma keutamaan berkesan 90 kepada L pada saat ia disekat. M tidak boleh memprapenebus L, jadi di bawah andaian gesaan, H menunggu kira-kira baki 3ms bagi L ditambah overhed penjadual.
Lapisan ketiga ialah memahami keadaan pelaksanaan. Kunci memerlukan pemilik dan penunggu yang disusun mengikut keutamaan. Apabila sesuatu tugasan memiliki beberapa kunci, keutamaan berkesannya ialah nilai maksimum antara keutamaan asasnya dan setiap dermaan yang aktif. Jika penunggu tertinggi mengalami tamat masa (timeout), dibatalkan, atau berhenti menunggu kerana sesuatu kunci dilepaskan, keutamaan mesti dikira semula dan bukannya ditetapkan semula tanpa syarat kepada nilai asas. Jika pemilik yang ditingkatkan disekat pada kunci lain, dermaan mesti merambat di sepanjang rantai PI.
Lapisan keempat ialah sempadan mekanisme. Pewarisan mengehadkan kelewatan tidak terbatas yang disebabkan oleh tugasan berkeutamaan sederhana. Ia tidak memendekkan I/O di dalam seksyen kritikal, kawasan gangguan dinyahdayakan, kod yang tidak boleh diprapenebus, atau operasi perkakasan, dan ia tidak menghapuskan kebuntuan (deadlock). Siling keutamaan menukar konfigurasi awal untuk analisis sekatan yang lebih statik. Semafor pembilang tanpa pemilik unik tidak menyediakan tugasan yang pasti untuk ditingkatkan keutamaannya.
Akhir sekali, penemu duga mahukan disiplin pengesahan. Jawapan yang kukuh membandingkan tempoh menunggu kunci, masa L sedia untuk dijalankan tetapi tidak berjalan semasa memegang kunci, sama ada M memasuki selang tersebut, kegagalan tarikh akhir H, serta laluan kunci bersarang dan tamat masa. Purata penggunaan CPU atau “sistem tidak tergantung” tidak membuktikan batas masa nyata.
Soalan untuk Dijelaskan Sebelum Menjawab
- Ke arah manakah nilai keutamaan berjalan, dan apakah dasar penjadualannya? Gesaan menyatakan 90 lebih tinggi daripada 50 dan menetapkan prapenebusan keutamaan tetap teras tunggal. Sesetengah RTOS menomborkan keutamaan ke arah yang bertentangan, dan penjadual perkongsian masa biasa tidak menyokong garis masa yang sama secara langsung.
- Adakah 3ms masa jam dinding (wall-clock time) atau masa pelaksanaan CPU sebenar? Di sini ia ialah baki kerja CPU bagi L di dalam seksyen kritikal. PI tidak boleh menjadikan penungguan peranti atau kawasan yang tidak boleh diprapenebus lebih pantas secara fizikal.
- Bilakah tarikh akhir 10ms bagi H bermula? Di sini ia bermula apabila H bangun. Jika tarikh akhir bermula pada ketibaan permintaan atau pelepasan berkala, giliran menunggu terdahulu juga mesti dimasukkan ke dalam pengiraan masa tindak balas.
- Adakah terdapat gangguan atau tugasan melebihi keutamaan 90? Latihan ini mengecualikannya daripada pengiraan pertama. Batas sebenar mesti merangkumi gangguan keutamaan lebih tinggi, masa maksimum gangguan dinyahdayakan, overhed penjadual, dan kesan cache.
- Adakah
bus_mutexsebenarnya muteks penjejakan pemilik? Semafor binari mungkin kelihatan serupa tetapi tidak semestinya mempunyai pemilik, buka kunci khusus pemilik sahaja, atau semantik PI. - Adakah L memiliki kunci lain atau sedang menunggu satu lagi kunci? Perkara itu menentukan sama ada dermaan mesti merambat secara rekursif dan mengubah kedua-dua analisis kebuntuan serta batas sekatan.
- Protokol manakah yang disokong oleh pelaksanaan sasaran? POSIX mendedahkan
PTHREAD_PRIO_INHERITdanPTHREAD_PRIO_PROTECT. Tingkah laku RTOS untuk berbilang kunci, tamat masa, kunci rekursif, dan penurunan keutamaan adalah berbeza, jadi dokumentasi versi yang tepat adalah penting.
Rangka Jawapan 30 Saat
“Dengan muteks biasa, H disekat kerana L memiliki bus_mutex. L sebaliknya boleh menghabiskan baki 3ms, tetapi selepas 1ms, M pada keutamaan 50 memprapenebus L pada keutamaan 10 dan berjalan selama 20ms. M tidak pernah menyentuh muteks tetapi secara tidak langsung membuatkan H pada keutamaan 90 menunggu. Oleh itu, penungguan kunci H adalah kira-kira 20+3=23ms, melebihi tarikh akhir 10ms. Jika tugasan berkeutamaan sederhana boleh terus tiba, panjang seksyen kritikal L tidak lagi membatasi penungguan tambahan tersebut.
Dengan pewarisan keutamaan, sekatan H menaikkan keutamaan berkesan L kepada 90. M tidak boleh memprapenebus L selepas ia bangun. L melepaskan muteks selepas kira-kira 3ms, mengira semula keutamaannya daripada baki penunggu dan muteks yang dimiliki, dan H memperoleh kunci tersebut. PI mengawal kelewatan daripada kerja keutamaan sederhana yang tidak berkaitan. Ia tidak menjanjikan sifar sekatan atau membaiki seksyen kritikal yang panjang, kebuntuan, atau kod gangguan dinyahdayakan.
Saya akan memacu urutan pelepasan berketentuan dan merekodkan sekatan dan nyahsekat H, selang pemilikan L, selang pelaksanaan M, dan setiap kegagalan tarikh akhir untuk muteks biasa dan PI. Saya juga akan menguji dermaan berantai, berbilang penunggu, tamat masa penunggu, dan pelepasan berperingkat bagi berbilang kunci untuk membuktikan bahawa kedua-dua peningkatan dan penurunan keutamaan adalah betul.”
Selaman Mendalam Langkah Demi Langkah
Langkah 1: Lukis Garis Masa Songsangan Tidak Terbatas untuk Muteks Biasa
Gunakan kebangkitan H sebagai masa relatif 0ms. L sudah memiliki kunci dan mempunyai baki 3ms kerja CPU:
| Masa relatif | Peristiwa | Hasil |
|---|---|---|
| 0ms | H bangun, memprapenebus L, dan meminta bus_mutex | H disekat kerana L ialah pemiliknya |
| 0–1ms | L bersambung semula | L melaksanakan 1ms dan mempunyai baki 2ms dalam seksyen kritikal |
| 1ms | M bangun | M berkeutamaan 50 memprapenebus L berkeutamaan 10 |
| 1–21ms | M berjalan selama 20ms | H masih menunggu; L boleh dijalankan tetapi tidak dapat berjalan |
| 21–23ms | L menjalankan baki 2ms dan membuka kunci | H akhirnya dinyahsekat |
H menunggu kira-kira 23ms dari bangun tidur sehingga perolehan muteks, terlepas tarikh akhir 10ms. Jika tugas seperti M boleh terus tiba semasa H disekat, penungguan H tidak lagi dibatasi oleh baki 3ms seksyen kritikal L. Itulah songsangan tidak terbatas di sini. Ini tidak bermakna penungguan tak terhingga tidak dapat dielakkan secara matematik; ini bermakna reka bentuk tersebut tidak membekalkan batas sekatan terhingga dan boleh diaudit yang diperoleh daripada sumber yang dilindungi.
Bezakan kebuntuan (deadlock), kelaparan (starvation), dan lebihan beban (overload). Kebuntuan mempunyai kitaran menunggu tanpa sebarang tugasan yang dapat melepaskan sumber yang diperlukan. Kelaparan tidak semestinya melibatkan pemilik kunci. Lebihan beban CPU biasanya menyebabkan beberapa tugasan terlepas tarikh akhir. Rantaian bukti songsangan adalah khusus: H menunggu sumber yang dimiliki oleh L sementara M, yang tidak mempunyai kebergantungan pada sumber tersebut, menghalang L daripada melaksanakan.
Langkah 2: Tambah Pewarisan Keutamaan dan Kira Semula
Apabila H disekat pada 0ms, muteks menderma keutamaan penunggu tertingginya 90 kepada pemilik L. L mengekalkan keutamaan asas 10 dan buat sementara waktu mempunyai keutamaan berkesan 90:
| Masa relatif | Peristiwa | Hasil |
|---|---|---|
| 0ms | H disekat pada muteks L | L mewarisi 90 dan segera bersambung semula |
| 1ms | M berkeutamaan 50 bangun | M tidak boleh memprapenebus L berkeutamaan berkesan 90 |
| 0–3ms | L menghabiskan baki seksyen kritikal dan membuka kunci | Masa menunggu kunci H adalah kira-kira 3ms ditambah overhed penjadual |
| Kira-kira 3ms | H memperoleh muteks | Kira-kira 7ms baki belanjawan tarikh akhir kekal |
Kesimpulan 3ms bergantung pada gesaan: tiada tugasan berkeutamaan lebih tinggi, tiada kawasan gangguan dinyahdayakan yang panjang, seksyen yang tidak boleh diprapenebus, ralat halaman (page fault), atau I/O menyekat, dan muteks tersebut benar-benar melaksanakan PI. Masa tindak balas sebenar juga mesti merangkumi pelaksanaan H dan semua gangguan berkeutamaan lebih tinggi. Faedah utama PI ialah 20ms bagi M tidak lagi memasuki selang sekatan sumber ini untuk H.
Peningkatan keutamaan mengubah keutamaan berkesan; ia tidak boleh menulis ganti keutamaan asas L secara kekal. Jika tiada dermaan lain kekal selepas buka kunci, L kembali kepada 10. Jika penunggu berkeutamaan 80 masih menunggu pada muteks lain yang dimiliki oleh L, L hanya boleh diturunkan keutamaan kepada 80, bukan terus kepada 10.
Langkah 3: Kendalikan Berbilang Penunggu, Berbilang Kunci, dan Rantai PI
Katakan L memiliki kedua-dua R1 dan R2, H90 menunggu pada R1, dan X70 menunggu pada R2. Keutamaan berkesan L ialah 90. Selepas L melepaskan R1, H tidak lagi menderma kepada L, tetapi X masih menunggu untuk R2, jadi keutamaan L diturunkan kepada 70. Ia kembali kepada keutamaan asas 10 hanya selepas melepaskan R2. Tamat masa atau pembatalan oleh penunggu tertinggi mesti mencetuskan pengiraan semula yang sama.
Sekarang andaikan L sedang menunggu R3, yang dimiliki oleh K. Meningkatkan keutamaan L sahaja tidak dapat melepaskan kunci H kerana L sendiri tidak dapat berjalan melepasi penungguannya. Keutamaan 90 mesti merambat sepanjang H → R1 → L → R3 → K. K melepaskan R3, membolehkan L meneruskan dan akhirnya melepaskan R1. Linux rt-mutex mengekalkan ini dengan set penunggu tersusun mengikut keutamaan bagi setiap muteks dan penunggu tertinggi daripada setiap muteks yang dimiliki dalam set penunggu PI pemilik.
Dermaan berantai tidak membetulkan susunan kunci yang salah. Jika L menunggu K sementara K menunggu L, PI hanya meningkatkan keutamaan tugasan dalam kitaran menunggu; tiada laluan pelepasan yang boleh dilaksanakan muncul. Kawalan kejuruteraan masih merangkumi susunan kunci global, penyarangan terhad, tiada I/O menyekat semasa memegang muteks, dan tempoh seksyen kritikal kes terburuk yang boleh diaudit.
Langkah 4: Bandingkan Pewarisan Keutamaan dengan Siling Keutamaan
Protokol muteks POSIX menjadikan perbezaan itu konkrit:
PTHREAD_PRIO_INHERIT: pemilik ditingkatkan keutamaannya hanya apabila ia benar-benar menyekat bebenang berkeutamaan lebih tinggi. Keutamaan berkesannya menjadi nilai maksimum antara keutamaan asasnya dan dermaan penunggu aktif, dan sekatan bersarang merambat secara rekursif.PTHREAD_PRIO_PROTECT: semasa sesuatu bebenang memiliki muteks, ia melaksanakan sekurang-kurangnya pada siling keutamaan yang dikonfigurasikan bagi muteks tersebut, sama ada penunggu wujud pada masa itu atau tidak.
Pewarisan menanggung kos simpan kira masa jalanan dan perambatan rantai apabila perbalahan berlaku tetapi tidak memerlukan pengetahuan awal tentang keutamaan maksimum setiap pengguna. Siling memerlukan set tugasan/sumber diketahui dan dikonfigurasikan dengan betul, sebagai pertukaran bagi sempadan sekatan yang lebih statik dan boleh dianalisis. Sama ada protokol siling tertentu menghalang kelas kebuntuan juga bergantung pada peraturan kemasukan siling yang lengkap dalam sistem tersebut. Perkataan “siling” sahaja tidak membuktikan kebebasan daripada kebuntuan.
Lakaran pemulaan POSIX diberikan di bawah. Kod pengeluaran mesti menyemak sokongan pelaksanaan, nilai pulangan, keistimewaan penjadualan, dan jangka hayat muteks:
pthread_mutexattr_t attr;
int rc = pthread_mutexattr_init(&attr);
if (rc == 0) {
rc = pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT);
}
if (rc == 0) {
rc = pthread_mutex_init(&bus_mutex, &attr);
}
pthread_mutexattr_destroy(&attr);Menetapkan atribut untuk bebenang biasa SCHED_OTHER pada Linux bukanlah jaminan tarikh akhir masa nyata yang ketat. Kelas penjadualan, keistimewaan keutamaan masa nyata, kelakuan PREEMPT_RT atau kernel sasaran, dan setiap punca sekatan aplikasi lain masih memerlukan pengesahan.
Langkah 5: Pilih Primitif yang Betul dan Pendekkan Seksyen Kritikal
PI bergantung pada pemilik yang pasti. Apabila penunggu berkeutamaan tinggi disekat, kernel mesti tahu tugasan mana yang perlu ditingkatkan keutamaannya. Lindungi keadaan dikongsi dengan muteks penjejakan pemilik yang dibuka kuncinya oleh pemilik tersebut. Semafor pembilang yang digunakan untuk kiraan sumber atau pemberitahuan mungkin tidak mempunyai pemilik unik, jadi ia tidak menyediakan sasaran dermaan yang boleh dipercayai. Semafor binari tidak memperoleh semantik PI muteks semata-mata kerana nilainya terhad kepada sifar atau satu.
Walaupun dengan PI, pastikan seksyen kritikal boleh dikira. Salin keadaan yang diperlukan sahaja di bawah kunci. Pindahkan pemindahan peranti, pengelogan, peruntukan, dan panggilan yang mungkin tidur ke luar daripadanya. Untuk akses bersiri ke peranti perlahan, tugasan perkhidmatan berkeutamaan tinggi yang berdedikasi dan penghantaran mesej mungkin merupakan seni bina yang lebih baik. Struktur bebas kunci (lock-free) boleh mengurangkan sekatan muteks tetapi memperkenalkan penambatan semula (reclamation), ABA, percubaan semula, dan masa pelaksanaan kes terburuk yang berpotensi lebih buruk. Buat pilihan berdasarkan analisis tarikh akhir, bukan sekadar label.
Menaikkan keutamaan H tidak dapat menyelesaikan gesaan ini: H sudah merupakan tugasan tertinggi dan tidak boleh berjalan semasa disekat. Hirisan masa yang lebih pendek hanya menjadualkan M dengan lebih kerap; ia tidak membenarkan L berkeutamaan 10 mengatasi M berkeutamaan 50. Menyahdayakan prapenebusan meluaskan kependaman tindak balas untuk setiap tugasan dan memindahkan masalah ke dalam kawasan yang tidak boleh diprapenebus.
Langkah 6: Sahkan Batas Sekatan dengan Surihan Boleh Dihasilkan Semula
Cipta susunan pelepasan tetap: L mengunci dahulu, halangan (barrier) mengesahkan pemilikan, H dilepaskan, kemudian M dilepaskan 1ms selepas H disekat. Jalankan varian muteks biasa, PI, dan siling keutamaan berulang kali dan rekodkan:
- taburan kependaman perolehan muteks H dan bilangan kegagalan tarikh akhir 10ms;
- masa kumulatif L sedia untuk dijalankan tetapi tidak berjalan semasa ia memiliki muteks;
- selang pelaksanaan M semasa H disekat;
- keutamaan asas dan berkesan L, pemilik muteks, penunggu tertinggi, dan masa buka kunci;
- pertukaran penjadual, kebangkitan, masa gangguan dinyahdayakan, dan selang tidak boleh diprapenebus.
Surihan muteks biasa harus menunjukkan M memasuki selang tersebut dan H menunggu kira-kira 23ms. Dalam varian PI, M tidak sepatutnya memprapenebus semasa selang di mana H menunggu dan L sedia dijalankan semasa memiliki muteks; di bawah beban gesaan, H harus menunggu hampir 3ms dan bukannya 23ms. Tambah penunggu kedua pada keutamaan 70, muteks bersarang, tamat masa penunggu, dan pelepasan berperingkat bagi dua kunci L untuk mengesahkan peningkatan dan penurunan keutamaan terhadap dermaan semasa tertinggi.
Kriteria penerimaan tidak boleh menyatakan “PI bermaksud tiada lagi tamat masa.” Gunakan batas bersyarat: berdasarkan seksyen kritikal maksimum yang diukur, gangguan keutamaan tertinggi, masa maksimum gangguan dinyahdayakan, dan belanjawan overhed penjadual, tindak balas kes terburuk H kekal di bawah 10ms, termasuk di bawah tekanan dan suntikan kerosakan (fault injection).
Contoh Jawapan yang Kukuh
“Saya akan menetapkan arah keutamaan dan titik asal masa terlebih dahulu: 90 adalah tertinggi, dan 10ms bagi H bermula apabila H bangun. Dengan muteks biasa, H memprapenebus L, mendapati bus_mutex telah dimiliki, dan disekat. L menyambung semula selama 1ms, kemudian M berkeutamaan 50 bangun dan memprapenebus L selama 20ms. L akhirnya melaksanakan baki 2ms dan membuka kunci. Oleh itu, H mengambil masa kira-kira 23ms dari bangun tidur sehingga perolehan muteks dan pasti terlepas tarikh akhirnya. M tidak pernah menggunakan muteks, tetapi secara tidak langsung menghalang H yang berkeutamaan tertinggi daripada berjalan. Jika kerja keutamaan sederhana boleh terus tiba, seksyen kritikal 3ms L tidak dapat membatasi sekatan tambahan ini.
Dengan PI, H menderma keutamaan 90 kepada L apabila ia disekat. Keutamaan asas L kekal 10 dan keutamaan berkesannya menjadi 90, jadi M tidak boleh memprapenebus pada 1ms. L melengkapkan seksyen kritikal dalam kira-kira 3ms dan melepaskan muteks, kemudian H memperolehnya. Oleh itu, sekatan sumber berada di bawah 10ms di bawah andaian gesaan. Tugasan berkeutamaan lebih tinggi, masa gangguan dinyahdayakan, dan overhed penjadual dikecualikan daripada nombor itu dan mesti dipulihkan dalam analisis masa tindak balas sebenar.
Pelaksanaan tidak boleh menyimpan satu Boolean yang ditingkatkan sahaja. Setiap muteks memerlukan pemilik dan penunggu tertinggi. Setiap pemilik mengambil nilai maksimum daripada keutamaan asasnya dan dermaan merentas semua muteks yang dimiliki. Tamat masa oleh penunggu tertinggi atau pelepasan satu kunci menyebabkan pengiraan semula. Jika L disekat pada kunci K, keutamaan 90 mesti merambat kepada K di sepanjang rantai PI. Jika terdapat kitaran menunggu, peningkatan keutamaan tidak dapat melepaskan sebarang sumber, jadi pemeriksaan susunan kunci dan kebuntuan tetap perlu.
Saya akan menggunakan satu urutan pelepasan untuk membandingkan muteks biasa dengan muteks PTHREAD_PRIO_INHERIT dan merakam pertukaran penjadual, pemilikan kunci, keutamaan berkesan, tempoh sekatan H, dan kegagalan tarikh akhir. Bukti lulus langsung ialah M tidak lagi berjalan semasa H disekat dan L yang sedia berjalan memiliki muteks tersebut, dan penungguan H bertumpu daripada kira-kira 23ms kepada anggaran 3ms baki seksyen kritikal L ditambah gangguan sistem yang diambil kira. Penunggu kedua, kunci bersarang, tamat masa, dan buka kunci satu demi satu mengesahkan peningkatan berantai dan penurunan keutamaan yang betul.”
Kesilapan Biasa
- Hanya mengatakan “tugasan berkeutamaan rendah menyekat tugasan berkeutamaan tinggi” → ini mengabaikan bagaimana M mengubah seksyen kritikal yang terhingga menjadi gangguan tidak terbatas → lukis urutan penuh H-disekat, L-sedia-dijalankan, M-memprapenebus.
- Hanya mengira penungguan 3ms untuk H → ini mengabaikan prapenebusan 20ms M di bawah muteks biasa → ikuti urutan peristiwa sehingga kira-kira 23ms dan bandingkannya dengan 10ms.
- Mendakwa PI menghapuskan setiap songsangan keutamaan → H masih perlu menunggu baki seksyen kritikal L → nyatakan bahawa PI membuang pemanjangan tidak terbatas oleh kerja keutamaan sederhana yang tidak berkaitan.
- Menetapkan semula L terus kepada 10 selepas satu buka kunci → penunggu berkeutamaan tinggi mungkin kekal pada muteks lain yang dimiliki → kira semula keutamaan berkesan daripada setiap dermaan yang aktif.
- Hanya meningkatkan keutamaan pemilik langsung → pemilik yang disekat pada kunci lain masih tidak dapat berjalan → rambatkan di sepanjang rantai PI serta batasi dan pantau kedalaman rantai.
- Menganggap PI sebagai pembaikan kebuntuan → tugasan yang ditingkatkan keutamaannya dalam kitaran menunggu masih tidak mempunyai laluan pelepasan yang boleh dilaksanakan → kekalkan susunan kunci, dasar tamat masa, dan pengesanan kebuntuan.
- Menggantikan muteks dengan semafor binari sambil mengandaikan PI → semafor mungkin tidak mempunyai pemilik, menyebabkan tiada tugasan untuk ditingkatkan keutamaannya → gunakan muteks pemilik yang secara jelas menyokong PI untuk perlindungan sumber.
- Menganggap
PTHREAD_PRIO_INHERITsebagai suis masa nyata ketat → kelas penjadualan, keistimewaan, prapenebusan kernel, gangguan, dan penungguan lain masih mempengaruhi tarikh akhir → sahkan platform penuh dan kira masa tindak balas kes terburuk. - Hanya menyemak kependaman purata yang bertambah baik → penurunan keutamaan, perambatan bersarang, atau laluan tamat masa mungkin masih salah → sahkan kependaman ekor (tails), kegagalan tarikh akhir, keutamaan berkesan, dan sempadan berbilang kunci.
Soalan Susulan dan Maklum Balas
Susulan 1: Mengapa Memanggilnya Tidak Terbatas jika M Berjalan Tepat Selama 20ms di Sini?
Latihan ini mengandungi satu kerja M, jadi hasilnya boleh dikira pada kira-kira 23ms. “Tidak terbatas” menerangkan mekanisme yang memberikan kelewatan tambahan tanpa had berdasarkan seksyen kritikal L. Jika kerja kelas M boleh dilepaskan secara berterusan, L boleh kekal sedia dijalankan tanpa menerima CPU dan penungguan H bertambah dengan kerja M. PI menghapuskan gangguan M daripada selang sekatan ini; batas yang tinggal datang daripada seksyen kritikal dan gangguan berkeutamaan lebih tinggi.
Susulan 2: Bagaimana Jika H Menunggu L dan L Menunggu K?
Derma 90 milik H kepada L, kemudian rambatkannya melalui muteks yang ditunggu oleh L kepada pemilik K. K melaksanakan seksyen kritikalnya pada keutamaan berkesan 90 dan melepaskannya, membolehkan L meneruskan dan akhirnya melepaskan kunci H. Surihan harus menunjukkan peningkatan dan pembalikan penurunan keutamaan merentas H → mutex1 → L → mutex2 → K. Memerhatikan peningkatan L sahaja tidak membuktikan PI berantai adalah betul.
Susulan 3: Apakah Keutamaan yang Patut Dimiliki oleh L Selepas Penunggu Berkeutamaan Tinggi Mengalami Tamat Masa?
Gunakan permintaan tertinggi yang tinggal. Jika H90 mengalami tamat masa tetapi X70 masih menunggu pada muteks lain yang dimiliki oleh L, keutamaan L diturunkan daripada 90 kepada 70. Ia kembali kepada keutamaan asas 10 hanya selepas setiap dermaan hilang. Penyisipan penunggu, pemergian, tamat masa, pembatalan, dan setiap buka kunci mesti mengekalkan keadaan tersusun mengikut keutamaan ini.
Susulan 4: Adakah Siling Keutamaan Sentiasa Lebih Baik Daripada Pewarisan?
Tidak. Siling menyokong analisis sekatan statik apabila set tugasan dan hubungan capaian sumber adalah stabil, tetapi siling yang buruk boleh menolak capaian yang sah atau membatalkan analisis. Pewarisan meningkatkan keutamaan berdasarkan perbalahan sebenar dan memerlukan kurang konfigurasi, tetapi ia mesti mengekalkan penunggu, perambatan rantai, dan penurunan keutamaan dinamik. Buat pilihan berdasarkan protokol tepat RTOS, kestabilan set tugasan, dan overhed masa jalanan yang boleh diterima.
Susulan 5: Mengapa PI Tidak Boleh Membaiki I/O Semasa Memegang Kunci?
Peningkatan keutamaan membantu pemilik memperoleh CPU lebih awal hanya semasa ia sedia untuk dijalankan. Jika L tidur untuk pemindahan SPI, storan, ralat halaman, atau peristiwa lain, ia kekal tidur. Jika pelaksanaan mempunyai gangguan yang dinyahdayakan atau tidak boleh diprapenebus, penjadual juga tidak boleh campur tangan. Pindahkan kerja perlahan ke luar seksyen kritikal atau gunakan tugasan perkhidmatan atau protokol tak segerak, kemudian masukkan masa penyiapan terburuk perkakasan dalam belanjawan.
Susulan 6: Bagaimana Anda Membuktikan Atribut Tersebut Benar-benar Berfungsi dalam Ruang Pengguna Linux?
Semak nilai pulangan daripada pthread_mutexattr_setprotocol dan pthread_mutex_init, sokongan untuk _POSIX_THREAD_PRIO_INHERIT, dasar penjadualan sebenar bebenang, dan keistimewaan keutamaan masa nyata. Kemudian jalankan beban kerja H/M/L terkawal dan surih penjadualan ditambah peristiwa futex atau kunci. Sahkan peningkatan berkesan L, ketiadaan M dalam selang kritikal, dan penurunan keutamaan yang betul selepas buka kunci atau tamat masa penunggu. Pemulaan yang berjaya atau peningkatan p99 secara kebetulan bukanlah bukti yang mencukupi.