2009-08-06 32 views
36

Ngày xửa ngày xưa, tôi gặp phải bài viết Introduction to Indy và không thể ngừng suy nghĩ về chặn với IO không chặn kể từ đó.Chặn IO và IO không chặn; tìm kiếm các bài viết hay nhất

Tìm kiếm một số bài viết mô tả ưu điểm và nhược điểm của việc chặn IO và IO không chặn và cách thiết kế ứng dụng của bạn trong mỗi trường hợp để nhận mã tự nhiên, dễ hiểu và dễ bảo trì.
có muốn hiểu bức tranh BIG ...

Trả lời

15

Những mặt tích cực và tiêu cực là cắt khá rõ ràng:

Chặn - Tuyến tính lập trình, dễ dàng hơn để mã, ít kiểm soát.
Không chặn - Lập trình song song, khó mã hơn, kiểm soát nhiều hơn.

44

Vâng chặn IO có nghĩa là một chuỗi nhất định không thể làm gì thêm cho đến khi IO được nhận đầy đủ (trong trường hợp ổ cắm, thời gian chờ này có thể là thời gian dài).

IO không chặn có nghĩa là yêu cầu IO được xếp hàng ngay lập tức và hàm trả về. IO thực tế sau đó được xử lý tại một số con trỏ sau đó bởi hạt nhân.

Để chặn IO, bạn cần phải chấp nhận rằng bạn sẽ đợi mọi yêu cầu IO hoặc bạn cần phải tắt một chuỗi cho mỗi yêu cầu (Sẽ rất phức tạp rất nhanh).

Đối với IO không chặn, bạn có thể gửi nhiều yêu cầu nhưng bạn cần lưu ý rằng dữ liệu sẽ không có sẵn cho đến khi một số "sau" điểm. Điều này kiểm tra rằng dữ liệu đã thực sự đến có lẽ là phần phức tạp nhất.

Trong 99% các ứng dụng, bạn sẽ không cần phải quan tâm rằng khối IO của bạn. Tuy nhiên, đôi khi bạn cần thêm hiệu năng cho phép bản thân bắt đầu một yêu cầu IO và sau đó thực hiện một việc khác trước khi quay lại và hy vọng rằng việc yêu cầu IO đã hoàn thành.

Dù sao, chỉ là sự tuỵ của tôi.

+1

Hình thức ứng dụng chăm sóc khá nhiều 100% thời gian nếu khối IO. Người dùng không thích GUI bị treo. –

+7

Không có gì ngăn bạn chạy một chuỗi riêng biệt thực hiện tất cả IO serially và chặn ... – Goz

0

Tôi chưa tìm thấy bài viết hay.

Tôi đã yêu cầu vào đây để đề xuất về cách bố trí async đang IO: tidy code for asynchronous IO

Những câu trả lời thực sự là không phải là rất nóng lên.

IO không đồng bộ là một con thú để tránh xung quanh và gỡ lỗi, đặc biệt nếu bạn sử dụng trình kích hoạt cạnh (ví dụ: epoll của Linux với cờ EPOLLET). Nhưng đó là những gì bạn phải trả cho mã phức tạp, bạn giành chiến thắng trong hiệu suất và khả năng mở rộng.

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