Apa alasan mengapa tumpukan Java / Linux gagal menjadi "waktu nyata"?

20

Saya sering mendengar pengembang menyebutkan bahwa Java tidak dapat " melakukan Real Time ", yang berarti aplikasi Java yang berjalan di Linux tidak dapat memenuhi persyaratan sistem waktu-nyata deterministik, seperti sesuatu yang berjalan di RIOT-OS, dll.

Saya mencoba memahami mengapa . Saya SWAG memberitahu saya bahwa ini mungkin sebagian besar disebabkan Sampah Jawa Collector, yang dapat dijalankan pada setiap saat dan benar-benar berhenti sistem. Dan meskipun ada yang disebut "GC yang tidak ada jeda" di luar sana, saya tidak perlu percaya iklan mereka, dan juga tidak memiliki $ 80K per JVM-contoh untuk membayar untuk proyek hobi!

Saya juga membaca artikel ini tentang menjalankan perangkat lunak drone di Linux . Dalam artikel itu, penulis menggambarkan sebuah skenario di mana Linux hampir menyebabkan drone menabrak mobilnya:

Saya belajar pelajaran sulit setelah memilih untuk melakukan loop kontrol level rendah (PID) pada Pi - mencoba menjadi pintar, saya memutuskan untuk meletakkan log write di tengah-tengah loop untuk debugging - quad awalnya terbang dengan baik tetapi kemudian Linux memutuskan untuk mengambil 2 detik untuk menulis satu entri log dan quad hampir menabrak mobil saya!

Sekarang walaupun penulis itu menulis perangkat lunak drone-nya di C ++, saya akan membayangkan aplikasi Java yang berjalan di Linux dapat mengalami nasib yang sama.

Menurut Wikipedia:

Suatu sistem dikatakan real-time jika kebenaran total operasi tidak hanya bergantung pada kebenaran logisnya, tetapi juga pada waktu di mana ia dilakukan.

Jadi bagi saya, ini berarti " Anda tidak memiliki waktu nyata jika kebenaran total memerlukan kebenaran dan ketepatan waktu yang logis. "

Mari kita berpura-pura telah menulis aplikasi Java untuk menjadi pemain super, dan bahwa saya telah "memeras lemon" untuk berbicara, dan itu tidak bisa ditulis (di Jawa) lebih cepat.

Semua dalam semua, pertanyaan saya adalah: Saya sedang mencari seseorang untuk menjelaskan kepada saya semua / sebagian besar alasan mengapa aplikasi Java yang menjalankan n Linux akan gagal menjadi "aplikasi waktu nyata". Artinya, apa saja kategori hal-hal pada tumpukan Java / Linux yang mencegahnya dari "tepat waktu", dan karena itu, menjadi " sepenuhnya benar "? Seperti disebutkan, sepertinya GC dan Linux log-flushing dapat menjeda eksekusi, tapi saya yakin ada lebih banyak hal di luar aplikasi Java itu sendiri yang akan menyebabkan waktu / kinerja buruk, dan menyebabkannya memenuhi batasan tenggat waktu yang sulit. Apakah mereka?

smeeb
sumber
3
Lihat JSR001
coredump
1
FWIW, Linux dapat dibuat untuk berperilaku dengan cara yang tepat untuk sistem waktu nyata yang sulit, tetapi itu memang melibatkan beberapa teknik yang mungkin diabaikan oleh pengembang hobi yang biasanya. Ada banyak buku bagus yang tersedia untuk pengembangan waktu nyata linux; Saya sarankan membeli satu.
Jules
@coredump sayangnya, sejauh yang saya bisa lihat dalam daftar implementasi jsr-1 hanya ada empat implementasi, dua di antaranya saat ini tidak tersedia, dan dua lainnya tampaknya merupakan penawaran komersial yang cukup mahal yang kemungkinan keluar dari kisaran harga penanya.
Jules

Jawaban:

28

Suatu perangkat lunak adalah waktu nyata bukan pada saat secepat mungkin, tetapi ketika dijamin bahwa suatu proses menyelesaikan dalam beberapa slot waktu yang ditentukan. Dalam sistem waktu nyata yang lunak, itu baik tetapi tidak mutlak perlu bahwa ini dijamin. Misalnya dalam sebuah game, perhitungan yang diperlukan untuk sebuah frame harus selesai dalam periode frame, atau framerate akan turun. Ini menurunkan kualitas gameplay, tetapi tidak membuatnya salah. Misalnya Minecraft menyenangkan meskipun permainan kadang-kadang tergagap.

Dalam sistem waktu nyata yang sulit, kami tidak memiliki kebebasan seperti itu. Perangkat lunak kontrol penerbangan harus bereaksi dalam batas waktu tertentu, atau kendaraan dapat mogok. Dan perangkat keras, OS, dan perangkat lunak harus bekerja bersama untuk mendukung waktu nyata.

Misalnya, OS memiliki penjadwal untuk memutuskan kapan utas dijalankan. Untuk program waktu nyata, penjadwal harus menjamin slot waktu yang cukup besar dan cukup sering. Setiap proses lain yang ingin dieksekusi dalam slot seperti itu harus terganggu demi proses waktu-nyata. Ini membutuhkan penjadwal dengan dukungan real-time eksplisit.

Juga, program ruang pengguna akan melakukan panggilan sistem ke dalam kernel. Dalam OS waktu-nyata, ini juga harus waktu-nyata. Misalnya menulis ke pegangan file harus dijamin untuk tidak mengambil lagi unit waktu x , yang akan memecahkan masalah log. Ini berdampak pada bagaimana panggilan sistem seperti itu dapat diimplementasikan, misalnya bagaimana buffer dapat digunakan. Ini juga berarti bahwa panggilan harus gagal jika tidak dapat menyelesaikan dalam waktu yang diperlukan, dan bahwa program ruang pengguna harus siap untuk menangani kasus-kasus ini. Dalam kasus Java, JVM dan pustaka standar juga seperti kernel dan akan membutuhkan dukungan real-time eksplisit.

Untuk apa pun yang real-time, gaya pemrograman Anda akan berubah. Jika Anda tidak memiliki waktu tanpa akhir, Anda harus membatasi diri pada masalah kecil. Semua loop Anda harus dibatasi oleh beberapa konstanta. Semua memori dapat dialokasikan secara statis, karena Anda memiliki batasan ukuran. Rekursi tidak terbatas dilarang. Ini bertentangan dengan banyak praktik terbaik, tetapi tidak berlaku untuk sistem waktu nyata. Misalnya sistem logging mungkin menggunakan buffer cincin yang dialokasikan secara statis untuk menyimpan pesan log ketika ditulis. Setelah mulai tercapai, log lama akan dibuang, atau kondisi ini mungkin menjadi kesalahan.

amon
sumber
4

Dari wikipedia :

Karakteristik utama dari RTOS adalah tingkat konsistensinya mengenai jumlah waktu yang diperlukan untuk menerima dan menyelesaikan tugas aplikasi; variabilitasnya adalah jitter.

Yang penting adalah bahwa jitter dikuantifikasi agar sistem dianggap waktu nyata . Artikel selanjutnya mengatakan bahwa jika jitter biasanya dibatasi, sistem lunak real-time . Jika jitter selalu dibatasi, sistemnya sulit real-time .

Kecuali versi Java dan Linux yang Anda gunakan dikuantifikasi dalam bentuk jitter, mereka tidak real-time. Pengumpulan sampah dan penulisan log tentu saja merupakan sumber jitter, tetapi bahkan pemrosesan mandiri (misalnya) paket jaringan diperhitungkan jika memasukkan jitter ke dalam proses Anda .

Lawrence
sumber
1

Sebagai permulaan, vanilla Linux itu sendiri tidak dapat melakukan waktu nyata. Itu sebabnya RTLinux dikembangkan.

Katakanlah Anda menjalankan beberapa proses java pada RTLinux, mereka masih akan dianggap real time karena semua proses tersebut dijadwalkan oleh kernel, yaitu jika satu proses terlambat, proses lain masih dapat memiliki sepotong waktu cpu mereka, dijamin.

Sekarang, jika proses java menjalankan thread hijau , maka eksekusi thread ini tidak akan menjadi waktu nyata lagi karena JVM tidak melakukan penjadwalan waktu nyata.

imel96
sumber