2012-01-29 18 views

Trả lời

3

"Chặn" có nghĩa là các chuỗi phải đợi miễn là cần thiết để tài nguyên trở nên khả dụng ... có nghĩa là, theo định nghĩa, các chuỗi sẽ được ngồi quanh chờ tài nguyên. Không chặn tránh loại điều này.

Nói chung, các giải pháp không chặn là phức tạp hơn, nhưng chúng tránh tranh chấp tài nguyên, giúp dễ dàng mở rộng quy mô hơn. (Điều đó nói rằng, điểm Channel là để làm cho điều này ít phức tạp hơn.)

+1

Không chặn I/O không có nghĩa là các chủ đề không chờ đợi, nó chỉ đơn giản có nghĩa là hoạt động chờ tách biệt với hoạt động I/O. –

6

Vì ngăn xếp luồng thường lớn hơn nhiều so với cấu trúc dữ liệu cần thiết để hỗ trợ kết nối I/O không đồng bộ. Ngoài ra, lập kế hoạch hàng ngàn chủ đề là không hiệu quả.

+3

Đó là đối số thông thường, nhưng: Tôi có thể chạy hàng chục nghìn chủ đề trên máy tính để bàn của mình, nhưng tôi chưa thấy bất kỳ vấn đề nào thực sự có thể phục vụ hàng chục nghìn kết nối từ một máy tính duy nhất mà không phải mọi thứ đều dừng lại. Vì vậy, đó có vẻ là một lập luận yếu đối với tôi. Ngoài ra NIO nonblocking với bộ chọn [không phải là một lựa chọn tuyệt vời như vậy thường đủ] (http://www.mailinator.com/tymaPaulMultithreaded.pdf) – Voo

+0

@Voo: Một số kết nối có thể không hoạt động trong hàng chục phút tại một thời điểm, nhưng vẫn mở. –

+1

@Voo, tôi nghi ngờ bạn có hàng chục ngàn Runnable (không chỉ là chạy không tải) chủ đề. chuyển đổi ngữ cảnh ngay cả giá rẻ vẫn là một bộ nhớ cache TLB đuổi w/cache nhớ nhiều hơn. Làm việc trên hàng ngàn kết nối tôi muốn nói rằng phục vụ 2k người dùng w/khoảng 85k tin nhắn/giây trên ổ cắm kép xeon mất như 20% CPU (của tất cả CPUS) ... Ngoài ra NIO cho phép giao thông giao thông 'công bằng' rất quan trọng và rất thường bị bỏ qua vì nó đảm bảo độ trễ ổn định cho khách hàng. (Iirc điểm chuẩn không đo độ trễ) – bestsss

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