2012-03-22 34 views
27

thể trùng lặp:
mmap() vs. reading blocksTại sao mmap() nhanh hơn IO tuần tự?

tôi nghe (đọc nó trên mạng Internet ở đâu đó) mà mmap() là nhanh hơn so với tuần tự IO. Điều này có đúng không? Nếu có thì tại sao nó nhanh hơn?

  • mmap() không đọc tuần tự.
  • mmap() phải tìm nạp từ chính đĩa giống như read() không
  • Khu vực được ánh xạ không phải là tuần tự - vì vậy không có DMA (?).

Vì vậy, mmap() thực sự phải chậm hơn read() từ tệp? Giả định nào của tôi ở trên là sai?

+3

Điều gì cho bạn biết nó nhanh hơn? – Mehrdad

+1

@Mehrdad Tôi thấy một số nhận xét trên internet rằng mmap nhanh hơn –

+3

http://stackoverflow.com/questions/258091/when-should-i-use-mmap-for-file-access –

Trả lời

42

Tôi nghe (đọc nó trên internet ở đâu đó) mà mmap() nhanh hơn IO tuần tự. Điều này có đúng không? Nếu có thì tại sao nó nhanh hơn?

Có thể có - có ưu và khuyết điểm, được liệt kê bên dưới. Khi bạn thực sự có lý do để quan tâm, hãy luôn chuẩn bị cả hai.

Khá khác biệt với hiệu suất IO thực tế, có ý nghĩa cho cách mã ứng dụng theo dõi khi cần thực hiện I/O và xử lý/tạo dữ liệu đôi khi có thể tác động đáng kể đến hiệu suất.

1) mmap() không đọc tuần tự. 2) mmap() phải lấy từ đĩa chính nó giống như read() không 3) Khu vực được ánh xạ không phải là tuần tự - vì vậy không có DMA (?).

Vì vậy, mmap() thực sự phải chậm hơn so với read() từ tệp không? Giả định nào của tôi ở trên là sai?

1) là sai ... mmap() gán một vùng không gian địa chỉ ảo tương ứng với tập tin nội dung ... bất cứ khi nào một trang trong không gian địa chỉ được truy cập, RAM vật lý được tìm thấy để sao lưu các địa chỉ ảo và tương ứng nội dung đĩa bị lỗi trong RAM đó. Vì vậy, thứ tự trong đó lần đọc được thực hiện từ đĩa khớp với thứ tự truy cập. Đó là một cơ chế I/O "lười". Ví dụ: nếu bạn cần lập chỉ mục thành một bảng băm lớn được đọc từ đĩa, sau đó nhập tệp và bắt đầu thực hiện truy cập nghĩa là đĩa I/O không được thực hiện tuần tự và do đó có thể dẫn đến thời gian trôi qua lâu hơn cho đến khi toàn bộ tập tin được đọc vào bộ nhớ, nhưng trong khi đó việc tìm kiếm đang thành công và phụ thuộc có thể được thực hiện, và nếu các phần của tệp không bao giờ thực sự cần thiết thì chúng không được đọc (cho phép độ chi tiết của các trang đĩa và bộ nhớ, và rằng ngay cả khi sử dụng bộ nhớ ánh xạ nhiều OS cho phép bạn chỉ định một số mẹo nâng cao hiệu suất/bộ nhớ hiệu quả về các mẫu truy cập được lên kế hoạch của bạn để họ có thể chủ động đọc trước hoặc giải phóng bộ nhớ mạnh hơn khi biết bạn không thể quay lại nó).

2) hoàn toàn đúng

3) "Khu vực được ánh xạ không tuần tự" là mơ hồ. Vùng bộ nhớ được ánh xạ là "tiếp giáp" (tuần tự) trong không gian địa chỉ ảo. Chúng tôi đã thảo luận về đĩa I/O được tuần tự ở trên. Hoặc, bạn đang nghĩ về cái gì khác? Dù sao, trong khi các trang đang bị lỗi, chúng thực sự có thể được chuyển bằng DMA.

Hơn nữa, có những lý do khác khiến lập bản đồ bộ nhớ có thể làm tốt hơn thường lệ I/O:

  • có ít sao chép:
    • thường OS & thư viện thói quen độ truyền dữ liệu thông qua một hoặc nhiều bộ đệm trước khi nó đạt tới bộ đệm được chỉ định bởi ứng dụng, sau đó ứng dụng sẽ cấp phát lưu trữ, sau đó sao chép từ bộ đệm I/O vào bộ nhớ đó để dữ liệu có thể sử dụng được sau khi đọc xong. sử dụng địa điểm (bạn chỉ có thể ghi lại một con trỏ và có thể là chiều dài)
      • tiếp tục truy cập dữ liệu tại chỗ rủi ro tăng trao đổi sau: tệp/bản đồ bộ nhớ có thể chi tiết hơn cấu trúc dữ liệu mà nó có thể được phân tích cú pháp, nên mô hình truy cập vào dữ liệu trong đó có thể có nhiều sự chậm trễ đến lỗi trong các trang bộ nhớ hơn bản đồ bộ nhớ
  • thể đơn giản hóa công việc phân tích cú pháp của ứng dụng bằng cách cho phép các ứng dụng điều trị toàn bộ nội dung tập tin truy cập, chứ không phải lo lắng về việc khi nào để đọc một bộ đệm khác đầy đủ
  • the ap plication làm giảm số lượng trang trong RAM vật lý của hệ điều hành tại bất kỳ thời điểm nào, chia sẻ bộ nhớ cache truy cập trực tiếp một cách hiệu quả với ứng dụng
  • . sử dụng ít hệ thống gọi là"
  • nếu nhiều quá trình đang truy cập vào cùng một tập tin, họ sẽ có thể chia sẻ các trang ủng hộ vật chất

các cũng lý do tại sao mmap có thể chậm hơn - đừng đọc Linus Torvalds của post here mà nói của mmap:

... bảng trang trò chơi cùng với các lỗi (và thậm chí chỉ cần TLB bỏ lỡ) overhead là dễ dàng hơn so với chi phí của việc sao chép một trang trong một đẹp luồng cách ...

Và từ khác của his posts:

  • khá đáng chú ý thiết lập và teardown chi phí. Và tôi có nghĩa là đáng chú ý. Đó là những thứ như sau các bảng trang để unmap tất cả mọi thứ sạch sẽ. Đó là cuốn sách lưu giữ để duy trì một danh sách tất cả các ánh xạ. Đó là tuôn ra TLB cần thiết sau khi unmapping công cụ.

  • lỗi trang là tốn kém. Đó là cách lập bản đồ được phổ biến và nó khá chậm.

FWIW, lần cuối cùng này nảy sinh đối với tôi tại nơi làm việc, bộ nhớ ánh xạ đầu vào là nhanh hơn so với fread et al 80% cho việc đọc hồ sơ cơ sở dữ liệu nhị phân vào một cơ sở dữ liệu độc quyền, trên 64 bit Linux với các tập tin ~ 170GB .

+2

Câu trả lời hay. Cũng sử dụng bộ nhớ maping bạn thường sử dụng các cuộc gọi hệ thống ít hơn. Điều này có thể dẫn đến việc tăng tốc truy cập ngẫu nhiên đáng kể (tức là 'lseek' trước mỗi' đọc'). –

+0

@ well-wisher: tốt, tôi sẽ thêm vào danh sách ở trên ... chúc mừng –

+1

Mặc dù đây là câu hỏi trùng lặp, câu trả lời này có vẻ rõ ràng hơn các câu trả lời khác trong [bài đăng này] (http: // stackoverflow.com/questions/45972/mmap-vs-reading-blocks) ... – sleepsort

5

"Nhanh hơn" trong điều khoản tuyệt đối không tồn tại. Bạn sẽ phải chỉ định các ràng buộc và hoàn cảnh.

mmap() không được đọc tuần tự.

điều gì khiến bạn nghĩ vậy? Nếu bạn thực sự truy cập bộ nhớ được ánh xạ tuần tự, hệ thống thường sẽ tìm nạp các trang theo thứ tự đó.

mmap() có thể tải xuống từ đĩa riêng của mình giống như đọc() không

chắc chắn, nhưng hệ điều hành xác định thời gian, kích thước buffer

Diện tích ánh xạ không phải là tuần tự - vì vậy không có DMA (?).

xem ở trên

mmap giúp với là không có thêm bộ đệm không gian người dùng phức tạp, "đọc" diễn ra có nơi kernel OS thấy phù hợp và trong khối có thể được tối ưu hóa. có thể là một lợi thế về tốc độ, nhưng trước hết, đây chỉ là một giao diện dễ sử dụng hơn.

Nếu bạn muốn biết về tốc độ cho một thiết lập cụ thể (phần cứng, hệ điều hành, mẫu sử dụng), bạn sẽ phải đo lường.

6
  1. mmap() có thể chia sẻ giữa quá trình.
  2. DMA sẽ được sử dụng bất cứ khi nào có thể. DMA không yêu cầu bộ nhớ tiếp giáp - nhiều thẻ cao cấp hỗ trợ DMA phân tán tán xạ.
  3. Khu vực bộ nhớ có thể được chia sẻ với bộ nhớ cache khối hạt nhân nếu có thể. Vì vậy, có ít sao chép.
  4. Bộ nhớ cho mmap được phân bổ bởi hạt nhân, nó luôn được căn chỉnh.
Các vấn đề liên quan