Các lý do tại sao một ngăn xếp Java / Linux không thành công trong thời gian thực là LỚN?


20

Tôi thường nghe các nhà phát triển đề cập rằng Java không thể " thực hiện thời gian thực ", nghĩa là một ứng dụng Java chạy trên Linux không thể đáp ứng các yêu cầu của hệ thống thời gian thực xác định, chẳng hạn như một cái gì đó chạy trên RIOT-OS, v.v.

Tôi đang cố gắng để hiểu tại sao . SWAG của tôi nói với tôi rằng điều này có lẽ phần lớn là do Trình thu gom rác của Java, có thể chạy bất cứ lúc nào và hoàn toàn tạm dừng hệ thống. Và mặc dù có cái gọi là "các GC tạm dừng" ngoài kia, tôi không nhất thiết phải tin vào quảng cáo của họ và cũng không có ví dụ $ 80K mỗi JVM để trao đổi cho một dự án sở thích!

Tôi cũng đã đọc bài viết này về việc chạy phần mềm drone trên Linux . Trong bài viết đó, tác giả đã mô tả một kịch bản trong đó Linux gần như khiến máy bay không người lái của mình đâm vào xe của mình:

Tôi đã học được một bài học khó sau khi chọn thực hiện vòng điều khiển mức thấp (PID) trên Pi - cố gắng khéo léo Tôi quyết định đặt một bản ghi nhật ký ở giữa vòng lặp để gỡ lỗi - ban đầu, quad đã chạy tốt nhưng Linux đã quyết định mất 2 giây để viết một mục nhật ký và bộ tứ gần như đâm vào xe của tôi!

Bây giờ mặc dù tác giả đó đã viết phần mềm bay không người lái của mình bằng C ++, tôi sẽ tưởng tượng một ứng dụng Java chạy trên Linux rất có thể chịu chung số phận.

Theo Wikipedia:

Một hệ thống được gọi là thời gian thực nếu tổng độ chính xác của một thao tác không chỉ phụ thuộc vào tính chính xác logic của nó, mà còn phụ thuộc vào thời gian mà nó được thực hiện.

Vì vậy, với tôi, điều này có nghĩa là " Bạn không có thời gian thực nếu tổng độ chính xác đòi hỏi tính đúng đắn và kịp thời logic " .

Hãy giả vờ rằng tôi đã viết một ứng dụng Java để trở nên siêu hiệu quả và tôi đã "vắt chanh" để nói và nó không thể được viết một cách hợp lý (bằng Java) nhanh hơn nữa.

Nói chung, câu hỏi của tôi là: Tôi đang tìm ai đó để giải thích cho tôi tất cả / hầu hết các lý do tại sao một ứng dụng Java chạy n Linux sẽ không trở thành "ứng dụng thời gian thực". Có nghĩa là, tất cả các danh mục của mọi thứ trên ngăn xếp Java / Linux là gì ngăn nó "kịp thời", và do đó, " hoàn toàn chính xác "? Như đã đề cập, có vẻ như việc ghi nhật ký của GC và Linux có thể tạm dừng thực thi, nhưng tôi chắc chắn rằng có nhiều thứ bên ngoài ứng dụng Java sẽ gây ra thời gian / hiệu suất kém và khiến nó gặp phải các ràng buộc về thời hạn khó khăn. Họ là ai?


3
Xem JSR001
coredump

1
FWIW, Linux có thể được tạo ra để hành xử theo những cách phù hợp cho các hệ thống thời gian thực cứng, nhưng nó liên quan đến một số kỹ thuật có thể bị bỏ qua bởi các nhà phát triển nhúng sở thích điển hình. Có những cuốn sách tốt để phát triển thời gian thực linux; Tôi muốn đề nghị mua một cái.
Jules

@coredump không may, như xa như tôi có thể nhìn thấy trong danh sách triển khai của JSR-1 đã có chỉ từng bốn hiện thực, hai trong số đó hiện không có sẵn, và hai người kia dường như các dịch vụ thương mại khá đắt tiền có khả năng ra trong phạm vi giá của người hỏi.
Jules

Câu trả lời:


28

Một phần mềm là thời gian thực không phải là khi nó nhanh nhất có thể, nhưng khi nó được đảm bảo rằng một quy trình hoàn thành trong một số khoảng thời gian xác định. Trong một hệ thống thời gian thực mềm, nó là tốt nhưng không hoàn toàn cần thiết rằng điều này được đảm bảo. Ví dụ, trong một trò chơi, các tính toán cần thiết cho một khung sẽ hoàn thành trong khoảng thời gian của khung hoặc tốc độ khung hình sẽ giảm xuống. Điều này làm giảm chất lượng của trò chơi, nhưng không làm cho nó không chính xác. Ví dụ, Minecraft rất thú vị mặc dù trò chơi thỉnh thoảng nói lắp.

Trong một hệ thống thời gian thực khó khăn, chúng ta không có những quyền tự do như vậy. Một phần mềm điều khiển chuyến bay phải phản ứng trong một số thời hạn, hoặc chiếc xe có thể gặp sự cố. Và phần cứng, HĐH và phần mềm phải hoạt động cùng nhau để hỗ trợ thời gian thực.

Ví dụ, HĐH có bộ lập lịch để quyết định khi nào luồng nào được chạy. Đối với một chương trình thời gian thực, bộ lập lịch phải đảm bảo các khe thời gian đủ lớn, đủ thường xuyên. Bất kỳ quy trình nào khác muốn thực hiện trong một vị trí như vậy phải bị gián đoạn theo hướng có lợi cho quy trình thời gian thực. Điều này đòi hỏi một bộ lập lịch với sự hỗ trợ thời gian thực rõ ràng.

Ngoài ra, một chương trình không gian người dùng sẽ thực hiện các cuộc gọi hệ thống vào kernel. Trong một hệ điều hành thời gian thực, chúng cũng phải là thời gian thực. Ví dụ, việc ghi vào một tệp xử lý tệp sẽ phải được đảm bảo không mất thêm đơn vị thời gian x nào, điều này sẽ giải quyết vấn đề nhật ký. Điều này tác động đến cách gọi hệ thống như vậy có thể được thực hiện, ví dụ như cách sử dụng bộ đệm. Điều đó cũng có nghĩa là một cuộc gọi phải thất bại nếu không thể hoàn thành trong thời gian cần thiết và chương trình không gian người dùng phải được chuẩn bị để xử lý các trường hợp này. Trong trường hợp của Java, JVM và thư viện chuẩn cũng giống như kernel và sẽ cần hỗ trợ thời gian thực rõ ràng.

Đối với bất cứ điều gì là thời gian thực, phong cách lập trình của bạn sẽ thay đổi. Nếu bạn không có thời gian vô tận, bạn phải hạn chế những vấn đề nhỏ. Tất cả các vòng lặp của bạn phải được giới hạn bởi một số hằng số. Tất cả bộ nhớ có thể được phân bổ tĩnh, vì bạn có giới hạn trên về kích thước. Đệ quy không hạn chế bị cấm. Điều này đi ngược lại rất nhiều thực tiễn tốt nhất, nhưng chúng không áp dụng cho các hệ thống thời gian thực. Ví dụ, một hệ thống ghi nhật ký có thể sử dụng bộ đệm vòng được phân bổ tĩnh để lưu trữ thông điệp tường trình khi chúng được viết. Khi bắt đầu đạt được, các bản ghi cũ sẽ bị loại bỏ hoặc điều kiện này có thể là một lỗi.


4

Từ wikipedia :

Một đặc điểm chính của RTOS là mức độ nhất quán của nó liên quan đến lượng thời gian cần thiết để chấp nhận và hoàn thành nhiệm vụ của ứng dụng; sự thay đổi là jitter.

Điều quan trọng là jitter được định lượng để hệ thống được coi là thời gian thực . Bài báo tiếp tục nói rằng nếu jitter thường bị chặn, hệ thống là thời gian thực mềm . Nếu jitter luôn bị giới hạn, hệ thống sẽ cứng theo thời gian thực .

Trừ khi các phiên bản Java và Linux bạn sử dụng được định lượng theo thuật ngữ jitter, chúng không phải là thời gian thực. Thu gom rác và ghi nhật ký chắc chắn là nguồn gây nhiễu, nhưng thậm chí xử lý tự động các gói mạng (ví dụ) sẽ tính nếu nó đưa jitter vào các quy trình của bạn .


1

Để bắt đầu, Linux vanilla không thể làm theo thời gian thực. Đó là lý do tại sao RTLinux được phát triển.

Hãy nói rằng bạn chạy một vài quy trình java trên RTLinux, chúng vẫn được coi là thời gian thực vì tất cả các quy trình đó được lên lịch bởi kernel, tức là nếu một quy trình bị trễ, các quy trình khác vẫn có thể đảm bảo thời gian cpu của chúng.

Bây giờ, nếu các quy trình java chạy các luồng Xanh , thì việc thực thi các luồng này sẽ không còn là thời gian thực nữa vì JVM không thực hiện lập lịch thời gian thực.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.