Sự khác biệt giữa một quá trình và một chủ đề là gì?


1641

Sự khác biệt kỹ thuật giữa một quá trình và một chủ đề là gì?

Tôi có cảm giác một từ như 'quá trình' bị lạm dụng và cũng có các luồng phần cứng và phần mềm. Làm thế nào về các quá trình trọng lượng nhẹ trong các ngôn ngữ như Erlang ? Có một lý do dứt khoát để sử dụng một thuật ngữ khác?



4
Nó có thể đảm bảo rằng mỗi hệ điều hành có một ý tưởng khác nhau về "quy trình" hoặc "quy trình" là gì. Một số HĐH chính thống 'không có khái niệm' luồng ', cũng có một số HĐH nhúng' chỉ có 'luồng'.
Neil

Câu trả lời:


1459

Cả hai quá trình và chủ đề là các chuỗi thực hiện độc lập. Sự khác biệt điển hình là các luồng (của cùng một tiến trình) chạy trong một không gian bộ nhớ dùng chung, trong khi các tiến trình chạy trong các không gian bộ nhớ riêng biệt.

Tôi không chắc chắn về chủ đề "phần cứng" so với "phần mềm" mà bạn có thể đề cập đến. Các luồng là một tính năng môi trường hoạt động, chứ không phải là một tính năng CPU (mặc dù CPU thường có các hoạt động làm cho các luồng hiệu quả).

Erlang sử dụng thuật ngữ "quy trình" vì nó không phơi bày mô hình đa chương trình bộ nhớ dùng chung. Gọi họ là "chủ đề" sẽ ngụ ý rằng họ có bộ nhớ chia sẻ.


56
Các luồng phần cứng có lẽ đang đề cập đến nhiều bối cảnh luồng trong một lõi (ví dụ HyperThreading, SMT, Sun's Niagara / Rock). Điều này có nghĩa là các tệp thanh ghi trùng lặp, các bit bổ sung được thực hiện cùng với lệnh thông qua các đường ống và logic chuyển tiếp / chuyển tiếp phức tạp hơn, trong số những thứ khác.
Matt J

4
@greg, một nghi ngờ tôi có trong chủ đề. hãy để tôi xem xét tôi có một quá trình A, có một không gian trong RAM. Nếu quá trình A tạo ra một luồng, luồng cũng cần một khoảng trống để thực thi. Vì vậy, nó sẽ tăng kích thước của không gian được tạo cho quy trình A hay không gian cho luồng được tạo ở nơi khác? Vậy quá trình không gian ảo đó là gì? Xin hãy sửa tôi nếu câu hỏi của tôi sai. Cảm ơn
duslabo

9
@JeshwanthKumarNK: Tạo một luồng mới phân bổ ít nhất đủ bộ nhớ cho một ngăn xếp mới. Bộ nhớ này được HĐH cấp phát trong quy trình A.
Greg Hewgill

24
Câu trả lời này có vẻ sai. Nếu cả hai tiến trình và luồng là các chuỗi thực thi độc lập, thì một tiến trình chứa hai luồng sẽ phải có ba chuỗi thực hiện và điều đó không thể đúng. Chỉ một luồng là một chuỗi thực thi - một tiến trình là một thùng chứa có thể chứa một hoặc nhiều chuỗi thực hiện.
David Schwartz

8
"Chủ đề phần cứng" là các luồng được cung cấp tài nguyên phần cứng riêng lẻ (lõi riêng, bộ xử lý hoặc siêu phân luồng). "Chủ đề phần mềm" là các chủ đề phải cạnh tranh cho cùng một sức mạnh xử lý.
jpmc26

811

Quy trình
Mỗi quy trình cung cấp các tài nguyên cần thiết để thực hiện một chương trình. Một quy trình có không gian địa chỉ ảo, mã thực thi, xử lý mở cho các đối tượng hệ thống, bối cảnh bảo mật, mã định danh quy trình duy nhất, biến môi trường, lớp ưu tiên, kích thước tập làm việc tối thiểu và tối đa và ít nhất một luồng thực thi. Mỗi quá trình được bắt đầu với một luồng duy nhất, thường được gọi là luồng chính, nhưng có thể tạo các luồng bổ sung từ bất kỳ luồng nào.

Chủ đề
Một luồng là một thực thể trong một quy trình có thể được lên lịch để thực hiện. Tất cả các luồng của một quá trình chia sẻ không gian địa chỉ ảo và tài nguyên hệ thống. Ngoài ra, mỗi luồng duy trì các trình xử lý ngoại lệ, ưu tiên lập lịch, lưu trữ cục bộ của luồng, một mã định danh luồng duy nhất và một tập hợp các cấu trúc mà hệ thống sẽ sử dụng để lưu bối cảnh luồng cho đến khi được lên lịch. Bối cảnh luồng bao gồm tập hợp các thanh ghi máy, ngăn xếp kernel, khối môi trường luồng và ngăn xếp người dùng trong không gian địa chỉ của tiến trình của luồng. Chủ đề cũng có thể có bối cảnh bảo mật riêng của họ, có thể được sử dụng để mạo danh khách hàng.


Thông tin này được tìm thấy trên Microsoft Docs tại đây: Giới thiệu về quy trình và chủ đề

Microsoft Windows hỗ trợ đa nhiệm được ưu tiên, tạo ra hiệu ứng thực thi đồng thời nhiều luồng từ nhiều tiến trình. Trên máy tính đa bộ xử lý, hệ thống có thể thực thi đồng thời nhiều luồng như có bộ xử lý trên máy tính.


18
Đối với những người muốn biết lý do tại sao bạn không thể định dạng đĩa mềm cùng một lúc: stackoverflow.com/questions/20708707/ mẹo
Computernerd

7
@LuisVasconcellos - Nếu không có chủ đề, thì quá trình sẽ không làm gì cả. Quá trình sẽ chỉ là một số mã và trạng thái chương trình được tải vào bộ nhớ. Nó không được sử dụng nhiều. Nó giống như có một con đường không có phương tiện đi dọc theo nó.
Scott Langham

4
@LuisVasconcellos - Tốt. Vâng, bạn có thể nghĩ về một luồng như một thứ gì đó di chuyển qua mã của quy trình và thực hiện các hướng dẫn trong mã đó.
Scott Langham

9
Câu trả lời này tốt hơn nhiều so với câu trả lời được chấp nhận bởi vì nó nói về lý tưởng của các quy trình và chủ đề: Chúng nên là những thứ riêng biệt với những mối quan tâm riêng biệt. Thực tế là, hầu hết các hệ điều hành đều có lịch sử đi xa hơn so với việc phát minh ra các luồng, và do đó, trong hầu hết các hệ điều hành, những lo ngại đó vẫn có phần vướng mắc, ngay cả khi chúng đang dần cải thiện theo thời gian.
Solomon chậm

4
@BKSpurgeon Với mỗi lời giải thích, bạn phải đưa người đọc của mình từ một cấp độ hiểu biết sang cấp độ tiếp theo. Thật không may, tôi không thể điều chỉnh câu trả lời cho mọi người đọc và do đó phải thừa nhận một mức độ kiến ​​thức. Đối với những người không biết, họ có thể thực hiện tìm kiếm thêm các thuật ngữ tôi sử dụng mà họ không hiểu, không thể, cho đến khi họ đạt đến điểm cơ bản mà họ hiểu. Tôi sẽ đề nghị bạn đưa ra câu trả lời của riêng bạn, nhưng tôi rất vui khi thấy bạn đã có.
Scott Langham

301

Quá trình:

  • Một thể hiện thực hiện của một chương trình được gọi là một quá trình.
  • Một số hệ điều hành sử dụng thuật ngữ 'nhiệm vụ' để chỉ một chương trình đang được thực thi.
  • Một tiến trình luôn được lưu trữ trong bộ nhớ chính cũng được gọi là bộ nhớ chính hoặc bộ nhớ truy cập ngẫu nhiên.
  • Do đó, một quá trình được gọi là một thực thể hoạt động. Nó biến mất nếu máy được khởi động lại.
  • Một số quy trình có thể được liên kết với cùng một chương trình.
  • Trên hệ thống đa bộ xử lý, nhiều quy trình có thể được thực thi song song.
  • Trên một hệ thống xử lý đơn, mặc dù không đạt được sự song song thực sự, một thuật toán lập lịch quy trình được áp dụng và bộ xử lý được lên lịch để thực hiện từng quy trình một lúc tạo ra ảo giác về sự tương tranh.
  • Ví dụ: Thi hành nhiều phiên bản của chương trình 'Máy tính'. Mỗi trường hợp được gọi là một quá trình.

Chủ đề:

  • Một chủ đề là một tập hợp con của quá trình.
  • Nó được gọi là "một quy trình nhẹ", vì nó tương tự như một quy trình thực nhưng thực thi trong bối cảnh của một quy trình và chia sẻ cùng một tài nguyên được phân bổ cho quy trình bởi hạt nhân.
  • Thông thường, một quy trình chỉ có một luồng điều khiển - một bộ hướng dẫn máy thực thi tại một thời điểm.
  • Một quá trình cũng có thể được tạo thành từ nhiều luồng thực thi đồng thời thực hiện các lệnh.
  • Nhiều luồng điều khiển có thể khai thác tính song song thực sự có thể có trên các hệ thống đa bộ xử lý.
  • Trên hệ thống uni-bộ xử lý, thuật toán lập lịch luồng được áp dụng và bộ xử lý được lên lịch để chạy từng luồng một.
  • Tất cả các luồng chạy trong một tiến trình chia sẻ cùng một không gian địa chỉ, mô tả tệp, ngăn xếp và các thuộc tính liên quan đến quá trình khác.
  • Vì các luồng của một tiến trình chia sẻ cùng một bộ nhớ, nên đồng bộ hóa quyền truy cập vào dữ liệu được chia sẻ trong tiến trình đạt được tầm quan trọng chưa từng có.

Tôi đã mượn thông tin trên từ Quest Quest! blog .


90
Kumar: Từ kiến ​​thức của tôi, các chủ đề không chia sẻ cùng một ngăn xếp. Nếu không, sẽ không thể chạy mã khác nhau trên mỗi mã.
Mihai Neacsu

27
Yup tôi nghĩ @MihaiNeacsu là đúng. Chủ đề chia sẻ "mã, dữ liệu và tệp" và có "thanh ghi và ngăn xếp" riêng. Trượt từ khóa học hệ điều hành của tôi: i.imgur.com/Iq1Qprv.png
Shehaaz

Điều này khá hữu ích, vì nó mở rộng về các chủ đề và quy trình là gì và chúng liên quan với nhau như thế nào. Tôi khuyên bạn nên thêm một ví dụ về Chủ đề, đặc biệt là khi có một Quy trình. Đồ tốt!
Smithers

1
Liên kết Kquest.co.cc đã chết.
Elijah Lynn

1
@ Rndp13 Vấn đề chỉ là việc sử dụng từ "stack" chứ không phải là "stack". Chủ đề chia sẻ ngăn xếp vì ngăn xếp chỉ là một phần của bộ nhớ ảo và chủ đề chia sẻ tất cả bộ nhớ ảo. Các luồng thậm chí có thể bỏ các con trỏ ngăn xếp của chúng và việc thực thi có thể được nối lại bởi một luồng khác mà không có vấn đề gì. Một luồng xử lý thực hiện một ngăn xếp tại một thời điểm cụ thể không có nghĩa là các luồng không chia sẻ ngăn xếp giống như thực tế là một luồng đang hoạt động trên một bộ mô tả tệp tại một thời điểm không có nghĩa là các luồng không chia sẻ mô tả tệp .
David Schwartz

129

Đầu tiên, chúng ta hãy nhìn vào khía cạnh lý thuyết. Bạn cần hiểu một quy trình là gì về mặt khái niệm để hiểu sự khác biệt giữa một quy trình và một chủ đề và những gì được chia sẻ giữa chúng.

Chúng tôi có phần sau đây từ phần 2.2.2 Mô hình luồng cổ điển trong các hệ điều hành hiện đại 3e của Tanenbaum:

Mô hình quy trình dựa trên hai khái niệm độc lập: nhóm tài nguyên và thực thi. Đôi khi nó rất hữu ích để tách chúng ra; đây là nơi các chủ đề đến ....

Ông tiếp tục:

Một cách để xem xét một quy trình là đó là một cách để nhóm các tài nguyên liên quan lại với nhau. Một quy trình có một không gian địa chỉ chứa văn bản và dữ liệu chương trình, cũng như các tài nguyên khác. Các tài nguyên này có thể bao gồm các tệp đang mở, các quy trình con, báo động đang chờ xử lý, xử lý tín hiệu, thông tin kế toán, v.v. Bằng cách đặt chúng lại với nhau dưới dạng một quy trình, chúng có thể được quản lý dễ dàng hơn. Khái niệm khác mà một quá trình có là một luồng thực thi, thường được rút ngắn thành chỉ luồng. Các chủ đề có một bộ đếm chương trình theo dõi hướng dẫn nào để thực hiện tiếp theo. Nó có các thanh ghi, giữ các biến làm việc hiện tại của nó. Nó có một ngăn xếp, chứa lịch sử thực hiện, với một khung cho mỗi thủ tục được gọi nhưng chưa được trả về. Mặc dù một luồng phải thực thi trong một số quy trình, luồng và quá trình của nó là các khái niệm khác nhau và có thể được xử lý riêng. Các quy trình được sử dụng để nhóm các tài nguyên với nhau; luồng là các thực thể được lên lịch để thực hiện trên CPU.

Hơn nữa, ông cung cấp bảng sau:

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

Hãy giải quyết vấn đề đa luồng phần cứng . Về mặt kinh điển, CPU sẽ hỗ trợ một luồng thực thi duy nhất, duy trì trạng thái của luồng thông qua một bộ đếm chương trình và bộ thanh ghi. Nhưng điều gì xảy ra nếu bỏ lỡ bộ nhớ cache? Phải mất một thời gian dài để lấy dữ liệu từ bộ nhớ chính và trong khi điều đó xảy ra thì CPU chỉ ngồi yên ở đó. Vì vậy, ai đó đã có ý tưởng về cơ bản có hai bộ trạng thái luồng (thanh ghi PC +) để một luồng khác (có thể trong cùng một quy trình, có thể trong một quy trình khác) có thể hoàn thành công việc trong khi luồng khác đang chờ trên bộ nhớ chính. Có nhiều tên và cách triển khai của khái niệm này, chẳng hạn như HyperThreading và Đồng thời đa luồng (viết tắt là SMT).

Bây giờ hãy nhìn vào phía phần mềm. Về cơ bản có ba cách mà các luồng có thể được thực hiện ở phía phần mềm.

  1. Chủ đề không gian người dùng
  2. Chủ đề hạt nhân
  3. Một sự kết hợp của cả hai

Tất cả những gì bạn cần để thực hiện các luồng là khả năng lưu trạng thái CPU và duy trì nhiều ngăn xếp, trong nhiều trường hợp có thể được thực hiện trong không gian người dùng. Ưu điểm của các luồng không gian người dùng là chuyển đổi luồng siêu nhanh vì bạn không phải mắc vào kernel và khả năng lên lịch cho các luồng theo cách bạn muốn. Hạn chế lớn nhất là không thể chặn I / O (sẽ chặn toàn bộ quá trình và tất cả các luồng của người dùng), đây là một trong những lý do lớn khiến chúng tôi sử dụng các luồng ở vị trí đầu tiên. Chặn I / O bằng cách sử dụng các chủ đề đơn giản hóa rất nhiều thiết kế chương trình trong nhiều trường hợp.

Các luồng nhân có lợi thế là có thể sử dụng chặn I / O, ngoài việc để lại tất cả các vấn đề lập lịch cho HĐH. Nhưng mỗi chuyển đổi luồng yêu cầu bẫy vào kernel có khả năng tương đối chậm. Tuy nhiên, nếu bạn chuyển đổi chủ đề vì I / O bị chặn thì đây thực sự không phải là vấn đề vì hoạt động I / O có thể đã nhốt bạn vào kernel.

Một cách tiếp cận khác là kết hợp cả hai, với nhiều luồng nhân, mỗi luồng có nhiều luồng người dùng.

Vì vậy, quay trở lại câu hỏi về thuật ngữ của bạn, bạn có thể thấy rằng một quy trình và một chuỗi thực thi là hai khái niệm khác nhau và việc bạn chọn sử dụng thuật ngữ nào phụ thuộc vào những gì bạn đang nói. Về thuật ngữ "quy trình trọng lượng nhẹ", cá nhân tôi không thấy điểm nào trong đó vì nó không thực sự truyền đạt những gì đang diễn ra cũng như thuật ngữ "chủ đề thực hiện".


4
Câu trả lời nổi bật! Nó phá vỡ rất nhiều biệt ngữ và giả định. Điều đó làm cho dòng này nổi bật là khó xử, mặc dù: "Vì vậy, ai đó có ý tưởng về cơ bản có hai bộ trạng thái luồng (thanh ghi PC +)" - "PC" được đề cập ở đây là gì?
Smithers

2
@Smithers PC là bộ đếm chương trình, hoặc con trỏ lệnh, cung cấp địa chỉ của lệnh tiếp theo sẽ được thực thi: en.wikipedia.org/wiki/Program_count
Robert S. Barnes

Tôi thấy những gì bạn đã làm ở đó. stackoverflow.com/questions/1762418/ process
vs-read / từ

Tại sao "Ngăn xếp" không được liệt kê trong "Mỗi mục quy trình"? Cả hai quá trình và chủ đề có ngăn xếp riêng của họ.
stackoverflowuser2010

1
@ stackoverflowuser2010 không chỉ có chủ đề có ngăn xếp. Cái mà bạn gọi là một tiến trình là một tiến trình với một luồng thực thi duy nhất và nó là luồng có ngăn xếp không phải là tiến trình.
Robert S. Barnes

101

Để giải thích thêm về lập trình đồng thời

  1. Một tiến trình có một môi trường thực thi khép kín. Một quy trình thường có một bộ tài nguyên thời gian chạy cơ bản hoàn chỉnh; đặc biệt, mỗi quá trình có không gian bộ nhớ riêng.

  2. Chủ đề tồn tại trong một quy trình - mỗi quy trình có ít nhất một. Chủ đề chia sẻ tài nguyên của quá trình, bao gồm bộ nhớ và các tệp đang mở. Điều này làm cho giao tiếp hiệu quả, nhưng có khả năng có vấn đề.

Giữ người bình thường trong tâm trí,

Trên máy tính của bạn, mở Microsoft Word và trình duyệt web. Chúng tôi gọi hai quá trình này .

Trong từ Microsoft, bạn nhập một số thứ và nó sẽ tự động được lưu. Bây giờ, bạn sẽ quan sát việc chỉnh sửa và lưu xảy ra song song - chỉnh sửa trên một luồng và lưu trên luồng khác.


14
Câu trả lời nổi bật, nó giữ cho mọi thứ đơn giản và cung cấp một ví dụ mà mọi người dùng thậm chí xem câu hỏi có thể liên quan đến.
Smithers

7
chỉnh sửa / lưu là một ví dụ hay cho nhiều luồng trong một tiến trình!

53

Một ứng dụng bao gồm một hoặc nhiều quá trình. Một quy trình, theo cách đơn giản nhất, là một chương trình thực thi. Một hoặc nhiều luồng chạy trong bối cảnh của quá trình. Một luồng là đơn vị cơ bản mà hệ điều hành phân bổ thời gian xử lý. Một luồng có thể thực thi bất kỳ phần nào của mã quy trình, bao gồm các phần hiện đang được thực thi bởi một luồng khác. Sợi là một đơn vị thực hiện phải được ứng dụng lên lịch thủ công. Sợi chạy trong bối cảnh của các chủ đề lên lịch chúng.

Bị đánh cắp từ đây .


Trên các hệ điều hành khác, chẳng hạn như Linux, không có sự khác biệt thực tế giữa hai hệ điều hành ở cấp hệ điều hành, ngoại trừ các luồng thường chia sẻ cùng một không gian bộ nhớ như tiến trình cha. (Do đó downvote của tôi)
Arafangion

1
Câu trả lời tốt (đặc biệt là với tín dụng), vì nó cho thấy mối quan hệ giữa hai và phân biệt thành một "câu hỏi tiếp theo" dễ mong đợi (về sợi).
Smithers

29

Một quy trình là một tập hợp mã, bộ nhớ, dữ liệu và các tài nguyên khác. Một luồng là một chuỗi mã được thực thi trong phạm vi của quy trình. Bạn có thể (thường) có nhiều luồng thực thi đồng thời trong cùng một quy trình.


27

Ví dụ trong thế giới thực cho Quy trình và Chủ đề Điều này sẽ cung cấp cho bạn ý tưởng cơ bản về chủ đề và quy trình nhập mô tả hình ảnh ở đây

Tôi đã mượn thông tin trên từ Câu trả lời của Scott Langham - cảm ơn


25

Quá trình:

  1. Quá trình là một quá trình trọng lượng nặng.
  2. Quá trình là một chương trình riêng biệt có bộ nhớ, dữ liệu, tài nguyên riêng biệt.
  3. Quá trình được tạo bằng phương thức fork ().
  4. Chuyển đổi bối cảnh giữa quá trình là tốn thời gian.

Ví dụ:
Nói, mở bất kỳ trình duyệt nào (mozilla, Chrome, IE). Tại thời điểm này, quá trình mới sẽ bắt đầu thực hiện.

Chủ đề:

  1. Chủ đề là các quá trình trọng lượng nhẹ. Các chi tiết được gói trong quy trình.
  2. Chủ đề có một bộ nhớ chia sẻ, dữ liệu, tài nguyên, tập tin, vv
  3. Chủ đề được tạo bằng phương thức clone ().
  4. Chuyển đổi ngữ cảnh giữa các luồng không tốn nhiều thời gian như Quá trình.

Ví dụ:
Mở nhiều tab trong trình duyệt.


Trong thế giới Windows, bạn đúng, nhưng trong Linux, mọi 'luồng' là một quá trình và đều 'nặng' (hoặc nhẹ).
Neil

22
  • Mỗi quá trình là một luồng (luồng chính).
  • Nhưng mỗi chủ đề không phải là một quá trình. Nó là một phần (thực thể) của một quá trình.

3
Bạn có thể giải thích thêm một chút và / hoặc bao gồm một số bằng chứng?
Zim84

15

Cả luồng và tiến trình đều là các đơn vị nguyên tử của phân bổ tài nguyên HĐH (tức là có một mô hình tương tranh mô tả cách phân chia thời gian của CPU giữa chúng và mô hình sở hữu các tài nguyên HĐH khác). Có một sự khác biệt trong:

  • Các tài nguyên được chia sẻ (các luồng đang chia sẻ bộ nhớ theo định nghĩa, chúng không sở hữu bất cứ thứ gì ngoại trừ các biến stack và local; các tiến trình cũng có thể chia sẻ bộ nhớ, nhưng có một cơ chế riêng cho điều đó, được duy trì bởi HĐH)
  • Không gian phân bổ (không gian kernel cho các tiến trình so với không gian người dùng cho các luồng)

Greg Hewgill ở trên đã đúng về ý nghĩa của Erlang của từ "quy trình" và ở đây có một cuộc thảo luận về lý do tại sao Erlang có thể thực hiện các quy trình nhẹ.


13

Cả hai quá trình và chủ đề là các chuỗi thực hiện độc lập. Sự khác biệt điển hình là các luồng (của cùng một tiến trình) chạy trong một không gian bộ nhớ dùng chung, trong khi các tiến trình chạy trong các không gian bộ nhớ riêng biệt.

Quá trình

Là một chương trình trong thực thi. nó có phần văn bản tức là mã chương trình, hoạt động hiện tại được biểu thị bằng giá trị của bộ đếm chương trình & nội dung của thanh ghi bộ xử lý. Nó cũng bao gồm ngăn xếp quá trình chứa dữ liệu tạm thời (như tham số hàm, trả về địa chỉ và biến cục bộ) và phần dữ liệu chứa biến toàn cục. Một quy trình cũng có thể bao gồm một đống, đó là bộ nhớ được phân bổ động trong thời gian chạy quy trình.

Chủ đề

Một luồng là một đơn vị cơ bản của việc sử dụng CPU; nó bao gồm ID luồng, bộ đếm chương trình, bộ đăng ký và ngăn xếp. nó đã chia sẻ với các luồng khác thuộc cùng quy trình phần mã, phần dữ liệu và các tài nguyên hệ điều hành khác như các tệp và tín hiệu mở.

- Lấy từ hệ điều hành của Galvin


13

http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html

Linus Torvalds (torvalds@cs.helsinki.fi)

Thứ ba, ngày 6 tháng 8 năm 1996 12:47:31 +0300 (EET DST)

Tin nhắn được sắp xếp theo: [ngày] [chủ đề] [chủ đề] [tác giả]

Tin nhắn tiếp theo: Bernd P. Ziller: "Re: Rất tiếc trong get_hash_table"

Tin nhắn trước: Linus Torvalds: "Re: I / O yêu cầu đặt hàng"

Vào Thứ Hai, ngày 5 tháng 8 năm 1996, Peter P. Eiserloh đã viết:

Chúng ta cần phải giữ một khái niệm rõ ràng về chủ đề. Quá nhiều người dường như nhầm lẫn một chủ đề với một quá trình. Các cuộc thảo luận sau đây không phản ánh trạng thái hiện tại của linux, mà là một nỗ lực để duy trì một cuộc thảo luận cấp cao.

KHÔNG!

KHÔNG có lý do để nghĩ rằng "chủ đề" và "quy trình" là các thực thể riêng biệt. Đó là cách nó được thực hiện theo truyền thống, nhưng cá nhân tôi nghĩ rằng đó là một sai lầm lớn khi nghĩ theo cách đó. Lý do duy nhất để nghĩ theo cách đó là hành lý lịch sử.

Cả luồng và tiến trình thực sự chỉ là một thứ: "bối cảnh thực thi". Cố gắng phân biệt giả tạo các trường hợp khác nhau chỉ là tự giới hạn.

Một "bối cảnh thực hiện", theo đây gọi là COE, chỉ là tập hợp của tất cả trạng thái của COE đó. Trạng thái đó bao gồm những thứ như trạng thái CPU (thanh ghi, v.v.), trạng thái MMU (ánh xạ trang), trạng thái cấp phép (uid, gid) và nhiều "trạng thái giao tiếp" khác nhau (mở tệp, xử lý tín hiệu, v.v.). Theo truyền thống, sự khác biệt giữa "luồng" và "tiến trình" chủ yếu là các luồng có trạng thái CPU (+ có thể là một số trạng thái tối thiểu khác), trong khi tất cả các bối cảnh khác đến từ quá trình. Tuy nhiên, đó chỉ là một cách để phân chia tổng trạng thái của COE, và không có gì nói rằng đó là cách đúng đắn để làm điều đó. Giới hạn bản thân với loại hình ảnh đó chỉ đơn giản là ngu ngốc.

Cách Linux nghĩ về điều này (và cách tôi muốn mọi thứ hoạt động) không có thứ gọi là "quy trình" hay "luồng". Chỉ có toàn bộ COE (được gọi là "nhiệm vụ" của Linux). Các COE khác nhau có thể chia sẻ các phần trong bối cảnh của họ với nhau và một tập hợp con của chia sẻ đó là cài đặt "luồng" / "quy trình" truyền thống, nhưng đó thực sự nên được xem là CHỈ một tập hợp con (đó là một tập hợp con quan trọng, nhưng tầm quan trọng đó đến không phải từ thiết kế, mà từ các tiêu chuẩn: chúng tôi thực sự muốn chạy các chương trình xử lý tuân thủ tiêu chuẩn trên Linux).

Tóm lại: KHÔNG thiết kế xung quanh cách suy nghĩ theo chủ đề / quy trình. Hạt nhân phải được thiết kế theo cách suy nghĩ COE, và sau đó thư viện pthreads có thể xuất giao diện pthreads giới hạn cho người dùng muốn sử dụng cách nhìn đó của COE.

Cũng như một ví dụ về những gì có thể xảy ra khi bạn nghĩ COE trái ngược với luồng / quy trình:

  • Bạn có thể thực hiện một chương trình "cd" bên ngoài, một thứ mà theo truyền thống là không thể trong UNIX và / hoặc process / thread (ví dụ ngớ ngẩn, nhưng ý tưởng là bạn có thể có các loại "mô-đun" không giới hạn trong UNIX truyền thống / thiết lập chủ đề). Làm một:

bản sao (CLONE_VM | CLONE_FS);

con: execve ("bên ngoài-cd");

/ * "execve ()" sẽ tách liên kết VM, vì vậy lý do duy nhất chúng tôi sử dụng CLONE_VM là để thực hiện hành động nhân bản nhanh hơn * /

  • Bạn có thể thực hiện "vfork ()" một cách tự nhiên (nó hỗ trợ nhân tối thiểu, nhưng hỗ trợ đó phù hợp với cách suy nghĩ CUA hoàn hảo):

bản sao (CLONE_VM);

con: tiếp tục chạy, cuối cùng thực hiện ()

mẹ: chờ thi hành án

  • bạn có thể thực hiện "IO deamons" bên ngoài:

bản sao (CLone_FILES);

con: mở mô tả tập tin vv

mẹ: sử dụng fd là đứa trẻ đã mở và vv.

Tất cả các công việc trên bởi vì bạn không bị ràng buộc với lối suy nghĩ theo chủ đề / quy trình. Hãy nghĩ về một máy chủ web chẳng hạn, trong đó các tập lệnh CGI được thực hiện dưới dạng "các luồng thực thi". Bạn không thể làm điều đó với các luồng truyền thống, bởi vì các luồng truyền thống luôn phải chia sẻ toàn bộ không gian địa chỉ, do đó bạn phải liên kết mọi thứ bạn muốn làm trong chính máy chủ web (một "luồng" không thể chạy thực thi khác).

Suy nghĩ về điều này như một "bối cảnh thực hiện" vấn đề thay vào đó, nhiệm vụ của bạn bây giờ có thể chọn để thực hiện các chương trình bên ngoài (= tách không gian địa chỉ từ công ty mẹ) vv nếu họ muốn, hoặc họ có thể ví dụ như tất cả mọi thứ chia sẻ với phụ huynh trừ cho bộ mô tả tệp (để các "luồng" phụ có thể mở nhiều tệp mà phụ huynh không cần phải lo lắng về chúng: chúng tự động đóng khi thoát "luồng" phụ và nó không sử dụng hết fd trong cha mẹ) .

Ví dụ, nghĩ về một "inetd" luồng. Bạn muốn fork + exec trên đầu thấp, vì vậy với Linux, bạn có thể thay vì sử dụng "fork ()", bạn viết một inetd đa luồng trong đó mỗi luồng được tạo chỉ bằng CLONE_VM (chia sẻ không gian địa chỉ, nhưng không chia sẻ tệp mô tả vv). Sau đó, đứa trẻ có thể thực thi nếu đó là một dịch vụ bên ngoài (ví dụ như rlogind), hoặc có thể đó là một trong những dịch vụ inetd nội bộ (echo, timeofday) trong trường hợp nó chỉ thực hiện và thoát ra.

Bạn không thể làm điều đó với "luồng" / "quá trình".

Linus


12

Đang cố gắng trả lời nó từ Chế độ xem hệ điều hành của Linux Kernel

Một chương trình trở thành một quá trình khi được đưa vào bộ nhớ. Một quy trình có không gian địa chỉ riêng có nghĩa là có nhiều phân đoạn khác nhau trong bộ nhớ, chẳng hạn như .textlưu trữ mã được biên dịch, .bssđể lưu trữ các biến tĩnh hoặc toàn cục chưa được khởi tạo, v.v.
Mỗi quy trình sẽ có bộ đếm chương trình riêng và ngăn xếp không gian người dùng .

Bên trong kernel, mỗi tiến trình sẽ có ngăn xếp kernel riêng (được tách ra khỏi ngăn xếp không gian người dùng cho các vấn đề bảo mật) và một cấu trúc có tên task_structthường được trừu tượng hóa là khối điều khiển quy trình, lưu trữ tất cả thông tin liên quan đến quá trình như mức độ ưu tiên, trạng thái của nó , (và rất nhiều chunk khác).
Một quá trình có thể có nhiều luồng thực hiện.

Đến với các luồng, chúng nằm trong một tiến trình và chia sẻ không gian địa chỉ của tiến trình cha cùng với các tài nguyên khác có thể được truyền trong quá trình tạo luồng như tài nguyên hệ thống tệp, chia sẻ tín hiệu đang chờ xử lý, chia sẻ dữ liệu (biến và hướng dẫn) do đó làm cho luồng nhẹ và do đó cho phép chuyển đổi ngữ cảnh nhanh hơn.

Bên trong kernel, mỗi luồng có ngăn xếp kernel riêng cùng với task_structcấu trúc xác định luồng. Do đó, kernel xem các luồng của cùng một tiến trình như các thực thể khác nhau và có thể lập lịch biểu trong chính chúng. Các luồng trong cùng một tiến trình chia sẻ một id chung được gọi là id nhóm id ( tgid), ngoài ra chúng có một id duy nhất được gọi là id id ( pid).


11

Cố gắng trả lời câu hỏi này liên quan đến thế giới Java.

Một tiến trình là một thực thi của một chương trình nhưng một luồng là một chuỗi thực hiện duy nhất trong tiến trình. Một quá trình có thể chứa nhiều chủ đề. Một chủ đề đôi khi được gọi là một quá trình nhẹ .

Ví dụ:

Ví dụ 1: Một JVM chạy trong một quy trình đơn và các luồng trong JVM chia sẻ heap thuộc về quy trình đó. Đó là lý do tại sao một số chủ đề có thể truy cập vào cùng một đối tượng. Chủ đề chia sẻ heap và có không gian ngăn xếp riêng của họ. Đây là cách gọi một phương thức của một luồng và các biến cục bộ của nó được giữ cho luồng an toàn khỏi các luồng khác. Nhưng heap không an toàn cho luồng và phải được đồng bộ hóa để đảm bảo an toàn cho luồng.

Ví dụ 2: Một chương trình có thể không thể vẽ hình bằng cách đọc tổ hợp phím. Chương trình phải tập trung hoàn toàn vào đầu vào bàn phím và thiếu khả năng xử lý nhiều sự kiện cùng một lúc sẽ dẫn đến sự cố. Giải pháp lý tưởng cho vấn đề này là thực hiện liền mạch hai hoặc nhiều phần của chương trình cùng một lúc. Chủ đề cho phép chúng tôi làm điều này. Ở đây Vẽ hình là một quá trình và đọc tổ hợp phím là quy trình phụ (luồng).


1
Câu trả lời hay, tôi thích rằng nó xác định phạm vi của nó (thế giới Java) và cung cấp một số ví dụ áp dụng - bao gồm một (# 2) mà bất kỳ ai phải hỏi câu hỏi ban đầu có thể liên quan ngay lập tức.
Smithers

9

Sự khác biệt giữa chủ đề và quy trình?

Một tiến trình là một thể hiện thực thi của một ứng dụng và Một luồng là một đường dẫn thực thi trong một tiến trình. Ngoài ra, một quy trình có thể chứa nhiều luồng. Điều quan trọng cần lưu ý là một luồng có thể làm bất cứ điều gì mà một tiến trình có thể làm. Nhưng vì một quy trình có thể bao gồm nhiều luồng, một luồng có thể được coi là một quá trình 'nhẹ'. Do đó, sự khác biệt cơ bản giữa một luồng và một tiến trình là công việc mà mỗi người được sử dụng để thực hiện. Các luồng được sử dụng cho các tác vụ nhỏ, trong khi các quy trình được sử dụng cho các tác vụ 'nặng hơn' - về cơ bản là thực thi các ứng dụng.

Một sự khác biệt khác giữa một luồng và một tiến trình là các luồng trong cùng một tiến trình chia sẻ cùng một không gian địa chỉ, trong khi các tiến trình khác nhau thì không. Điều này cho phép các luồng đọc và ghi vào cùng một cấu trúc dữ liệu và các biến và cũng tạo điều kiện giao tiếp giữa các luồng. Giao tiếp giữa các quá trình - còn được gọi là IPC, hoặc giao tiếp giữa các quá trình - khá khó khăn và tốn nhiều tài nguyên.

Dưới đây là tóm tắt về sự khác biệt giữa các luồng và tiến trình:

  1. Chủ đề dễ tạo hơn quy trình vì chúng không yêu cầu không gian địa chỉ riêng.

  2. Đa luồng yêu cầu lập trình cẩn thận vì các luồng chia sẻ các cấu trúc dữ liệu chỉ nên được sửa đổi bởi một luồng tại một thời điểm. Không giống như các luồng, các tiến trình không chia sẻ cùng một không gian địa chỉ.

  3. Chủ đề được coi là nhẹ vì chúng sử dụng ít tài nguyên hơn nhiều so với quy trình.

  4. Các quá trình là độc lập với nhau. Các chủ đề, vì chúng chia sẻ cùng một không gian địa chỉ là phụ thuộc lẫn nhau, do đó, cần thận trọng để các chủ đề khác nhau không giẫm lên nhau.
    Đây thực sự là một cách khác để nêu # 2 ở trên.

  5. Một quá trình có thể bao gồm nhiều chủ đề.


9

Sau đây là những gì tôi nhận được từ một trong những bài viết về Dự án Mã . Tôi đoán nó giải thích mọi thứ cần thiết rõ ràng.

Một luồng là một cơ chế khác để phân chia khối lượng công việc thành các luồng thực thi riêng biệt. Một chủ đề có trọng lượng nhẹ hơn một quá trình. Điều này có nghĩa là, nó cung cấp ít tính linh hoạt hơn so với quy trình toàn bộ, nhưng có thể được bắt đầu nhanh hơn vì có ít hệ điều hành để thiết lập. Khi một chương trình bao gồm hai hoặc nhiều luồng, tất cả các luồng chia sẻ một không gian bộ nhớ. Các quy trình được đưa ra không gian địa chỉ riêng biệt. tất cả các chủ đề chia sẻ một đống. Nhưng mỗi luồng được đưa ra ngăn xếp riêng của nó.


1
Không chắc chắn nếu điều này là rõ ràng, trừ khi đến từ một quan điểm đã hiểu chủ đề so với quy trình. Thêm vào cách chúng liên quan với nhau có thể hữu ích.
Smithers

Không rõ ràng. Nó có nghĩa là chỉ một quá trình và chủ đề của nó? Điều gì nếu có nhiều quá trình với nhiều chủ đề trong mỗi một? Có phải tất cả các chủ đề chia sẻ một không gian bộ nhớ duy nhất? Trong tất cả các quá trình đó?
Xanh

9

Quá trình:

Quá trình về cơ bản là một chương trình trong thực thi. Nó là một thực thể hoạt động. Một số hệ điều hành sử dụng thuật ngữ 'nhiệm vụ' để chỉ một chương trình đang được thực thi. Một tiến trình luôn được lưu trữ trong bộ nhớ chính cũng được gọi là bộ nhớ chính hoặc bộ nhớ truy cập ngẫu nhiên. Do đó, một quá trình được gọi là một thực thể hoạt động. Nó biến mất nếu máy được khởi động lại. Một số quy trình có thể được liên kết với cùng một chương trình. Trên hệ thống đa bộ xử lý, nhiều quy trình có thể được thực thi song song. Trên một hệ thống xử lý đơn, mặc dù không đạt được sự song song thực sự, một thuật toán lập lịch quy trình được áp dụng và bộ xử lý được lên lịch để thực hiện từng quy trình một lúc tạo ra ảo giác về sự tương tranh. Ví dụ: Thi hành nhiều phiên bản của chương trình 'Máy tính'. Mỗi trường hợp được gọi là một quá trình.

Chủ đề:

Một chủ đề là một tập hợp con của quá trình. Nó được gọi là "một quy trình nhẹ", vì nó tương tự như một quy trình thực nhưng thực thi trong bối cảnh của một quy trình và chia sẻ cùng một tài nguyên được phân bổ cho quy trình bởi hạt nhân. Thông thường, một quy trình chỉ có một luồng điều khiển - một bộ hướng dẫn máy thực thi tại một thời điểm. Một quá trình cũng có thể được tạo thành từ nhiều luồng thực thi đồng thời thực hiện các lệnh. Nhiều luồng điều khiển có thể khai thác tính song song thực sự có thể có trên các hệ thống đa bộ xử lý. Trên hệ thống uni-bộ xử lý, thuật toán lập lịch luồng được áp dụng và bộ xử lý được lên lịch để chạy từng luồng một. Tất cả các luồng chạy trong một tiến trình chia sẻ cùng một không gian địa chỉ, mô tả tệp, ngăn xếp và các thuộc tính liên quan đến quá trình khác. Vì các luồng của một tiến trình chia sẻ cùng một bộ nhớ,

ref- https://practice.geekforgeek.org/probols/difference-b between-process-and-read


Âm thanh giống như Node đồng thời trong một quá trình VS song song đa luồng của ngôn ngữ khác
user2734550

Đây là nghĩa đen được sao chép từ câu trả lời dưới đây từ năm 2010 ...
mc01

8

Từ quan điểm của một người phỏng vấn, về cơ bản chỉ có 3 điều chính mà tôi muốn nghe, bên cạnh những điều rõ ràng như một quy trình có thể có nhiều luồng:

  1. Các luồng chia sẻ cùng một không gian bộ nhớ, có nghĩa là một luồng có thể truy cập bộ nhớ từ bộ nhớ luồng của người khác. Quá trình thông thường không thể.
  2. Tài nguyên. Tài nguyên (bộ nhớ, tay cầm, ổ cắm, v.v.) được giải phóng khi kết thúc quá trình, không phải chấm dứt luồng.
  3. Bảo vệ. Một quy trình có mã thông báo bảo mật cố định. Mặt khác, một chuỗi có thể mạo danh người dùng / mã thông báo khác nhau.

Nếu bạn muốn nhiều hơn, phản ứng của Scott Langham bao gồm tất cả mọi thứ. Tất cả những điều này là từ quan điểm của một hệ điều hành. Các ngôn ngữ khác nhau có thể thực hiện các khái niệm khác nhau, như các tác vụ, các luồng sáng, v.v., nhưng chúng chỉ là cách sử dụng các luồng (của các sợi trên Windows). Không có chủ đề phần cứng và phần mềm. Có phần cứng và phần mềm ngoại lệngắt , hoặc sử dụng chế độ và kernel đề .


Khi bạn nói mã thông báo bảo mật, bạn có nghĩa là thông tin người dùng (tên người dùng / mật khẩu) giống như thông tin có trên linux chẳng hạn?

Trong các cửa sổ, đây là một chủ đề phức tạp, mã thông báo bảo mật (thực sự được gọi là Mã thông báo truy cập) là một cấu trúc lớn, chứa tất cả thông tin cần thiết để kiểm tra truy cập. Cấu trúc được tạo sau khi ủy quyền, có nghĩa là không có tên người dùng / mật khẩu, nhưng, một danh sách SID / quyền dựa trên tên người dùng / mật khẩu. Thêm thông tin chi tiết tại đây: msdn.microsoft.com/en-us/l
Library / windows / desktop / Kẻ

8
  1. Một luồng chạy trong một không gian bộ nhớ dùng chung, nhưng một tiến trình chạy trong một không gian bộ nhớ riêng
  2. Một chủ đề là một quá trình trọng lượng nhẹ, nhưng một quá trình là một quá trình trọng lượng nặng.
  3. Một chủ đề là một kiểu con của quá trình.

Điều này cảm thấy rất đệ quy. Nó sẽ là một câu trả lời tốt hơn có lẽ nếu mối quan hệ giữa luồng và tiến trình được mở rộng theo.
Smithers

7

Đối với những người thoải mái hơn với việc học bằng cách hình dung, đây là một sơ đồ tiện dụng tôi tạo ra để giải thích Quy trình và Chủ đề.
Tôi đã sử dụng thông tin từ MSDN - Giới thiệu về quy trình và chủ đề

Quy trình và chủ đề


1
Có thể thú vị để thêm một quá trình khác chỉ để xem cách đa luồng so sánh với đa xử lý.
Bram Vanroy

6

Đến từ thế giới nhúng, tôi muốn nói thêm rằng khái niệm các quy trình chỉ tồn tại trong các bộ xử lý "lớn" ( CPU máy tính để bàn, ARM Cortex A-9 ) có MMU (đơn vị quản lý bộ nhớ) và các hệ điều hành hỗ trợ sử dụng MMU ( chẳng hạn như Linux ). Với bộ xử lý nhỏ / cũ và bộ vi điều khiển và hệ điều hành RTOS nhỏ ( hệ điều hành thời gian thực ), như freeRTOS, không có hỗ trợ MMU và do đó không có quy trình mà chỉ có các luồng.

Các luồng có thể truy cập vào bộ nhớ của nhau và chúng được HĐH lên lịch theo cách xen kẽ để chúng có vẻ chạy song song (hoặc với đa lõi chúng thực sự chạy song song).

Mặt khác, các quá trình sống trong hộp cát riêng của bộ nhớ ảo, được cung cấp và bảo vệ bởi MMU. Điều này rất hữu ích vì nó cho phép:

  1. giữ cho quá trình lỗi không làm hỏng toàn bộ hệ thống.
  2. Duy trì bảo mật bằng cách làm cho các quy trình khác trở nên vô hình và không thể truy cập được. Công việc thực tế bên trong quy trình được chăm sóc bởi một hoặc nhiều luồng.

6
  1. Về cơ bản, một luồng là một phần của một quy trình mà không có luồng xử lý sẽ không thể hoạt động.
  2. Một chủ đề là nhẹ trong khi quá trình là nặng.
  3. giao tiếp giữa quá trình đòi hỏi một số thời gian trong khi chủ đề đòi hỏi ít thời gian hơn.
  4. Chủ đề có thể chia sẻ cùng một vùng bộ nhớ trong khi quá trình sống riêng biệt.

6

Quá trình : chương trình được thực hiện được gọi là quá trình

Chủ đề : Chủ đề là một chức năng được thực thi với phần khác của chương trình dựa trên khái niệm "cái này với cái khác" vì vậy luồng là một phần của quá trình ..


Không tệ, mặc dù nó giới thiệu một khái niệm mới ("cái này với cái khác") có lẽ xa lạ với ai đó đặt câu hỏi.
Smithers

Bài viết được định dạng dưới dạng mã nhưng phải là văn bản bình thường.
Heinrich

6

Tôi đã đọc gần như tất cả các câu trả lời ở đó, than ôi, khi một sinh viên đại học tham gia khóa học hệ điều hành hiện tại tôi không thể hiểu thấu đáo hai khái niệm này. Ý tôi là hầu hết mọi người đọc từ một số sách hệ điều hành, sự khác biệt tức là các luồng có thể truy cập vào các biến toàn cục trong đơn vị giao dịch vì họ sử dụng không gian địa chỉ của quy trình. Tuy nhiên, câu hỏi mới được đặt ra tại sao có các quy trình, về mặt nhận thức, chúng ta đã biết các chủ đề là các quy trình vis-à-vis nhẹ hơn. Hãy lướt qua ví dụ sau bằng cách sử dụng hình ảnh được trích từ một trong những câu trả lời trước ,

Chúng tôi có 3 luồng làm việc cùng một lúc trên một tài liệu word, ví dụ Libre Office . Đầu tiên không kiểm tra chính tả bằng cách gạch chân nếu từ đó sai chính tả. Thứ hai lấy và in các chữ cái từ bàn phím. Và cuối cùng không lưu tài liệu trong mỗi thời gian ngắn để không làm mất tài liệu làm việc nếu có sự cố. Trong trường hợp này, 3 luồng không thể là 3 tiến trình vì chúng chia sẻ một bộ nhớ chung là không gian địa chỉ của tiến trình của chúng và do đó tất cả đều có quyền truy cập vào tài liệu đang được chỉnh sửa. Vì vậy, con đường là tài liệu từ cùng với hai máy ủi là các chủ đề mặc dù một trong số chúng bị thiếu trong hình ảnh.

nhập mô tả hình ảnh ở đây


5

Trong khi xây dựng một thuật toán bằng Python (ngôn ngữ được giải thích) kết hợp đa luồng, tôi rất ngạc nhiên khi thấy rằng thời gian thực hiện không tốt hơn khi so sánh với thuật toán tuần tự mà tôi đã xây dựng trước đó. Trong nỗ lực tìm hiểu lý do cho kết quả này, tôi đã đọc và tin rằng những gì tôi học được cung cấp một bối cảnh thú vị để từ đó hiểu rõ hơn về sự khác biệt giữa đa luồng và đa quy trình.

Các hệ thống đa lõi có thể thực hiện nhiều luồng thực thi và do đó Python nên hỗ trợ đa luồng. Nhưng Python không phải là ngôn ngữ được biên dịch và thay vào đó là ngôn ngữ được dịch 1 . Điều này có nghĩa là chương trình phải được diễn giải để chạy và trình thông dịch không biết về chương trình trước khi bắt đầu thực thi. Tuy nhiên, những gì nó biết là các quy tắc của Python và sau đó nó tự động áp dụng các quy tắc đó. Tối ưu hóa trong Python sau đó phải là tối ưu hóa chủ yếu của chính trình thông dịch, và không phải là mã sẽ được chạy. Điều này trái ngược với các ngôn ngữ được biên dịch như C ++ và có hậu quả đối với đa luồng trong Python. Cụ thể, Python sử dụng Khóa phiên dịch toàn cầu để quản lý đa luồng.

Mặt khác, một ngôn ngữ được biên dịch là, tốt, được biên dịch. Chương trình được xử lý "hoàn toàn", trong đó đầu tiên nó được diễn giải theo các định nghĩa cú pháp của nó, sau đó được ánh xạ tới một biểu diễn trung gian bất khả tri ngôn ngữ, và cuối cùng được liên kết thành một mã thực thi. Quá trình này cho phép mã được tối ưu hóa cao bởi vì tất cả đều có sẵn tại thời điểm biên dịch. Các tương tác và mối quan hệ chương trình khác nhau được xác định tại thời điểm thực thi được tạo và các quyết định mạnh mẽ về tối ưu hóa có thể được đưa ra.

Trong các môi trường hiện đại, trình thông dịch của Python phải cho phép đa luồng và điều này phải an toàn và hiệu quả. Đây là nơi mà sự khác biệt giữa việc là một ngôn ngữ được giải thích so với một ngôn ngữ được biên dịch đi vào bức tranh. Trình thông dịch không được làm phiền dữ liệu được chia sẻ nội bộ từ các luồng khác nhau, đồng thời tối ưu hóa việc sử dụng bộ xử lý để tính toán.

Như đã lưu ý trong các bài viết trước, cả một tiến trình và một luồng là các thực thi tuần tự độc lập với sự khác biệt chính là bộ nhớ được chia sẻ trên nhiều luồng của một tiến trình, trong khi các tiến trình cô lập không gian bộ nhớ của chúng.

Trong dữ liệu Python được bảo vệ khỏi sự truy cập đồng thời bởi các luồng khác nhau bởi Khóa phiên dịch toàn cầu. Nó yêu cầu rằng trong bất kỳ chương trình Python nào, chỉ một luồng có thể được thực thi bất cứ lúc nào. Mặt khác, có thể chạy nhiều tiến trình do bộ nhớ cho mỗi tiến trình được cách ly với bất kỳ tiến trình nào khác và các tiến trình có thể chạy trên nhiều lõi.


1 Donald Knuth có một lời giải thích tốt về các thói quen diễn giải trong Nghệ thuật lập trình máy tính: Các thuật toán cơ bản.


4

Các luồng trong cùng một tiến trình chia sẻ Bộ nhớ, nhưng mỗi luồng có ngăn xếp và thanh ghi riêng và các luồng lưu trữ dữ liệu cụ thể của luồng trong heap. Các luồng không bao giờ thực hiện độc lập, do đó, giao tiếp giữa các luồng nhanh hơn nhiều so với giao tiếp giữa các quá trình.

Các quy trình không bao giờ chia sẻ cùng một bộ nhớ. Khi một tiến trình con tạo ra nó sẽ nhân đôi vị trí bộ nhớ của tiến trình cha. Quá trình giao tiếp được thực hiện bằng cách sử dụng đường ống, bộ nhớ dùng chung và phân tích thông điệp. Bối cảnh chuyển đổi giữa các chủ đề là rất chậm.


4

Câu trả lời hay nhất tôi tìm thấy cho đến nay là 'Giao diện lập trình Linux' của Michael Kerrisk :

Trong các triển khai UNIX hiện đại, mỗi quy trình có thể có nhiều luồng thực thi. Một cách để dự kiến ​​các luồng là một tập hợp các quy trình có chung bộ nhớ ảo, cũng như một loạt các thuộc tính khác. Mỗi luồng đang thực thi cùng một mã chương trình và chia sẻ cùng một vùng dữ liệu và heap. Tuy nhiên, mỗi luồng có ngăn xếp riêng chứa các biến cục bộ và thông tin liên kết gọi hàm. [LPI 2.12]

Cuốn sách này là một nguồn của sự rõ ràng tuyệt vời; Julia Evans đã đề cập đến sự giúp đỡ của nó trong việc làm rõ cách các nhóm Linux thực sự hoạt động trong bài viết này .


Điều này dường như trực tiếp tự mâu thuẫn. Một phần nói rằng một quá trình có thể có nhiều hơn một luồng. Phần tiếp theo cho biết một luồng là một tập hợp các tiến trình chia sẻ bộ nhớ ảo. Tôi không thấy làm thế nào cả hai điều này có thể đúng.
David Schwartz

Đây là cách tôi đọc nó: vứt bỏ từ 'có' trong câu đầu tiên. Những gì bạn còn lại với, thuật ngữ-khôn ngoan, là 1) một chủ đề duy nhất và 2) một nhóm các chủ đề, được gọi là một quá trình vì lợi ích thuận tiện. Đây là nhận định của tôi về những gì Kerrisk đang ở đây.
Zach Valenta

Điều tôi nghĩ rằng anh ta đang cố gắng nói rằng nếu bạn đã quen với khung nhìn UNIX cũ thì các tiến trình là những gì HĐH lên lịch thì một tập các luồng giống như một tập các tiến trình, ngoại trừ chúng chia sẻ một loạt các thứ.
David Schwartz

Đúng! Cách tốt để đặt nó.
Zach Valenta

3

Ví dụ 1: Một JVM chạy trong một quy trình đơn và các luồng trong JVM chia sẻ heap thuộc về quy trình đó. Đó là lý do tại sao một số chủ đề có thể truy cập vào cùng một đối tượng. Chủ đề chia sẻ heap và có không gian ngăn xếp riêng của họ. Đây là cách gọi một phương thức của một luồng và các biến cục bộ của nó được giữ cho luồng an toàn khỏi các luồng khác. Nhưng heap không an toàn cho luồng và phải được đồng bộ hóa để đảm bảo an toàn cho luồng.


3

Chúng gần giống nhau ... Nhưng điểm khác biệt chính là một luồng rất nhẹ và một quá trình có trọng lượng lớn về chuyển đổi ngữ cảnh, tải công việc, v.v.


Bạn có thể mở rộng câu trả lời của bạn?
Fiver

3
Chủ đề là một quy trình phụ, chúng chia sẻ các tài nguyên phổ biến như mã, dữ liệu, tệp trong một quy trình. Trong khi đó, hai quy trình không thể chia sẻ tài nguyên (Ngoại lệ là nếu một quá trình (cha mẹ) tạo một quy trình khác (con) thì theo mặc định chúng có thể chia sẻ tài nguyên.), yêu cầu tải trọng cao đối với tài nguyên cho CPU trong khi các luồng nhẹ hơn nhiều trong Ngữ cảnh này. Mặc dù cả hai đều sở hữu những thứ giống nhau.Scenario, hãy xem xét một quy trình xử lý đơn bị chặn do I / 0, sau đó toàn bộ 1 sẽ đi đến trạng thái chờ nhưng khi quá trình đa luồng bị chặn bởi i / o, thì chỉ có 1 i / o liên quan của nó sẽ bị chặn.
Nasir Ul Hồi giáo Mông
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.