2012-01-07 46 views
41

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ố.

Trả lời

51

Trên Linux, hai triển khai AIO về cơ bản là khác nhau.

POSIO AIO là một triển khai cấp người dùng thực hiện I/O chặn bình thường trong nhiều luồng, do đó tạo ảo tưởng rằng I/O không đồng bộ. Lý do chính để làm điều này là:

  1. nó hoạt động với bất kỳ hệ thống tập tin
  2. nó hoạt động (chủ yếu) trên bất kỳ hệ điều hành (ghi nhớ rằng libc gnu là portable)
  3. nó hoạt động trên các tập tin với đệm được kích hoạt (tức là không có bộ cờ O_DIRECT)

Hạn chế chính là độ sâu hàng đợi của bạn (số lượng các thao tác bạn có thể thực hiện) bị giới hạn bởi số lượng chủ đề bạn chọn, có nghĩa là hoạt động chậm trên một đĩa có thể chặn hoạt động sang một đĩa khác. Nó cũng ảnh hưởng đến I/O (hoặc bao nhiêu) được nhìn thấy bởi hạt nhân và lập lịch trình đĩa là tốt.

Hạt nhân AIO (tức là io_submit() et.al.) là hỗ trợ hạt nhân cho các hoạt động I/O không đồng bộ, trong đó các yêu cầu io thực sự được xếp hàng trong hạt nhân, được sắp xếp theo bất kỳ bộ lập lịch đĩa nào, có lẽ một số chúng được chuyển tiếp (trong một số thứ tự tối ưu sẽ hy vọng) vào đĩa thực tế như các hoạt động không đồng bộ (sử dụng TCQ hoặc NCQ). Hạn chế chính với cách tiếp cận này là không phải tất cả các hệ thống tập tin đều hoạt động tốt hoặc ở tất cả với I/O không đồng bộ (và có thể rơi trở lại để chặn ngữ nghĩa), các tệp phải được mở bằng O_DIRECT đi kèm với nhiều hạn chế khác Yêu cầu I/O. Nếu bạn không mở được tệp của mình bằng O_DIRECT, nó vẫn có thể "hoạt động", giống như bạn có được đúng dữ liệu, nhưng nó có thể không được thực hiện không đồng bộ, nhưng đang giảm trở lại để chặn ngữ nghĩa.

Cũng nên nhớ rằng io_submit() thực sự có thể chặn trên đĩa trong một số trường hợp nhất định.

+0

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

+1

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

+1

@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

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