อะไรคือสาเหตุที่ทำให้สแต็ก Java / Linux ล้มเหลวที่จะ "เรียลไทม์"?


20

ฉันเคยได้ยินนักพัฒนาพูดถึงว่า Java ไม่สามารถ " ทำแบบเรียลไทม์ " ซึ่งหมายความว่าแอป Java ที่ทำงานบน Linux ไม่สามารถตอบสนองความต้องการของระบบเรียลไทม์ที่กำหนดขึ้นเช่นสิ่งที่รันบน RIOT-OS เป็นต้น

ฉันกำลังพยายามที่จะเข้าใจว่าทำไม SWAGของฉันบอกฉันว่านี่อาจเป็นเพราะส่วนใหญ่ของ Garbage Collector ของ Java ซึ่งสามารถทำงานได้ตลอดเวลาและหยุดระบบโดยสิ้นเชิง และถึงแม้ว่าจะมีสิ่งที่เรียกว่า "GCS ที่หยุดชั่วคราว" แต่ฉันก็ไม่จำเป็นต้องเชื่อโฆษณาของพวกเขาและยังไม่มีอินสแตนซ์ $ 80K-per-JVM เพื่อแยกโครงการงานอดิเรก!

ผมยังอ่านบทความนี้เกี่ยวกับการใช้ซอฟแวร์เสียงหึ่งๆบน Linux ในบทความนั้นผู้เขียนอธิบายสถานการณ์ที่ลีนุกซ์เกือบทำเสียงขึ้นจมูกชนเข้ากับรถ:

ฉันเรียนรู้บทเรียนที่ยากลำบากหลังจากเลือกที่จะทำลูปควบคุมระดับต่ำ (PIDs) บน Pi - พยายามที่จะฉลาดฉันตัดสินใจใส่บันทึกการเขียนที่อยู่ตรงกลางของลูปสำหรับการดีบั๊ก - Quad เริ่มต้นดี แต่แล้ว Linux ก็ตัดสินใจ ใช้เวลา 2 วินาทีในการเขียนบันทึกรายการหนึ่งและรูปสี่เหลี่ยมเกือบชนเข้ากับรถของฉัน!

ตอนนี้ถึงแม้ว่าผู้เขียนคนนั้นเขียนซอฟต์แวร์เสียงพึมพำของเขาใน C ++ แต่ฉันนึกภาพว่าแอป Java ที่ทำงานบน Linux อาจประสบชะตากรรมเดียวกันได้เป็นอย่างดี

ตามที่ Wikipedia:

ระบบถูกกล่าวว่าเป็นแบบเรียลไทม์หากความถูกต้องทั้งหมดของการดำเนินการไม่เพียง แต่ขึ้นอยู่กับความถูกต้องเชิงตรรกะเท่านั้น แต่ยังขึ้นอยู่กับเวลาที่มันถูกดำเนินการด้วย

สำหรับฉันนี่หมายความว่า " คุณไม่มีเวลาจริงหากความถูกต้องทั้งหมดต้องการความถูกต้องเชิงตรรกะและความตรงต่อเวลา "

ลองทำเป็นว่าฉันได้เขียนแอพ Java ให้มีประสิทธิภาพยอดเยี่ยมและฉันก็ "บีบมะนาว" เพื่อที่จะพูดและมันก็ไม่สามารถเขียนได้เร็วพอสมควร (ใน Java)

โดยรวมแล้วคำถามของฉันคือ: ฉันกำลังมองหาใครบางคนที่จะอธิบายให้ฉันทั้งหมด / ส่วนใหญ่เหตุผลว่าทำไมแอป Java ที่ใช้ n Linux ไม่สามารถเป็น "แอปแบบเรียลไทม์" ความหมายอะไรคือหมวดหมู่ทั้งหมดของสิ่งต่าง ๆ บน Java / Linux สแต็กที่ป้องกันไม่ให้ "ถูกทันเวลา" และดังนั้นจากการ " ถูกต้องทั้งหมด "? ตามที่กล่าวไว้ดูเหมือนว่าการล้างข้อมูลบันทึกของ GC และ Linux สามารถหยุดการทำงานได้ชั่วคราว แต่ฉันแน่ใจว่ามีสิ่งอื่นนอกแอปพลิเคชัน Java ที่จะทำให้เกิดเวลา / ประสิทธิภาพที่ไม่ดีและทำให้ข้อ จำกัด กำหนดเวลายาก พวกเขาคืออะไร


3
ดูJSR001
coredump

1
FWIW, Linux สามารถทำงานในวิธีที่เหมาะสมสำหรับระบบฮาร์ดเรียลไทม์ แต่มันเกี่ยวข้องกับเทคนิคบางอย่างที่อาจถูกมองข้ามโดยนักพัฒนามือสมัครเล่นทั่วไปที่ฝังตัว มีหนังสือที่ดีสำหรับการพัฒนาแบบเรียลไทม์ของ linux; ฉันขอแนะนำให้รับหนึ่ง
จูลส์

@coredump น่าเสียดายที่เท่าที่ฉันเห็นในรายการของการใช้งานของ jsr-1มีเพียงสี่การใช้งานซึ่งสองไม่สามารถใช้ได้ในปัจจุบันและอีกสองปรากฏเป็นข้อเสนอเชิงพาณิชย์ค่อนข้างแพงที่มีแนวโน้ม ของช่วงราคาของผู้ถาม
จูลส์

คำตอบ:


28

ซอฟต์แวร์เป็นแบบเรียลไทม์ไม่ใช่เมื่อเร็วที่สุดเท่าที่จะเป็นไปได้ แต่เมื่อมีการรับประกันว่ากระบวนการจะเสร็จสิ้นภายในช่วงเวลาที่กำหนด ในระบบแบบเรียลไทม์ที่นุ่มนวลดี แต่ไม่จำเป็นอย่างยิ่งที่จะรับประกันได้ เช่นในเกมการคำนวณที่จำเป็นสำหรับเฟรมควรเสร็จสิ้นภายในระยะเวลาของเฟรมมิฉะนั้นเฟรมจะลดลง สิ่งนี้จะลดคุณภาพของการเล่นเกม แต่ไม่ได้ทำให้มันผิด เช่น Minecraft เป็นเกมที่สนุกแม้ว่าบางครั้งจะทำให้ติดขัด

ในระบบเรียลไทม์ที่ยากลำบากเราไม่มีเสรีภาพดังกล่าว ซอฟต์แวร์ควบคุมการบินจะต้องตอบสนองภายในเวลาที่กำหนดหรือยานพาหนะอาจผิดพลาดได้ และฮาร์ดแวร์ระบบปฏิบัติการและซอฟต์แวร์จะต้องทำงานร่วมกันเพื่อสนับสนุนเวลาจริง

ตัวอย่างเช่นระบบปฏิบัติการมีตัวกำหนดตารางเวลาเพื่อตัดสินใจว่าจะรันเธรดใด สำหรับโปรแกรมแบบเรียลไทม์ตัวจัดตารางเวลาต้องรับประกันช่วงเวลาที่ใหญ่และเพียงพอที่เพียงพอ กระบวนการอื่นใดที่ต้องการดำเนินการในสล็อตดังกล่าวจะต้องถูกขัดจังหวะโดยสนับสนุนกระบวนการแบบเรียลไทม์ สิ่งนี้ต้องใช้ตัวกำหนดตารางเวลาพร้อมการสนับสนุนตามเวลาจริงอย่างชัดเจน

นอกจากนี้โปรแกรมพื้นที่ผู้ใช้จะทำการเรียกระบบเข้าสู่เคอร์เนล ในระบบปฏิบัติการแบบเรียลไทม์สิ่งเหล่านี้จะต้องเป็นแบบเรียลไทม์ เช่นการเขียนไปยังตัวจัดการไฟล์จะต้องรับประกันว่าจะไม่ใช้หน่วยเวลาxอีกต่อไปซึ่งจะแก้ปัญหาบันทึก สิ่งนี้ส่งผลกระทบต่อวิธีการเรียกใช้งานระบบเช่นสามารถใช้บัฟเฟอร์ได้อย่างไร นอกจากนี้ยังหมายความว่าการโทรต้องล้มเหลวหากไม่สามารถดำเนินการให้เสร็จภายในเวลาที่กำหนดและต้องเตรียมโปรแกรมสำหรับผู้ใช้เพื่อจัดการกับกรณีเหล่านี้ ในกรณีของ Java, JVM และไลบรารี่มาตรฐานจะคล้ายกับเคอร์เนลและต้องการการสนับสนุนแบบเรียลไทม์อย่างชัดเจน

สำหรับทุกสิ่งที่เป็นแบบเรียลไทม์สไตล์การเขียนโปรแกรมของคุณจะเปลี่ยนไป หากคุณไม่มีเวลา จำกัด คุณต้อง จำกัด ตัวเองให้ประสบปัญหาเล็กน้อย ลูปทั้งหมดของคุณจะต้องล้อมรอบด้วยค่าคงที่บางอย่าง หน่วยความจำทั้งหมดสามารถจัดสรรแบบคงที่เนื่องจากคุณมีขอบเขตบนขนาด ไม่อนุญาตการสอบถามซ้ำที่ไม่ จำกัด สิ่งนี้ขัดกับแนวปฏิบัติที่ดีที่สุดมากมาย แต่ไม่ได้ใช้กับระบบเรียลไทม์ เช่นระบบการบันทึกอาจใช้บัฟเฟอร์วงแหวนแบบคงที่เพื่อจัดเก็บข้อความบันทึกเมื่อมีการเขียน เมื่อถึงจุดเริ่มต้นแล้วบันทึกเก่าจะถูกยกเลิกหรือเงื่อนไขนี้อาจเป็นข้อผิดพลาด


4

จากวิกิพีเดีย :

ลักษณะสำคัญของ RTOS คือระดับของความสอดคล้องที่เกี่ยวข้องกับระยะเวลาที่ใช้ในการยอมรับและทำภารกิจของแอปพลิเคชันให้เสร็จสมบูรณ์ ความแปรปรวนคือกระวนกระวายใจ

สิ่งที่สำคัญคือกระวนกระวายใจที่วัดสำหรับระบบการได้รับการพิจารณาเวลาจริง บทความกล่าวต่อไปว่าถ้ากระวนกระวายใจเป็นมักจะกระโดดระบบจะนุ่มแบบ real-time หากกระวนกระวายใจจะเสมอล้อมรอบระบบจะยากแบบ real-time

หากคุณไม่ได้ใช้จาวาและลีนุกซ์ในแง่ของการกระวนกระวายใจพวกมันไม่ใช่แบบเรียลไทม์ การรวบรวมขยะและการบันทึกเป็นแหล่งที่มาของกระวนกระวายใจอย่างแน่นอน แต่แม้การประมวลผลเครือข่ายแพ็คเก็ตอิสระ (เช่น) จะนับถ้ามันแนะนำ jitter ในกระบวนการของคุณ


1

สำหรับผู้เริ่มต้น vanilla Linux เองไม่สามารถทำตามเวลาจริงได้ นั่นเป็นเหตุผลที่RTLinuxได้รับการพัฒนา

ให้บอกว่าคุณรันกระบวนการ java บางอย่างบน RTLinux พวกเขายังคงพิจารณาแบบเรียลไทม์เนื่องจากกระบวนการทั้งหมดนั้นถูกกำหนดโดยเคอร์เนลนั่นคือหากกระบวนการหนึ่งล่าช้ากระบวนการอื่น ๆ ยังคงสามารถแบ่งเวลาซีพียูได้

ตอนนี้หากกระบวนการ java รันเธรดเขียวการประมวลผลเธรดเหล่านี้จะไม่เป็นแบบเรียลไทม์อีกต่อไปเนื่องจาก JVM ไม่ได้กำหนดเวลาตามเวลาจริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.