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 .
Điều gì cho bạn biết nó nhanh hơn? – Mehrdad
@Mehrdad Tôi thấy một số nhận xét trên internet rằng mmap nhanh hơn –
http://stackoverflow.com/questions/258091/when-should-i-use-mmap-for-file-access –