2013-01-21 20 views
5

Trong Windows, có hai cách để chèn các mục công việc để tránh tạo quá nhiều luồng:Cổng hoàn thành I/O so với QueueUserApc?

Phương tiện 1: Sử dụng IOCP;

Có nghĩa là 2: Sử dụng hàng đợiUserApc.

Tuy nhiên, có nghĩa là 1 là xa phức tạp hơn có nghĩa 2.

Vì vậy, câu hỏi của tôi là: những ưu điểm của phương tiện là những gì liên quan đến 1 của phương tiện 2?

Trả lời

7

Khi bạn gọi QueueUserApc, bạn phải nhắm mục tiêu một chuỗi cụ thể.

IOCP có cơ chế gửi chủ đề được tích hợp sẵn mà QueueUserApc thiếu cho phép bạn nhắm mục tiêu chuỗi hiệu quả nhất trong số các chuỗi chủ đề. Cơ chế gửi chủ đề tự động ngăn quá nhiều luồng chạy cùng một lúc (gây ra các chuyển mạch ngữ cảnh bổ sung và tranh chấp thêm) hoặc quá ít luồng chạy cùng một lúc (điều này gây ra hiệu năng kém).

Windows thực sự theo dõi số chuỗi chạy các công việc IOCP. Ban đầu nó thiết lập số lượng chủ đề cho phép chạy bằng số lõi ảo trên máy. Tuy nhiên, nếu một chuỗi chặn cho I/O hoặc đồng bộ hóa, một luồng khác bị chặn trên cổng IOCP sẽ tự động được giải phóng, tránh làm đói luồng.

Ngoài ra, IOCP có thể dễ dàng kết nối với I/O để các sự kiện I/O kích hoạt các công văn của luồng bị chặn trên cổng IOCP. Đây là cách hiệu quả nhất để làm I/O cho một số lượng lớn các điểm đến trên Windows.

+0

+1. Câu trả lời hay. Lưu ý: đoạn thứ hai dẫn trực tiếp đến lý do bạn là số lượng chủ đề "đang chạy" được phép và kích thước thực của nhóm chủ đề "runnable" có thể khác nhau rõ rệt. Khả năng rất tuyệt vời cho hệ điều hành để thực hiện việc lên lịch nội bộ này cho bạn bằng cách phát hiện tình trạng chờ đợi gần như tuyệt vời và không thể phóng đại được. – WhozCraig

+0

@WhozCraig: Tôi đồng ý. Tôi ngạc nhiên các hệ điều hành khác đã không áp dụng một cơ chế điều phối tương tự. Trong khi các hệ điều hành khác có các cơ chế khám phá I/O xuất sắc (như [epoll] của Linux (http://en.wikipedia.org/wiki/Epoll) và [kqueue] của FreeBSD (http://en.wikipedia.org/wiki/) Kqueue)), tôi không biết bất kỳ hệ điều hành nào khác có cơ chế điều phối tương đương, ít cơ chế được gắn trực tiếp vào cơ chế phát hiện/thông báo I/O. –

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