2010-05-06 20 views
5

Tôi đang thiết kế vòng lặp sự kiện cho ổ cắm không đồng bộ IO bằng cách sử dụng epoll/devpoll/kqueue/poll/select (bao gồm cả cửa sổ chọn).Thiết kế vòng lặp sự kiện không đồng bộ và các vấn đề

tôi có hai lựa chọn thực hiện, IO hoạt động:

chế độ

Non-blocking, cuộc thăm dò trên EAGAIN

  1. Set ổ cắm sang chế độ non-blocking.
  2. Đọc/ghi vào ổ cắm.
  3. Nếu hoạt động thành công, hãy đăng thông báo hoàn thành lên vòng lặp sự kiện.
  4. Nếu tôi nhận được EAGAIN, hãy thêm ổ cắm vào "danh sách lựa chọn" và ổ cắm thăm dò ý kiến.

chế độ Polling: thăm dò và sau đó thực hiện

  1. Add ổ cắm để chọn danh sách và thăm dò ý kiến ​​nó.
  2. Chờ thông báo rằng nó có thể đọc ghi
  3. đọc/viết
  4. bài viết hoàn thành thông báo để lặp sự kiện của sucseeds

Đối với tôi nó trông giống như đầu tiên sẽ yêu cầu ít system call khi sử dụng ở chế độ bình thường , đặc biệt là để ghi vào ổ cắm (bộ đệm là khá lớn). Ngoài ra có vẻ như nó sẽ có thể làm giảm chi phí trên số "chọn" thực thi, đặc biệt là nó là tốt đẹp khi bạn không có cái gì đó quy mô tốt như epoll/devpoll/kqueue.

Câu hỏi:

  • Có bất kỳ ưu điểm của cách tiếp cận thứ hai?
  • Có bất kỳ vấn đề về tính di động nào với các hoạt động không chặn trên bộ mô tả ổ cắm/tệp trên nhiều hệ điều hành: Linux, FreeBSD, Solaris, MacOSX, Windows.

Ghi chú: Xin đừng đề nghị sử dụng triển khai sự kiện vòng/ổ cắm-api

Trả lời

3

Tôi không chắc có bất kỳ vấn đề nền tảng hiện có; nhiều nhất bạn sẽ phải sử dụng Windows Sockets API, nhưng với cùng một kết quả.

Nếu không, bạn có vẻ như đang bỏ phiếu trong cả hai trường hợp (tránh chặn việc chờ đợi), vì vậy cả hai cách tiếp cận đều ổn. Miễn là bạn không đặt mình vào một vị trí để chặn (ví dụ: đọc khi không có dữ liệu, viết khi bộ đệm đầy), nó không tạo ra sự khác biệt nào cả.

Có thể cách tiếp cận đầu tiên dễ hiểu hơn về mã/hiểu; vì vậy, đi với điều đó.

Bạn có thể quan tâm để xem tài liệu của libevc10k problem để biết các ý tưởng/cách tiếp cận thú vị về chủ đề này.

2

Việc thiết kế đầu tiên là Proactor Pattern, thứ hai là các Reactor Pattern

Một ưu điểm của mô hình lò phản ứng là bạn có thể thiết kế API của bạn như vậy mà bạn không cần phải phân bổ bộ đệm đọc cho đến khi dữ liệu thực sự có để được đọc. Điều này làm giảm mức sử dụng bộ nhớ trong khi bạn đang chờ I/O.

+0

Tôi không thấy lý do nào khiến bạn không thể đợi để cấp phát bộ nhớ til cần thiết bằng cách sử dụng cách tiếp cận đầu tiên. Tui bỏ lỡ điều gì vậy? – Ioan

+2

Tôi cho là vậy nhưng trong thực tế nó không được thực hiện theo cách đó. Trong trường hợp đầu tiên bạn cần bộ đệm có sẵn từ bước 2-4, trong trường hợp thứ hai bạn cần nó chỉ trong bước 3. – karunski

1

từ kinh nghiệm của tôi với độ trễ thấp ứng dụng ổ cắm:

cho viết - cố gắng để viết trực tiếp vào ổ cắm từ viết chủ đề (bạn cần để có được vòng lặp sự kiện mutex cho điều đó), nếu ghi không đầy đủ đăng ký để viết sẵn sàng với vòng lặp sự kiện (select/waitformultipleobjects) và viết từ chuỗi vòng lặp sự kiện khi socket có thể ghi được

để đọc - luôn luôn "đăng ký" để sẵn sàng đọc cho tất cả các ổ cắm, vì vậy bạn luôn đọc từ trong vòng lặp sự kiện khi socket được có thể đọc được