Câu trả lời ngắn gọn: Cho rằng bạn đang ghi vào đĩa Flash, tôi sẽ không mong đợi số lượng chủ đề tạo ra sự khác biệt nhiều theo cách này hay cách khác. Nhưng nếu nó đã tạo ra sự khác biệt, tôi mong đợi nhiều luồng sẽ nhanh hơn một luồng đơn, không chậm hơn.
Câu trả lời dài hơn:
Tôi đã viết một chương trình tương tự như bạn mô tả khoảng 6 năm trước - nó chạy trên một thẻ PowerPC Linux nhúng và đọc/viết nhiều tập tin âm thanh đồng thời đến/từ một SCSI cứng lái xe. Ban đầu tôi đã viết nó với một chủ đề duy nhất làm I/O, bởi vì tôi nghĩ rằng sẽ cung cấp thông lượng tốt nhất, nhưng hóa ra đó không phải là trường hợp.
Cụ thể, khi nhiều luồng đọc/ghi cùng một lúc, lớp SCSI nhận biết tất cả các yêu cầu đang chờ xử lý từ tất cả các luồng khác nhau và có thể sắp xếp lại các yêu cầu I/O như tìm kiếm đầu ổ đĩa đã được giảm thiểu. Trong kịch bản single-thread-IO, mặt khác, lớp SCSI chỉ biết về yêu cầu I/O xuất hiện "tiếp theo" và do đó không thể thực hiện tối ưu hóa đó. Điều đó có nghĩa là du lịch thêm cho đầu ổ đĩa trong nhiều trường hợp, và do đó thông lượng thấp hơn. Tất nhiên, ứng dụng của bạn không sử dụng SCSI hoặc ổ xoay với đầu cần tìm kiếm, do đó có thể không phải là vấn đề với bạn - nhưng có thể có các tối ưu khác mà lớp hệ thống/phần cứng có thể thực hiện nếu nó nhận thức được nhiều yêu cầu I/O đồng thời. Cách thực sự duy nhất để tìm ra là thử các mô hình khác nhau và đo lường kết quả.
Đề xuất của tôi sẽ là tách rời I/O đĩa khỏi mạng I/O bằng cách di chuyển I/O đĩa vào một nhóm luồng. Sau đó bạn có thể thay đổi kích thước tối đa của I/O-thread-pool của bạn từ 1 đến N, và cho mỗi kích thước đo hiệu suất của hệ thống. Điều đó sẽ cung cấp cho bạn ý tưởng rõ ràng về những gì hoạt động tốt nhất trên phần cứng cụ thể của bạn, mà không yêu cầu bạn viết lại mã nhiều lần.
Nguồn
2011-11-16 19:14:12
Thẻ nhớ Flash thực sự của bạn có dựa trên thẻ nhớ hoặc microHDD (Microdrive) không? – osgx
Đó là một Flash thực, nhưng do bộ điều khiển được sử dụng, nó được công nhận là thiết bị ATA của hệ điều hành. – Nick