cuốn sách gpt4 ai đã làm

Linux 内核 : how to wait in multiple wait queues?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 00:09:25 27 4
mua khóa gpt4 Nike

tôi biết cách sử dụng chờ_sự kiện Đang chờ trong hàng đợi nhân Linux và cách đánh thức chúng.

Bây giờ tôi cần tìm ra cách xếp hàng chờ nhiều người cùng một lúc. Tôi cần ghép nhiều nguồn sự kiện, về cơ bản theo cách tương tự như thăm dò ý kiến hoặc select Tuy nhiên, vì nguồn sự kiện không có dạng bộ mô tả tệp có thể thăm dò nên tôi không tìm thấy cảm hứng khi triển khai các lệnh gọi hệ thống này.

Suy nghĩ ban đầu của tôi là từ chờ_sự kiện Lấy mã trong macro và sử dụng nó nhiều lần DEFINE_WAIT cũng như chuẩn bị_để_đợi.

Tuy nhiên, xem xét chuẩn bị_để_đợi Cách triển khai, nếu cùng một "người phục vụ" được thêm nhiều lần, tôi e rằng danh sách liên kết nội bộ của hàng đợi sẽ bị hỏng (điều này có thể xảy ra nếu hàng đợi gây ra tình trạng đánh thức, nhưng không thỏa mãn điều kiện chờ và bắt đầu chờ đợi một lần nữa).

câu trả lời hay nhất

Một trong những tình huống có thể xảy ra khi phải chờ trong nhiều hàng đợi:

int ret = 0; // Kết quả chờ đợi; có dạng 0/-err.

// Xác định các đối tượng chờ, một đối tượng cho mỗi hàng chờ.
DEFINE_WAIT_FUNC(wait1, default_wake_function);
DEFINE_WAIT_FUNC(wait2, default_wake_function);

// Thêm chính chúng tôi vào tất cả hàng chờ.
add_wait_queue(wq1, &wait1);
add_wait_queue(wq2, &wait2);

// Chu kỳ chờ
while(1) {
// Thay đổi trạng thái task đang chờ.
// LƯU Ý: điều này sẽ xảy ra **trước** việc kiểm tra điều kiện để tránh các cuộc đua.
set_current_state(TASK_INTERRUPTIBLE);
// Kiểm tra (các) điều kiện mà chúng ta đang chờ
if(cond) phá vỡ;
//Cần chờ đợi
lịch trình();
// Kiểm tra xem việc chờ đợi có bị gián đoạn bởi tín hiệu không
if (signal_pending(current)) {
ret = -ERESTARTSYS;
phá vỡ;
}
}
// Xóa chính chúng tôi khỏi tất cả hàng đợi.
xóa_wait_queue(wq1, &wait1);
Remove_wait_queue(wq2, &wait2);
// Khôi phục trạng thái tác vụ
__set_current_state(TASK_RUNNING);
// 'ret' chứa kết quả chờ đợi.

Xin lưu ý rằng kịch bản này khác vớichờ_sự kiệnMột là hơi khác một chút:

chờ_sự kiện sử dụng autoremove_wake_function Chờ đồ vật (sử dụng DEFINE_WAIT tạo nên). Chức năng này bắt đầu từ thức dậy() Được gọi để xóa đối tượng đang chờ khỏi hàng đợi. Vì vậy nó là cần thiếtthêm lạiChờ các đối tượng được xếp hàng đợimỗi lần lặp.

Nhưng trong trường hợp có nhiều hàng đợi thì không thể biết hàng đợi nào đã được kích hoạt. Do đó, việc tuân theo chiến lược này đòi hỏi ở mỗi lần lặpthêm lại Mỗi đối tượng chờ, điều này không hiệu quả.

Thay vào đó, kịch bản của chúng tôi sử dụng mặc định_wake_function là một đối tượng chờ, vì vậy đối tượng sẽ không ở trong thức dậy() Khi được gọi để loại bỏ khỏi hàng đợi, việc thêm đối tượng chờ vào hàng đợi chỉ một lần trước khi lặp là đủ.

Về nhân Linux: làm thế nào để chờ trong nhiều hàng chờ?, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/40018689/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress