2010-05-27 21 views
9

Tôi đang làm việc trên một ứng dụng luồng trên Linux trong C++ cố gắng để được thời gian thực, làm một hành động trên một nhịp tim, hoặc càng gần nó càng tốt.Chủ đề của tôi có thể giúp hệ điều hành quyết định thời điểm chuyển ngữ cảnh sang ngữ cảnh không?

Trong thực tế, tôi thấy hệ điều hành đang hoán đổi chủ đề của mình và gây chậm trễ lên đến một phần mười giây trong khi nó bị tắt, khiến nhịp tim không đều.

Có cách nào mà luồng của tôi có thể gợi ý cho hệ điều hành mà bây giờ là thời điểm thích hợp để chuyển ngữ cảnh không? Tôi có thể thực hiện cuộc gọi này ngay sau khi thực hiện một nhịp tim, và do đó giảm thiểu sự chậm trễ do một chuyển đổi ngữ cảnh theo thời gian bị bệnh.

+1

"gây chậm trễ đến một phần mười giây" Tôi thực sự nghi ngờ rằng ngữ cảnh chuyển đổi bởi hệ điều hành đang trì hoãn bạn 100 mili giây. Tôi cá là có điều gì đó đang diễn ra ở đây. – JonM

+4

Nếu bạn muốn có thời gian đáp ứng ổn định, bạn thực sự cần các chuỗi RT (và, có thể là hạt nhân hỗ trợ RT) – osgx

Trả lời

5

Thật khó để nói vấn đề chính là gì trong trường hợp của bạn, nhưng nó chắc chắn không phải là một cái gì đó có thể được sửa chữa với một cuộc gọi đến sched_yield() hoặc pthread_yield(). Việc sử dụng duy nhất được xác định rõ ràng cho năng suất, trong Linux, là cho phép một luồng sẵn sàng khác nhau để ngăn chặn luồng đang chạy CPU đang chạy ở cùng mức độ ưu tiên trên cùng một CPU theo chính sách lập lịch biểu SCHED_FIFO. Đó là một quyết định thiết kế kém trong hầu hết các trường hợp.

Nếu bạn nghiêm túc về mục tiêu "cố gắng là thời gian thực" trong Linux, thì trước tiên, bạn nên sử dụng cài đặt sched_setscheduler thời gian thực (SCHED_FIFO hoặc SCHED_RR, FIFO được ưu tiên). Thứ hai, nhận bản vá đầy đủ miễn phí cho Linux (từ kernel.org nếu bản phân phối của bạn không cung cấp bản phát hành. Nó cũng sẽ cung cấp cho bạn khả năng lên lịch lại trình điều khiển thiết bị và thực thi chủ đề của bạn cao hơn, chẳng hạn như ổ đĩa cứng hoặc trình điều khiển ethernet. Thứ ba, xem RTWiki và các tài nguyên khác để biết thêm các gợi ý về cách thiết kế và thiết lập một ứng dụng thời gian thực.

Điều này sẽ đủ để giúp bạn dưới 10 vi giây thời gian phản hồi, bất kể tải hệ thống trên bất kỳ hệ thống máy tính để bàn nào. Tôi có một hệ thống nhúng, nơi tôi chỉ ép ra 60 phản hồi của chúng tôi nhàn rỗi và 150 chúng tôi dưới đĩa nặng/tải hệ thống, nhưng nó vẫn là đơn đặt hàng của cường độ nhanh hơn so với những gì bạn mô tả.

0

Tôi không quá chắc chắn đối với Linux, nhưng trên Windows, nó được giải thích rằng you can't ask the system to not interrupt you for several reasons (đoạn đầu tiên chủ yếu). Tắt đầu của tôi, một trong những lý do là phần cứng ngắt có thể xảy ra bất cứ lúc nào và trên đó bạn không có quyền kiểm soát.

EDIT Một số người chỉ đề xuất sử dụng sched_yield sau đó xóa câu trả lời của mình. Nó sẽ từ bỏ thời gian cho toàn bộ quá trình của bạn mặc dù. Bạn cũng có thể sử dụng sched_setscheduler để gợi ý hạt nhân về những gì bạn cần.

3

Bạn có thể nói với các chủ đề thực hiện tạm dừng thực hiện với các lệnh khác nhau như yield.

Chỉ cần nói chuỗi dừng là không xác định, 999 lần nó có thể cung cấp khoảng thời gian tốt và 1 lần không.

Có thể bạn sẽ muốn xem lập lịch thời gian thực để có kết quả nhất quán. Trang web này http://www2.net.in.tum.de/~gregor/docs/pthread-scheduling.html dường như là một điểm khởi đầu tốt để nghiên cứu về lập lịch trình chuỗi.

1

Tôi hơi bối rối bởi câu hỏi. Nếu chương trình của bạn chỉ chờ đợi một nhịp tim định kỳ và sau đó thực hiện một số công việc, thì hệ điều hành nên biết lịch trình những thứ khác khi bạn quay lại chờ đợi nhịp tim.

Bạn không quay trên một lá cờ để có được "nhịp tim" là bạn?

1

Bạn sử dụng chức năng hẹn giờ chẳng hạn như setitimer(), phải không? QUYỀN ???

Nếu không, thì bạn đang làm tất cả sai.

Bạn có thể cần chỉ định khoảng thời gian hẹn giờ chỉ ngắn hơn một chút so với những gì bạn thực sự cần. Nếu bạn đang sử dụng ưu tiên lên lịch thời gian thực và hẹn giờ, quá trình của bạn hầu như luôn được đánh thức đúng giờ.

Tôi sẽ nói luôn đúng giờ, nhưng Linux không phải là một hệ điều hành thời gian thực hoàn hảo.

+0

'setitimer' không được hỗ trợ cho' timer_create'. –

Các vấn đề liên quan