Tôi đã xem bài nói chuyện này về việc triển khai Async IO trong Rust và Carl đề cập đến hai mô hình tiềm năng. Sẵn sàng và hoàn thành.
Mô hình sẵn sàng:
- bạn nói với kernel bạn muốn đọc từ socket
- làm những việc khác trong một lúc
- kernel cho bạn biết khi socket đã sẵn sàng
- bạn đọc (điền vào một bộ đệm)
- làm bất cứ điều gì bạn cần
- giải phóng bộ đệm (xảy ra tự động với Rust)
Mô hình hoàn thành:
- bạn cấp phát một bộ đệm cho kernel để điền vào
- làm những việc khác trong một lúc
- kernel cho bạn biết khi bộ đệm đã được lấp đầy
- làm bất cứ điều gì bạn cần với dữ liệu
- giải phóng bộ đệm
Trong ví dụ của việc sử dụng các mô hình sẵn sàng Carl bạn có thể lặp trên ổ cắm sẵn sàng điền và giải phóng một bộ đệm toàn cầu mà làm cho nó có vẻ như nó sẽ sử dụng nhiều ít bộ nhớ.
Bây giờ giả định của tôi:
Dưới mui xe (trong không gian kernel) khi ổ cắm được cho là "sẵn sàng", dữ liệu đã tồn tại. Nó đã đi vào ổ cắm qua mạng (hoặc từ bất cứ đâu) và HĐH đang giữ dữ liệu.
Không giống như việc phân bổ bộ nhớ một cách kỳ diệu không xảy ra trong mô hình sẵn sàng. Chỉ là hệ điều hành đang trừu tượng hóa nó từ bạn. Trong mô hình Hoàn thành, HĐH đang yêu cầu bạn phân bổ bộ nhớ trước khi dữ liệu thực sự chảy vào và rõ ràng điều gì đang xảy ra.
Đây là phiên bản sửa đổi của Mô hình Sẵn sàng:
- bạn nói với kernel bạn muốn đọc từ socket
- làm những việc khác trong một lúc
- SỬA ĐỔI: dữ liệu đi vào HĐH (một số vị trí trong bộ nhớ kernel)
- kernel cho bạn biết socket đã sẵn sàng
- bạn đọc (điền vào một bộ đệm khác tách biệt với bộ đệm hạt nhân abover (hoặc bạn có một con trỏ tới nó?))
- làm bất cứ điều gì bạn cần
- giải phóng bộ đệm (xảy ra tự động với Rust)
/ Giả định của tôi
Tôi tình cờ thích giữ chương trình không gian người dùng nhỏ nhưng tôi chỉ muốn làm rõ một chút về những gì thực tế đang xảy ra ở đây. Tôi không thấy rằng một mô hình vốn dĩ sẽ sử dụng ít bộ nhớ hơn hoặc hỗ trợ mức IO đồng thời cao hơn. Tôi muốn nghe suy nghĩ và giải thích sâu hơn về điều này.