2013-12-09 23 views
14

Ai đó có thể giải thích nếu có bất kỳ lợi thế nào để viết một đoạn mã đa luồng chạy trên một bộ xử lý đơn lẻ với một lõi đơn không? Ví dụ: một phương thức xử lý các trang tài liệu sao cho các trang này loại trừ lẫn nhau với phần mã được đề cập ở trên.Lập trình đơn và đa luồng trên một bộ xử lý lõi đơn

Thoạt nhìn, dường như không có lợi thế vì không thể thực hiện đa luồng thực sự. Tức là, hệ điều hành sẽ phải bối cảnh chuyển đổi các chủ đề anyway. Tôi tự hỏi nếu chỉ cần mã hóa một cái gì đó trong một cách đơn luồng thực sự có thể hiệu quả hơn. Rõ ràng, có rất nhiều trường hợp viết mã đa luồng có ý nghĩa, nhưng một lần nữa, câu hỏi của tôi là liệu có thực sự là một lợi thế khi làm như vậy khi ứng dụng đang chạy trên một bộ vi xử lý lõi đơn hay không.

CHỈNH SỬA: lưu ý rằng tôi không nói "ứng dụng" mà là "đoạn mã" - hãy xem ví dụ của tôi ở trên. Rõ ràng có những lợi ích khi có ứng dụng đa luồng.

+3

Bạn có thể có chuỗi chờ tải tệp, để dữ liệu mạng đến ngay cả khi chỉ có thể sử dụng bộ xử lý tại một thời điểm. – zch

+2

Như @ zch đã chỉ ra, các ứng dụng IO-bound có thể tận dụng lợi thế của đa luồng ngay cả trên một lõi đơn, mặc dù bạn sẽ không bao giờ tăng tốc 2X cho chúng (nếu IO trở nên quá nhiều tốc độ tăng tốc của CPU) theo luật của Amidhal).Một lý do phổ biến hơn là thiết kế các ứng dụng đa luồng, ngay cả khi bạn chỉ có 1 lõi tại thời điểm này, là để dễ dàng chuyển đổi cho nhiều lõi khi chúng trở nên khả dụng. Sẽ tốt hơn rất nhiều khi thiết kế ứng dụng ngay một lần mà không cần mã hóa các giới hạn phần cứng hiện tại, sau đó viết lại nó khi có thêm tài nguyên phần cứng. – Michael

+1

@Michael Tôi đồng ý trong trường hợp bạn chắc chắn rằng bạn sẽ chuyển sang một hệ thống đa lõi, nhưng làm cho mã của bạn phức tạp hơn bây giờ vì một cái gì đó bạn có thể muốn làm với nó trong tương lai thường không xứng đáng. –

Trả lời

11

Vẫn có những lợi thế để đạt được, nhưng chúng có một chút tình huống.

  • Trong nhiều trường hợp, cung cấp nhiều thứ cho phép yêu cầu thêm tài nguyên hệ thống từ các quy trình khác. Điều này là khó để cân bằng, và mỗi chủ đề bạn giới thiệu thêm một chút chi phí, nhưng nó có thể là một lý do.

  • Nếu bạn đang xử lý nhiều tài nguyên có khả năng chặn - như IO hoặc tương tác GUI hoặc không, thì việc đa luồng có thể là quan trọng.

+1

Tôi không nghĩ rằng chúng ít có ý nghĩa hơn, đặc biệt cho mục thứ hai trong danh sách có dấu đầu dòng. Tuy nhiên, anwer đẹp. +1. – Renan

+0

@Renan điểm tốt. Đã chỉnh sửa. –

10

Có, đa luồng hữu ích trong một lõi đơn. Nếu một luồng trong một ứng dụng bị chặn chờ đợi một thứ gì đó (nói dữ liệu từ card mạng hoặc chờ đĩa ghi dữ liệu), CPU có thể chuyển sang một luồng khác để tiếp tục làm việc.

BeOS được viết với đa luồng phổ biến trong tâm trí, ngay cả trong một thời gian của bộ vi xử lý lõi đơn. Kết quả là một hệ điều hành rất nhạy, mặc dù một hệ điều hành khá khó khăn để lập trình.

+0

Bài đăng tuyệt vời! Chỉ cần tò mò, có thể một ứng dụng đa luồng tận dụng lợi thế của lõi khác trong os? (Ví dụ: NodeJS của JXcore) –

2

Trên một bộ xử lý lõi đơn, ứng dụng sử dụng không đồng bộ I/O sẽ hiệu quả hơn một chút so với sử dụng nhiều chủ đề chặn bởi vì nó tránh được phí chuyển đổi giữa các chủ đề.

Ngoài ra, I/O không đồng bộ quy mô tốt hơn so với chặn I/O trong chủ đề vì chi phí cho mỗi hoạt động I/O thêm tối thiểu so với phí tạo luồng mới.

Có nói rằng, bạn không nên thường sử dụng I/O không đồng bộ đơn luồng trong các ứng dụng mới vì hầu như tất cả các bộ vi xử lý mới đều là đa lõi. Thay vào đó bạn vẫn nên sử dụng I/O không đồng bộ, nhưng phân chia công việc giữa một tập hợp các luồng công nhân bằng cách sử dụng một thứ gì đó giống như một nhóm luồng. Tài liệu hệ thống của bạn sẽ cho bạn biết số lượng chủ đề công việc lý tưởng; thông thường nó bằng với số lõi xử lý có sẵn.

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