Những gì tôi vẻ hiểu:Sự khác biệt giữa POSIX AIO và libaio trên Linux?
POSIX AIO
API được prototyped trong <aio.h>
và bạn liên kết chương trình của bạn với librt (-lrt), trong khi libaio
API trong <libaio.h>
và chương trình của bạn được liên kết với libaio (-laio).
Những gì tôi không thể tìm ra:
1.Does hạt nhân xử lý một trong những phương pháp khác nhau?
2.Có bắt buộc phải có cờ O_DIRECT
để sử dụng một trong hai thẻ này không?
Như đã đề cập trong this post, libaio hoạt động tốt mà không O_DIRECT
khi sử dụng libaio
.Okay, hiểu nhưng:
Theo Hệ thống Linux R.Love của trình cuốn sách, Linux hỗ trợ aio (mà tôi giả định là POSIX AIO) trên các tệp thông thường chỉ nếu được mở bằng O_DIRECT
.Nhưng một chương trình nhỏ mà tôi đã viết (sử dụng aio.h, được liên kết với -lrt) gọi aio_write
trên một tệp được mở mà không có cờ O_DIRECT
hoạt động mà không có sự cố.
Cảm ơn bạn đã trả lời.Vì vậy, đối với POSIX AIO, O_DIRECT là * không * bắt buộc, nhưng đối với kerenel AIO, đó là (để đảm bảo không có dự phòng xảy ra)? Điều này dường như mâu thuẫn với những gì được đề cập trong cuốn sách. Trong mã hạt nhân, VFS có aio_read/write các hàm được gọi (?) bằng cách gọi hàm aio_read/write (là POXIS AIO chứ không phải là AIO hạt nhân). – itisravi
Không có aio_ * syscalls (http://linux.die.net/man/2/syscalls). Các hàm aio_ * bạn thấy trong vfs có lẽ là một phần của aio hạt nhân. các chức năng * cấp người dùng * aio_ * không ánh xạ 1: 1 cho các cuộc gọi hệ thống. – Arvid
@Arvid Bạn vui lòng giải thích về loại trường hợp io_submit() đang chặn không? (bạn đề cập đến đôi khi nó có thể chặn đĩa) – ARH