Kenapa RTOS dianggap deterministik?


8

Pada pc (tentu saja OS) setiap program C menjadi tidak pasti dalam hal waktu. Misalnya loop membutuhkan waktu antara 1,2 dan 1,3 detik tergantung pada "seberapa cepat saya memindahkan jendela lain". Itu karena OS membuat proses (atau utas) berbagi kekuatan pemrosesan.

Sejauh menyangkut RTOS (pada sistem tertanam), ketika kita menulis aplikasi multithreading, saya pikir hal yang sama terjadi tergantung pada berapa banyak thread yang dieksekusi secara bersamaan.

Saya tidak memiliki instrumen untuk menguji ini secara akurat pada sistem tertanam. Jadi, saya ingin bertanya. Apakah kekhawatiran saya masuk akal atau saya melewatkan sesuatu yang sangat mendasar?

EDIT : Saya akan memberikan contoh. kami memiliki task1 (membutuhkan 10 ms) dan task2 (membutuhkan 20 ms). Mereka memulai pada saat yang sama pada dua utas yang terpisah. Klaim saya (juga menyangkut, tidak yakin) adalah bahwa task1 membutuhkan lebih dari 10ms, karena mereka berbagi kekuatan pemrosesan dengan task2.


Determinisme termasuk set (dan waktu) input
PlasmaHH

3
Anda tidak memiliki definisi RTOS. ;-)
DrFriedParts

1
RTOS tidak digunakan untuk menjalankan tugas individu yang harus memenuhi persyaratan waktu individual, ini digunakan untuk menjalankan sistem yang harus, secara keseluruhan, memenuhi semua persyaratan waktu. Deterministik tidak berarti 'terlepas dari semua keadaan', itu berarti 'ketika saya mengetahui keadaan dengan cukup baik (yang pasti termasuk tugas dengan prioritas lebih tinggi) saya dapat memprediksi batas atas.'
Wouter van Ooijen

Jawaban:


6

Tidak benar bahwa tugas-tugas dalam RTOS secara otomatis bersifat deterministik, tetapi dimungkinkan untuk memberikan batasan yang lebih ketat tentang kapan dan seberapa sering tugas berjalan. RTOS biasanya akan menyediakan prioritas berat untuk tugas-tugas; kapan saja tugas siap dengan prioritas tertinggi sedang berjalan. Penulis kode juga memiliki kendali total atas serangkaian tugas yang sedang dijalankan; Anda bisa berharap tidak ada tugas latar belakang prioritas tinggi yang dapat mengganggu kode Anda untuk, katakanlah, bertukar data ke disk, kecuali jika Anda menulisnya.

Selain itu, beberapa RTOS menyediakan multitasking kooperatif. Berbeda dengan multitasking preemptive, dengan multitasking kooperatif tugas akan terus dijalankan sampai secara sukarela menyerahkan kontrol CPU.


10

Sejauh menyangkut RTOS (pada sistem tertanam), ketika kita menulis aplikasi multithreading, saya pikir hal yang sama terjadi tergantung pada berapa banyak thread yang dieksekusi secara bersamaan.

NGGAK!

Jika itu terjadi, maka itu bukan REAL-TIME OS (RTOS).

Jawaban singkatnya adalah bahwa definisi RTOS tidak ada hubungannya dengan multi-tasking atau prioritas. Sederhananya semua tugas memiliki jaminan waktu .

Sisa dari apa yang Anda anggap sebagai karakteristik RTOS (penentuan prioritas, penyelesaian tugas, dll) hanyalah konsekuensi (atau fitur) dari membangun sistem di mana tugas harus diselesaikan dalam interval waktu yang ditentukan.

Multi-tasking dalam RTOS secara konseptual lebih sederhana daripada di OS waktu lunak karena banyak kasus tepi yang rumit pada dasarnya tidak diperbolehkan.


Jadi, jika task1 membutuhkan 10 ms dan task2 membutuhkan 20 ms secara terpisah. Jika mereka berjalan pada saat yang sama (sebagai dua utas terpisah) apakah mereka masih akan lengkap masing-masing dalam 10 ms dan 20 ms?
ozgur

2
Memang, inti dari RTOS adalah untuk menegakkan bahwa tugas dengan prioritas rendah tidak akan berjalan bersamaan dengan tugas dengan prioritas tinggi.
pjc50

1
@ pjc50 - Saya pikir komentar Anda adalah titik kritis yang mungkin hilang. Pertanyaan itu mengandung kesalahpahaman mendasar. Tidak ada 'tugas 1 dimulai dan tugas 2 dimulai pada saat yang sama '; tugas dengan prioritas lebih tinggi (T1) akan menghentikan / mencegah tugas prioritas yang lebih rendah (T2) sampai T1 selesai, atau diawali oleh tugas dengan prioritas lebih tinggi (T0). Jelas, tidak ada OS yang secara ajaib dapat mengaktifkan tugas-tugas yang membutuhkan lebih dari sumber daya yang tersedia untuk memenuhi keterbatasan waktu, ruang, dll. Sumber daya mereka.
gbulmer

2
"tidak ada OS yang secara ajaib dapat mengaktifkan tugas yang membutuhkan lebih dari sumber daya yang tersedia" - Memang, tidak bisa. Tetapi RTOS sejati akan memungkinkan Anda untuk memberitahu sebelumnya apakah dijamin semua kendala Anda akan dipenuhi atau tidak.
JimmyB

1
@ozgur: Anda salah memahami aplikasi yang berjalan pada RTOS. Alih-alih memiliki dua tugas yang memakan waktu 10 ms dan 20 ms, biasanya aplikasi pada RTOS memiliki tugas yang masing-masing membutuhkan 0,01 ms tetapi tugas 1 harus dijalankan SETIAP 10 m dan tugas 2 harus menjalankan SETIAP 20 m. Biasanya dalam aplikasi real-time, kami tidak pernah mengizinkan utas berjalan secara paralel untuk berbagi daya CPU. Alih-alih, kami menjalankan utas untuk waktu sesingkat mungkin lalu membiarkannya tidur. Maksud dari RTOS adalah bahwa ada jaminan bahwa ketika saya memintanya untuk membangunkan saya dalam 10ms itu akan melakukan itu bukannya pada 10,01ms
slebetman

6

RTOS biasanya tidak menjamin throughput , melainkan memungkinkan Anda untuk menjamin latensi .

Ini biasanya dicapai dengan sistem prioritas, seperti di sini di FreeRTOS:

Penjadwal FreeRTOS memastikan bahwa tugas-tugas dalam status Ready atau Running akan selalu diberi waktu prosesor (CPU) dalam preferensi untuk tugas-tugas dengan prioritas lebih rendah yang juga dalam status siap. Dengan kata lain, tugas yang ditempatkan dalam status Running selalu merupakan tugas dengan prioritas tertinggi yang dapat dijalankan.

Misalkan Anda memiliki tugas prioritas 1 yang membutuhkan waktu 10 ms untuk menangani suatu peristiwa, tugas prioritas 2 yang membutuhkan 100 ms untuk menangani acara yang berbeda, dan tugas prioritas 3 latar belakang. Jika Anda mengharapkan untuk mendapatkan satu acara prioritas 1 tidak lebih dari setiap detik, Anda dapat mengatakan bahwa kasus terburuk untuk menangani acara prioritas 2 adalah 10ms + 100ms. Tugas prioritas 3 mungkin secara sewenang-wenang diperlambat oleh kejadian, tetapi Anda tidak peduli - karena prioritasnya rendah.


Dalam contoh Anda, apakah tugas dengan prioritas 1 dan tugas dengan prioritas 2 berjalan pada saat yang sama (dua utas dimulai pada saat yang sama)?
ozgur

1
Berpotensi ya, atau prioritas 1 dimulai saat prioritas 2 sedang berjalan. Contoh ini mengasumsikan CPU tunggal. Perhatikan bahwa contoh spec juga membatasi jumlah tugas P1 yang dapat dijalankan - jika Anda mendapatkan acara P1 setiap 10 ms dan dibutuhkan 10 ms untuk menangani, tidak ada lagi yang akan berjalan .
pjc50

Oke, ini pertanyaan saya. task1 (10ms) dimulai pada saat yang sama task2 (100ms) dimulai. Saya percaya task1 membutuhkan lebih dari 10ms karena mereka berbagi kekuatan pemrosesan dengan tugas 2. Saya harap saya membuat diri saya jelas.
ozgur

Saya pikir intinya adalah bahwa penjadwal tidak akan menjalankan tugas 1 dan 2 pada saat yang sama. Ini akan menjalankan tugas 1 (prioritas lebih tinggi) terlebih dahulu dan tugas antrian 2. 10 ms kemudian, ketika tugas 1 selesai, ia menjalankan tugas 2.
michaelyoyo

1
Ya, itu tidak akan interleave pelaksanaan task1 dan task2. Jika tugas P1 dapat dijalankan, tidak ada tugas P2 akan dijadwalkan sampai selesai. Jika tugas P2 sudah berjalan, itu akan pre-empted dan dijeda sampai semua pekerjaan P1 selesai.
pjc50

4

Saya lebih suka ini menjadi komentar tetapi terlalu banyak karakter. Ngomong-ngomong, ozgur, menilai dari pertanyaan-pertanyaan dalam tanggapan komentar Anda, Anda sepertinya kehilangan poin bahwa Anda tidak bisa hanya mengatakan bahwa utas saya membutuhkan waktu lama untuk berjalan dan mengharapkannya berfungsi secara ajaib dalam hubungannya dengan utas lainnya semua berkat OS. Anda harus merancang utas Anda dan menganalisisnya untuk kinerja kasus terburuk. Jika kasus terburuk tidak memenuhi persyaratan Anda, maka Anda perlu mendesain ulang utas Anda.

Jadi daripada hanya mengatakan thread 1 membutuhkan 10 ms untuk menyelesaikan dan utas 2 membutuhkan 20 ms, Anda juga harus mengatakan utas 1 harus dijalankan setiap 15 ms. utas 2 harus dijalankan setiap 40 ms. utas 3 harus menjalankan setiap 500 ms, utas harus menjalankan setiap 1500 ms. Lalu Anda mengalokasikan waktu untuk berapa lama setiap utas dapat menyelesaikan dalam skenario kasus terburuk. Anda menyatukan semua itu, mengidentifikasi skenario yang paling buruk dan kemudian Anda harus memastikan setiap utas memenuhi persyaratan waktu. Analisis ini juga di mana Anda mengidentifikasi jika beberapa utas perlu prioritas lebih tinggi daripada yang lain untuk memenuhi persyaratan waktu mereka.

Sebagai contoh, thread5 sedang berjalan akan terganggu oleh thread 4 yang akan terganggu oleh thread 3 yang akan terganggu oleh threadN mungkin menjadi salah satu skenario terburuk. Anda meletakkan semua ini di timeline dan memverifikasi bahwa bahkan dalam skenario terburuk ini setiap utas memenuhi persyaratan waktunya. Anda dapat memastikan utas menyelesaikan skenario kasus terburuk ini secara deterministik dengan menggunakan penjadwal dan prioritas dalam OS waktu nyata. Determinisme itulah yang membuat OS waktu nyata.

Jika Anda membuat utas sebagai prioritas yang sama maka Anda telah kehilangan sebagian (jika tidak semua) determinisme itu karena penjadwal mungkin bebas untuk memilih utas mana yang ingin dijalankan selanjutnya.

Dalam OS seperti Windows, Anda tidak hanya tidak dapat menentukan kapan setiap utas akan berjalan, Anda bahkan tidak dapat menjamin bahwa aplikasi Anda akan berjalan pada suatu titik waktu. OS dapat menghentikan aplikasi Anda dan menjalankan beberapa layanan latar belakang kapan pun ia mau. Dengan kata lain, tidak ada determinisme. Jadi, Windows bukan OS waktu-nyata. Meskipun, jika persyaratan waktu Anda besar, seperti (thread1 berjalan setiap 10 detik, thread2 berjalan setiap 15 detik) maka Anda pada dasarnya dapat memperlakukan Windows seperti OS waktu nyata selama Anda menghitung slop dan kira-kira setiap 10 atau 15 detik (memberi atau mengambil beberapa ratus milidetik dan jendela yang sering terlewat) cukup baik.


1

Meskipun jawaban lain telah menyatakan bahwa di "dunia nyata" skenario Anda tidak mungkin, untuk dapat menjawab pertanyaan Anda, kami harus membangun sistem hipotetis .

Sistem kami terdiri dari pistol yang menembak bola dengan kecepatan tetap, dua kotak yang "menangkap" bola dan maju satu langkah dengan setiap bola ditangkap. Pistol dapat diaktifkan untuk menembak ke salah satu kotak tetapi kehilangan satu bola setiap kali diaktifkan. Kotak pertama akan membutuhkan 1000 langkah (bola) untuk mencapai ujungnya dan kotak 2 akan membutuhkan 2000.

Skenario 1 (tugas satu demi satu):
- Pistol menembak 1000 bola di kotak 1, beralih (biaya 1 bola) dan menembak 2.000 bola di kotak 2, dengan total 3001 bola .

Skenario 2 (tugas "simultan"):
- Pistol menembak 5 bola di satu kotak, mengganti dan menembak 5 bola di kotak lainnya untuk memberikan tampilan simultan . Biaya pengalihan adalah (1000/5 x 2 =) 400 bola. Jadi, setelah menembak 2400 bola, kotak 1 akan mencapai ujungnya dan kotak 2 akan membutuhkan 1000 bola tambahan untuk mencapai ujungnya, dengan total 3400 bola .

Menerapkan hasil ini ke skenario Anda, Tugas 1 dan paruh pertama Tugas 2 akan selesai setelah 24 ms, dan paruh kedua Tugas 2 akan selesai dalam 10 ms tambahan untuk total 34 ms. Ini jelas menunjukkan bahwa waktu yang diperlukan untuk menyelesaikan tugas meningkat karena waktu yang hilang dalam beralih di antara tugas . Hasil ini juga setara dengan Tugas 1 mengambil 12 ms dan Tugas 2 mengambil 22 ms, untuk menyelesaikan.


Terpilih. Penjelasan ini membuat pertanyaan saya lebih jelas dan jawabannya jelas.
ozgur
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.