2010-10-26 32 views
41

Tôi đã đọc trên mô hình chuỗi lập trình so với mô hình không đồng bộ từ bài viết thực sự tốt này. http://krondo.com/blog/?p=1209Chủ đề so với Async

Tuy nhiên, bài viết đề cập đến các điểm sau đây.

  1. Chương trình không đồng bộ sẽ đơn giản vượt trội hơn chương trình đồng bộ hóa bằng cách chuyển đổi giữa các tác vụ bất cứ khi nào có I/O.
  2. Chủ đề được quản lý bởi hệ điều hành.

Tôi nhớ đọc chủ đề được quản lý bởi hệ điều hành bằng cách di chuyển xung quanh TCB giữa hàng đợi sẵn sàng và hàng chờ đợi (trong số các hàng đợi khác). Trong trường hợp này, các chủ đề không lãng phí thời gian chờ đợi hoặc là phải không?

Trong điều kiện được đề cập ở trên, lợi ích của các chương trình không đồng bộ trên các chương trình luồng là gì?

+0

Tôi nghĩ bạn có nghĩa là đồng bộ so với không đồng bộ. – someguy

+4

Không, ý tôi là Threaded vs. Async. Tôi đã đề cập đến một điểm duy nhất bởi vì đó là điều tôi hiểu từ bài báo. –

Trả lời

55
  1. Rất khó để viết mã là luồng an toàn. Với mã asyncronous, bạn biết chính xác nơi mà mã sẽ chuyển từ một nhiệm vụ sang điều kiện tiếp theo và cuộc đua do đó sẽ khó hơn nhiều.
  2. Chủ đề tiêu thụ lượng dữ liệu hợp lý vì mỗi chuỗi cần phải có ngăn xếp riêng. Với mã async, tất cả các mã chia sẻ cùng một ngăn xếp và ngăn xếp được giữ nhỏ do liên tục tháo ngăn xếp giữa các tác vụ.
  3. Chủ đề là cấu trúc hệ điều hành và do đó có nhiều bộ nhớ hơn cho nền tảng hỗ trợ. Không có vấn đề như vậy với các nhiệm vụ không đồng bộ.
+9

Để xây dựng một chút: 1. Phần I/O của mã luồng tương đối dễ dàng nhưng quản lý trạng thái chia sẻ giữa các luồng (sử dụng khóa/hàng đợi/etc) mà không có điều kiện chủng tộc là điều làm cho nó phức tạp. Sử dụng một mô hình async có nghĩa là bạn có ít xảy ra cùng một lúc để các cuộc đua dễ dàng tránh được. 2/3. mỗi luồng sẽ tiêu thụ ít nhất một trang bộ nhớ của ngăn xếp (4KB hoặc 8KB thông thường), cộng với một số lượng bộ nhớ không xác định cho các cấu trúc dữ liệu khác liên quan đến trạng thái của luồng đó. –

4

Trước hết, lưu ý rằng rất nhiều chi tiết về cách các luồng được triển khai và lập lịch biểu rất cụ thể cho từng hệ điều hành. Nói chung, bạn không cần phải lo lắng về các chủ đề đang chờ nhau, vì hệ điều hành và phần cứng sẽ cố gắng sắp xếp chúng chạy một cách hiệu quả, cho dù không đồng bộ trên một hệ thống đơn hoặc song song trên nhiều bộ vi xử lý.

Khi một chủ đề đã kết thúc, hãy chờ một điều gì đó, nói I/O, nó có thể được coi là runnable. Các luồng được chạy sẽ được lên lịch để thực hiện tại một số điểm sớm. Cho dù điều này được thực hiện như một hàng đợi đơn giản hoặc một cái gì đó tinh vi hơn, một lần nữa, hệ điều hành và phần cứng cụ thể. Bạn có thể nghĩ về tập hợp các chủ đề bị chặn dưới dạng một tập hợp chứ không phải là một hàng đợi được sắp xếp nghiêm ngặt.

Lưu ý rằng trên một hệ thống xử lý đơn, các chương trình không đồng bộ như được định nghĩa ở đây tương đương với các chương trình luồng.

-1

Không đồng bộ I/O nghĩa là đã có một chuỗi trong trình điều khiển thực hiện công việc, vì vậy bạn đang nhân bản chức năng và phát sinh một số chi phí. Mặt khác, thường nó không được ghi lại chính xác cách trình điều khiển hoạt động như thế nào, và trong các kịch bản phức tạp, khi bạn muốn kiểm soát hành vi timeout/cancel/start/stop, đồng bộ với các chủ đề khác. Nó cũng đôi khi dễ dàng hơn để lý do trong điều khoản đồng bộ.

+3

Đó không phải là cách hoạt động của I/O không đồng bộ. Về cơ bản, I/O là hướng sự kiện (bạn khởi tạo I/O cho một thiết bị, sau đó, thiết bị hoàn thành nó và hy vọng sẽ cho bạn biết như vậy với một ngắt). Có một số loại I/O (như đĩa I/O), nơi trình điều khiển sử dụng một luồng hạt nhân cho một số lý do không rõ ràng; nhưng đối với mạng, nó hoạt động không đồng bộ tất cả các con đường xuống. – Glyph

0

thấy http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_scheduling

Tuy nhiên, việc sử dụng các hệ thống ngăn chặn các cuộc gọi trong chủ đề người dùng (như trái ngược với kernel đề) hoặc sợi có thể có vấn đề. Nếu một chuỗi người dùng hoặc một sợi thực hiện một cuộc gọi hệ thống chặn, các chuỗi và chuỗi người dùng khác trong quá trình sẽ không thể chạy cho đến khi hệ thống trả về cuộc gọi. Một ví dụ điển hình của vấn đề này là khi thực hiện I/O: hầu hết các chương trình được viết để thực hiện I/O đồng bộ.Khi một hoạt động I/O được bắt đầu, một cuộc gọi hệ thống được thực hiện, và không trở lại cho đến khi hoạt động I/O đã được hoàn thành. Trong giai đoạn can thiệp, toàn bộ quá trình bị "chặn" bởi hạt nhân và không thể chạy, mà khởi động các luồng và các luồng người dùng khác trong cùng một quá trình thực hiện.

Theo đó, toàn bộ quá trình của bạn có thể bị chặn và không có chuỗi nào được lên lịch khi một luồng bị chặn trong IO. Tôi nghĩ rằng đây là đặc trưng cho os và sẽ không phải lúc nào cũng được giữ.

6

Có hai cách để tạo chủ đề:

đồng bộ luồng - phụ huynh tạo ra một (hoặc nhiều) đề trẻ em và sau đó phải chờ đợi cho mỗi đứa trẻ để chấm dứt. Luồng đồng bộ thường được gọi là fork-join model.

luồng không đồng bộ - cha mẹ và con chạy đồng thời/độc lập với nhau. Các máy chủ đa luồng thường theo mô hình này.

tài nguyên - http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720

-1
  1. Giả sử bạn có 2 nhiệm vụ, mà không liên quan đến bất kỳ IO (trên máy tính đa xử). Trong trường hợp này, các chủ đề hoạt động tốt hơn Async. Bởi vì Async giống như một chương trình đơn luồng thực hiện các tác vụ của bạn theo thứ tự. Nhưng chủ đề có thể thực thi cả hai tác vụ cùng một lúc.

  2. Giả sử bạn có 2 tác vụ, liên quan đến IO (trên máy đa xử lý). Trong trường hợp này cả hai Async và Threads thực hiện nhiều hơn hoặc ít hơn (hiệu suất có thể khác nhau dựa trên số lõi, lập lịch, quá trình chuyên sâu bao nhiêu quá trình vv). Ngoài ra Async mất ít tài nguyên hơn, chi phí thấp và ít phức tạp hơn để lập trình trên chương trình đa luồng.

Cách thức hoạt động? Chủ đề 1 thực hiện Nhiệm vụ 1, vì nó đang chờ IO, nó được chuyển đến IO Hàng chờ. Tương tự, Chủ đề 2 thực thi Nhiệm vụ 2, vì nó cũng liên quan đến IO, nó được chuyển đến Hàng chờ đợi IO. Ngay sau khi yêu cầu IO của nó được giải quyết , nó được chuyển đến hàng đợi sẵn sàng để trình lên lịch có thể lên lịch cho việc thực hiện .

Không đồng bộ thực hiện Tác vụ 1 và không đợi IO hoàn tất tiếp tục với Nhiệm vụ 2, sau đó nó đợi IO của cả tác vụ hoàn thành. Nó hoàn thành các tác vụ theo thứ tự hoàn thành IO.

Đồng bộ hóa tốt nhất cho các tác vụ có liên quan đến cuộc gọi dịch vụ Web, truy vấn cơ sở dữ liệu cuộc gọi, v.v. Chủ đề cho các tác vụ chuyên sâu quy trình.

Đoạn video dưới đây giải thích về Async vs Threaded model và cũng có khi sử dụng vv, https://www.youtube.com/watch?v=kdzL3r-yJZY

Hy vọng điều này là hữu ích.

+0

https://www.youtube.com/watch?v=kdzL3r-yJZY – Lakshmipathi

+0

Liên kết đến giải pháp tiềm năng luôn được chào đón, nhưng vui lòng [thêm ngữ cảnh xung quanh liên kết] (// meta.stackoverflow.com/a/8259) vì vậy người dùng đồng nghiệp của bạn sẽ có một số ý tưởng về nó là gì và tại sao nó ở đó. ** Luôn trích dẫn phần có liên quan nhất của một liên kết quan trọng, trong trường hợp trang web mục tiêu không thể truy cập hoặc vĩnh viễn ngoại tuyến. ** Hãy xem xét rằng _barely nhiều hơn một liên kết đến một trang web bên ngoài là một lý do có thể là [Tại sao và một số câu trả lời đã bị xóa như thế nào?] (// stackoverflow.com/help/deleted-answers). – Machavity

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/17067843) – gobrewers14

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