Sự khác biệt giữa fork và Thread là gì?


Câu trả lời:


94

Một fork cung cấp cho bạn một quy trình hoàn toàn mới, là bản sao của quy trình hiện tại, với các đoạn mã giống nhau. Khi hình ảnh bộ nhớ thay đổi (thường là do hành vi khác nhau của hai quá trình), bạn sẽ nhận được sự tách biệt của các hình ảnh bộ nhớ (Copy On Write), tuy nhiên mã thực thi vẫn giữ nguyên. Các tác vụ không chia sẻ bộ nhớ trừ khi chúng sử dụng một số nguyên thủy của Giao tiếp Liên tiến trình (IPC) .

Một quy trình có thể có nhiều luồng, mỗi luồng thực thi song song trong cùng một ngữ cảnh của quy trình. Bộ nhớ và các tài nguyên khác được chia sẻ giữa các luồng, do đó dữ liệu được chia sẻ phải được truy cập thông qua một số đối tượng nguyên thủy và đồng bộ hóa (như mutexes , biến điều kiệnsemaphores ) cho phép bạn tránh bị hỏng dữ liệu.


3
Bạn có thể muốn tham khảo "bản sao của quy trình hiện tại" như một quy trình con.

1
Tuy nhiên, phân đoạn văn bản thường được chia sẻ (hầu như) và thậm chí phân đoạn dữ liệu có thể được sao chép-ghi.
Jé Queue


76

Cái nĩa

Fork không là gì khác ngoài một quy trình mới giống hệt quy trình cũ hoặc quy trình mẹ nhưng vẫn là một quy trình khác với ID quy trình khác và có bộ nhớ riêng. Tiến trình cha tạo một không gian địa chỉ riêng cho con. Cả tiến trình cha và con đều sở hữu cùng một đoạn mã, nhưng thực thi độc lập với nhau.

Ví dụ đơn giản nhất về sự phân tách là khi bạn chạy một lệnh trên shell trong Unix / Linux. Mỗi khi người dùng đưa ra một lệnh, shell sẽ tạo ra một tiến trình con và tác vụ được thực hiện.

Khi một lệnh gọi hệ thống rẽ nhánh được đưa ra, một bản sao của tất cả các trang tương ứng với quy trình mẹ sẽ được tạo, được hệ điều hành tải vào một vị trí bộ nhớ riêng cho quy trình con, nhưng trong một số trường hợp nhất định, điều này không cần thiết. Giống như trong các lệnh gọi hệ thống 'execute', không cần sao chép các trang của quy trình mẹ, vì tệp thực thi thay thế không gian địa chỉ của chính quy trình mẹ.

Một số điều cần lưu ý về fork là:

  • Tiến trình con sẽ có ID tiến trình duy nhất của riêng nó.
  • Tiến trình con sẽ có bản sao của bộ mô tả tệp của chính nó.
  • Các khóa tệp được đặt bởi quy trình mẹ sẽ không được quy trình con kế thừa.
  • Bất kỳ semaphores nào đang mở trong quy trình mẹ cũng sẽ mở trong quy trình con.
  • Tiến trình con sẽ có bản sao riêng của các bộ mô tả hàng đợi tin nhắn của cha mẹ.
  • Con sẽ có không gian địa chỉ và bộ nhớ riêng.

Chủ đề

Chủ đề là Quy trình trọng lượng nhẹ (LWP). Theo truyền thống, một luồng chỉ là một trạng thái CPU (và một số trạng thái tối thiểu khác) với tiến trình chứa phần còn lại (dữ liệu, ngăn xếp, I / O, tín hiệu). Các chủ đề yêu cầu ít chi phí hơn so với “phân nhánh” hoặc tạo ra một quy trình mới vì hệ thống không khởi tạo không gian và môi trường bộ nhớ ảo hệ thống mới cho quy trình. Mặc dù hiệu quả nhất trên hệ thống đa xử lý nơi quy trình có thể được lên lịch chạy trên một bộ xử lý khác, do đó đạt được tốc độ thông qua xử lý song song hoặc phân tán, lợi ích cũng được tìm thấy trên các hệ thống đơn xử lý khai thác độ trễ trong I / O và các chức năng hệ thống khác có thể làm dừng quá trình chấp hành.

Các chủ đề trong cùng một quy trình chia sẻ:

  • hướng dẫn quy trình
  • hầu hết dữ liệu
  • mở tệp (bộ mô tả)
  • tín hiệu và bộ xử lý tín hiệu
  • thư mục làm việc hiện tại
  • id người dùng và nhóm

Thông tin chi tiết có thể được tìm thấy tại đây .


2
Một quy trình có thể có một số chủ đề. Nếu một trong các luồng trong một tiến trình gọi fork, liệu tiến trình đã phân tách có bộ nhớ được sao chép hoàn toàn, nhưng chỉ có luồng đang gọi là trong tiến trình mới?
Michael


29

Câu trả lời của Dacav rất tuyệt vời, tôi chỉ muốn nói thêm rằng không phải tất cả các mô hình phân luồng đều cung cấp cho bạn khả năng đa xử lý thực sự.

Ví dụ, việc triển khai luồng mặc định của Ruby không sử dụng các luồng hệ điều hành / nhân thực sự. Thay vào đó, nó bắt chước có nhiều luồng bằng cách chuyển đổi giữa các đối tượng Thread trong một luồng / quy trình hạt nhân.

Điều này rất quan trọng đối với các hệ thống đa xử lý / đa lõi, bởi vì các loại luồng nhẹ này chỉ có thể chạy trên một lõi duy nhất - bạn sẽ không nhận được gì nhiều trong cách tăng hiệu suất khi có nhiều luồng.

Điểm khác mà điều này tạo ra sự khác biệt là khi một luồng chặn (chờ I / O hoặc gọi IOCTL của trình điều khiển), tất cả luồng sẽ chặn.

Điều này không còn phổ biến hiện nay - hầu hết các triển khai luồng sử dụng các luồng nhân không bị những vấn đề này - nhưng nó đáng được chú ý để hoàn thiện.

Ngược lại, fork cung cấp cho bạn một quy trình khác có thể chạy đồng thời trên một CPU vật lý khác trong khi quy trình gốc đang thực thi. Một số người thấy IPC phù hợp hơn với ứng dụng của họ, những người khác thích phân luồng hơn.

Chúc may mắn và vui vẻ! Đa luồng vừa là thách thức vừa bổ ích.


7
1 cho đánh một dây thần kinh: "không phải tất cả luồng cung cấp cho bạn đa true"
Dacav

5

Threads là các hàm chạy song song, fork là một tiến trình mới với sự kế thừa của cha mẹ. Các luồng rất tốt để thực hiện một tác vụ song song, trong khi các nhánh là quá trình độc lập, cũng đang chạy đồng thời. Chủ đề có các điều kiện đua và có các nút điều khiển bán nguyệt và khóa hoặc mutexes, cả hai ống đều có thể được sử dụng trong phuộc và ren.

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.