Chủ đề so với quy trình trong Linux


253

Gần đây tôi đã nghe một số người nói rằng trong Linux, hầu như luôn luôn tốt hơn khi sử dụng các quy trình thay vì các luồng, vì Linux rất hiệu quả trong việc xử lý các quy trình và vì có quá nhiều vấn đề (như khóa) liên quan đến các luồng. Tuy nhiên, tôi nghi ngờ, vì có vẻ như các chủ đề có thể mang lại hiệu suất khá lớn trong một số tình huống.

Vì vậy, câu hỏi của tôi là, khi gặp một tình huống mà các luồng và các tiến trình có thể xử lý khá tốt, tôi nên sử dụng các tiến trình hay các luồng? Ví dụ: nếu tôi đang viết một máy chủ web, tôi có nên sử dụng các quy trình hoặc chủ đề (hoặc kết hợp) không?


Có sự khác biệt với Linux 2.4 không?
mouviciel

3
Sự khác biệt giữa các tiến trình và luồng trong Linux 2.4 là các luồng chia sẻ nhiều phần trạng thái của chúng (không gian địa chỉ, xử lý tệp, v.v.) so với các tiến trình, thường không có. NPTL trong Linux 2.6 làm cho điều này rõ ràng hơn một chút bằng cách cung cấp cho họ "nhóm luồng" giống như "quy trình" trong win32 và Solaris.
MarkR

6
Lập trình đồng thời là khó khăn. Trừ khi bạn cần hiệu suất rất cao, khía cạnh quan trọng nhất trong sự đánh đổi của bạn thường sẽ là khó khăn trong việc gỡ lỗi . Các quy trình làm cho giải pháp dễ dàng hơn nhiều về mặt này, bởi vì tất cả các giao tiếp đều rõ ràng (dễ kiểm tra, để đăng nhập, v.v.). Ngược lại, bộ nhớ chia sẻ của các luồng tạo ra ánh mắt của những nơi mà một luồng có thể tác động sai đến một luồng khác.
Lutz Prechelt

1
@LutzPrechelt - Lập trình đồng thời có thể đa luồng cũng như đa tiến trình. Tôi không thấy lý do tại sao bạn giả sử lập trình đồng thời là đa luồng. Nó có thể là do một số hạn chế ngôn ngữ cụ thể nhưng nói chung nó có thể là cả hai.
iankit

2
Tôi liên kết Lutz chỉ tuyên bố rằng lập trình đồng thời là khó khăn dù được chọn - quy trình hay luồng - nhưng lập trình đồng thời sử dụng các quy trình giúp cho việc gỡ lỗi dễ dàng hơn trong nhiều trường hợp.
dùng2692263

Câu trả lời:


322

Linux sử dụng mô hình luồng 1-1, với (với kernel) không có sự phân biệt giữa các tiến trình và luồng - mọi thứ chỉ đơn giản là một nhiệm vụ có thể chạy được. *

Trên Linux, hệ thống gọi clonenhân bản một tác vụ, với mức chia sẻ có thể định cấu hình, trong số đó là:

  • CLONE_FILES: chia sẻ cùng bảng mô tả tệp (thay vì tạo bản sao)
  • CLONE_PARENT: không thiết lập mối quan hệ cha-con giữa nhiệm vụ mới và nhiệm vụ cũ (nếu không, child getppid()= cha mẹ getpid())
  • CLONE_VM: chia sẻ cùng một không gian bộ nhớ (thay vì tạo bản sao COW )

fork()cuộc gọi clone(chia sẻ ít nhất )pthread_create()cuộc gọi clone(chia sẻ nhiều nhất ). **

forking tốn kém hơn một chút so với pthread_createing vì sao chép bảng và tạo ánh xạ COW cho bộ nhớ, nhưng các nhà phát triển nhân Linux đã thử (và đã thành công) để giảm thiểu các chi phí đó.

Chuyển đổi giữa các tác vụ, nếu chúng chia sẻ cùng một không gian bộ nhớ và các bảng khác nhau, sẽ rẻ hơn một chút so với khi chúng không được chia sẻ, vì dữ liệu có thể đã được tải trong bộ đệm. Tuy nhiên, chuyển đổi tác vụ vẫn rất nhanh ngay cả khi không có gì được chia sẻ - đây là điều khác mà các nhà phát triển nhân Linux cố gắng đảm bảo (và thành công trong việc đảm bảo).

Trong thực tế, nếu bạn đang sử dụng hệ thống đa bộ xử lý, việc không chia sẻ thực sự có thể có lợi cho hiệu năng: nếu mỗi tác vụ đang chạy trên một bộ xử lý khác nhau, việc đồng bộ hóa bộ nhớ dùng chung rất tốn kém.


* Giản thể. CLONE_THREADlàm cho việc phân phối tín hiệu được chia sẻ (cần chia sẻ CLONE_SIGHANDbảng xử lý tín hiệu).

** Giản thể. Tồn tại cả hai SYS_forkSYS_clonetòa nhà, nhưng trong nhân, sys_forksys_clonecả hai đều là các hàm bao rất mỏng xung quanh cùng một do_forkchức năng, mà chính nó là một trình bao bọc mỏng xung quanh copy_process. Vâng, các điều khoản process, threadtaskđược sử dụng chứ không phải thay thế cho nhau trong nhân Linux ...


6
Tôi nghĩ rằng chúng tôi đang thiếu 1 điểm. Nếu bạn thực hiện nhiều quy trình cho máy chủ web của mình, thì bạn phải viết một quy trình khác để mở ổ cắm và chuyển 'công việc' cho các luồng khác nhau. Threading cung cấp một quá trình duy nhất nhiều chủ đề, thiết kế sạch sẽ. Trong nhiều tình huống, luồng chỉ là tự nhiên và trong tình huống khác, một quá trình mới chỉ là tự nhiên. Khi vấn đề rơi vào vùng xám, sự đánh đổi khác như được giải thích bởi phù du trở nên quan trọng.
Saurabh

26
@Saurabh Không hẳn. Bạn có thể dễ dàng socket, bind, listen, fork, và sau đó có nhiều quy trình acceptkết nối vào ổ cắm nghe cùng. Một quy trình có thể ngừng chấp nhận nếu nó bận và kernel sẽ định tuyến các kết nối đến một quy trình khác (nếu không có ai nghe, kernel sẽ xếp hàng hoặc thả, tùy thuộc vào listentồn đọng). Bạn không có nhiều quyền kiểm soát phân phối công việc hơn thế, nhưng thường thì đủ tốt!
ephemient

2
@Bloodcount Tất cả các quy trình / luồng trên Linux được tạo bởi cùng một cơ chế, nhân bản một quy trình / luồng hiện có. Cờ được thông qua để clone()xác định tài nguyên nào được chia sẻ. Một nhiệm vụ cũng có thể unshare()tài nguyên tại bất kỳ thời điểm nào sau này.
ephemient

4
@KarthikBalaguru Trong chính kernel, có một task_structnhiệm vụ cho mỗi tác vụ. Điều này thường được gọi là "quy trình" trong toàn bộ mã hạt nhân, nhưng nó tương ứng với từng luồng có thể chạy được. Không có process_struct; nếu một nhóm các task_structliên kết với nhau theo thread_groupdanh sách của họ , thì chúng là cùng một "quy trình" với không gian người dùng. Có một chút xử lý đặc biệt của "luồng", ví dụ: tất cả các luồng anh chị em đều dừng trên ngã ba và thực thi và chỉ có luồng "chính" xuất hiện ls /proc. Mọi chủ đề đều có thể truy cập thông qua /proc/pid, cho dù nó được liệt kê trong /prochay không.
ephemient

5
@KarthikBalaguru Hạt nhân hỗ trợ liên tục hành vi giữa các luồng và tiến trình; ví dụ, clone(CLONE_THREAD | CLONE_VM | CLONE_SIGHAND))sẽ cung cấp cho bạn một "luồng" mới không chia sẻ thư mục làm việc, tệp hoặc khóa, trong khi clone(CLONE_FILES | CLONE_FS | CLONE_IO)sẽ cung cấp cho bạn một "quy trình". Hệ thống cơ bản tạo ra các nhiệm vụ bằng cách nhân bản; fork()pthread_create()chỉ là các hàm thư viện gọi clone()khác nhau (như tôi đã viết trong câu trả lời này).
ephemient

60

Linux (và thực sự là Unix) cung cấp cho bạn tùy chọn thứ ba.

Tùy chọn 1 - quy trình

Tạo một tệp thực thi độc lập xử lý một số phần (hoặc tất cả các phần) của ứng dụng của bạn và gọi riêng nó cho từng quy trình, ví dụ: chương trình chạy các bản sao của chính nó để ủy thác các tác vụ.

Tùy chọn 2 - chủ đề

Tạo một tệp thực thi độc lập bắt đầu với một luồng và tạo các luồng bổ sung để thực hiện một số tác vụ

Lựa chọn 3 - ngã ​​ba

Chỉ có sẵn trong Linux / Unix, điều này hơi khác một chút. Một tiến trình rẽ nhánh thực sự là một quá trình riêng của nó với không gian địa chỉ của chính nó - không có gì mà đứa trẻ có thể làm (thông thường) để ảnh hưởng đến không gian địa chỉ của cha mẹ hoặc anh chị em của nó (không giống như một luồng) - vì vậy bạn được thêm mạnh mẽ.

Tuy nhiên, các trang bộ nhớ không được sao chép, chúng là bản sao khi ghi, do đó, bộ nhớ thường được sử dụng ít hơn bạn tưởng.

Hãy xem xét một chương trình máy chủ web bao gồm hai bước:

  1. Đọc dữ liệu cấu hình và thời gian chạy
  2. Phục vụ yêu cầu trang

Nếu bạn đã sử dụng các luồng, bước 1 sẽ được thực hiện một lần và bước 2 được thực hiện trong nhiều luồng. Nếu bạn đã sử dụng các quy trình "truyền thống", các bước 1 và 2 sẽ cần phải được lặp lại cho mỗi quy trình và bộ nhớ để lưu trữ dữ liệu cấu hình và thời gian chạy trùng lặp. Nếu bạn đã sử dụng fork (), thì bạn có thể thực hiện bước 1 một lần, sau đó rẽ nhánh (), để lại dữ liệu và cấu hình thời gian chạy trong bộ nhớ, không bị chạm, không được sao chép.

Vì vậy, có ba lựa chọn thực sự.


7
@Qwertie forking không thú vị lắm, nó phá vỡ rất nhiều thư viện theo những cách tinh tế (nếu bạn sử dụng chúng trong quy trình cha mẹ). Nó tạo ra hành vi bất ngờ gây nhầm lẫn ngay cả các lập trình viên có kinh nghiệm.
MarkR

2
@MarkR bạn có thể đưa ra một số ví dụ hoặc một liên kết về cách phá vỡ thư viện và tạo ra hành vi không mong muốn?
Ehtesh Choudhury

18
Nếu một quá trình chuyển đổi với kết nối mysql mở, điều tồi tệ sẽ xảy ra, vì ổ cắm được chia sẻ giữa hai quy trình. Ngay cả khi chỉ có một quá trình sử dụng kết nối, quá trình kia sẽ ngăn không cho nó bị đóng.
MarkR

1
Cuộc gọi hệ thống fork () được chỉ định bởi POSIX (có nghĩa là nó có sẵn trên bất kỳ hệ thống Unix nào), nếu bạn đã sử dụng API Linux cơ bản, đó là cuộc gọi hệ thống clone (), thì bạn thực sự có nhiều lựa chọn hơn trong Linux so với chỉ ba .
Lie Ryan

2
@MarkR Việc chia sẻ ổ cắm là theo thiết kế. Ngoài ra, một trong hai quy trình có thể đóng ổ cắm bằng linux.die.net/man/2/shutdown trước khi gọi close () trên ổ cắm.
Lelanthran

53

Điều đó phụ thuộc vào rất nhiều yếu tố. Các quy trình có trọng lượng nặng hơn các luồng và có chi phí khởi động và tắt máy cao hơn. Giao tiếp giữa các quá trình (IPC) cũng khó hơn và chậm hơn so với giao tiếp giữa các lớp.

Ngược lại, các quy trình an toàn hơn và an toàn hơn các luồng, bởi vì mỗi quy trình chạy trong không gian địa chỉ ảo của chính nó. Nếu một tiến trình gặp sự cố hoặc có lỗi tràn bộ đệm, nó hoàn toàn không ảnh hưởng đến bất kỳ tiến trình nào khác, trong khi nếu một luồng gặp sự cố, nó sẽ gỡ bỏ tất cả các luồng khác trong tiến trình và nếu một luồng có lỗi tràn bộ đệm, nó sẽ mở ra một lỗ hổng bảo mật trong tất cả các chủ đề.

Vì vậy, nếu các mô-đun của ứng dụng của bạn có thể chạy chủ yếu độc lập với ít giao tiếp, có lẽ bạn nên sử dụng các quy trình nếu bạn có đủ khả năng chi phí khởi động và tắt máy. Hiệu suất của IPC sẽ là tối thiểu và bạn sẽ an toàn hơn một chút trước các lỗi và lỗ hổng bảo mật. Nếu bạn cần mỗi bit hiệu suất bạn có thể nhận được hoặc có nhiều dữ liệu được chia sẻ (chẳng hạn như cấu trúc dữ liệu phức tạp), hãy đi với các luồng.


9
Câu trả lời của Adam sẽ phục vụ tốt như một cuộc họp giao ban. Để biết thêm chi tiết, MarkR và ephemient cung cấp giải thích tốt. Một lời giải thích rất chi tiết với các ví dụ có thể được tìm thấy tại cs.cf.ac.uk/Dave/C/node29.html nhưng nó dường như có một chút ngày tháng trong các phần.
CyberFonic

2
CyberFonic là đúng cho Windows. Như ephemient nói trong các quy trình Linux không nặng hơn. Và trong Linux, tất cả các cơ chế có sẵn để liên lạc giữa các luồng (Futex, bộ nhớ dùng chung, đường ống, IPC) cũng có sẵn cho các quy trình và chạy ở cùng tốc độ.
Russell Stuart

IPC khó sử dụng hơn nhưng nếu ai đó sử dụng "bộ nhớ dùng chung" thì sao?
abhiarora

11

Những người khác đã thảo luận về những cân nhắc.

Có lẽ sự khác biệt quan trọng là trong các quy trình của Windows rất nặng và tốn kém so với các luồng và trong Linux, sự khác biệt nhỏ hơn nhiều, do đó phương trình cân bằng ở một điểm khác.


9

Ngày xưa có Unix và trong Unix cũ tốt này có rất nhiều chi phí cho các quy trình, vì vậy điều mà một số người thông minh đã làm là tạo ra các luồng, sẽ chia sẻ cùng một không gian địa chỉ với tiến trình cha mẹ và họ chỉ cần một bối cảnh giảm chuyển đổi, mà sẽ làm cho việc chuyển đổi bối cảnh hiệu quả hơn.

Trong Linux hiện đại (2.6.x), không có nhiều khác biệt về hiệu năng giữa chuyển đổi ngữ cảnh của một quá trình so với một luồng (chỉ có các công cụ MMU là bổ sung cho luồng). Có vấn đề với không gian địa chỉ dùng chung, có nghĩa là một con trỏ bị lỗi trong một luồng có thể làm hỏng bộ nhớ của tiến trình cha hoặc một luồng khác trong cùng một không gian địa chỉ.

Một quy trình được bảo vệ bởi MMU, vì vậy một con trỏ bị lỗi sẽ chỉ gây ra tín hiệu 11 và không có tham nhũng.

Nói chung, tôi sẽ sử dụng các quy trình (không có nhiều chuyển đổi ngữ cảnh trong Linux, nhưng bảo vệ bộ nhớ do MMU), nhưng pthreads nếu tôi cần một lớp lập lịch thời gian thực, đó là một tách trà khác nhau.

Tại sao bạn nghĩ rằng các luồng có mức tăng hiệu suất lớn như vậy trên Linux? Bạn có bất kỳ dữ liệu cho điều này, hoặc nó chỉ là một huyền thoại?


1
Vâng, tôi có một số dữ liệu. Tôi đã chạy thử nghiệm tạo 100.000 quy trình và thử nghiệm tạo 100.000 luồng. Phiên bản luồng chạy nhanh hơn khoảng 9 lần (17,38 giây cho các quy trình, 1,93 cho các luồng). Bây giờ điều này chỉ kiểm tra thời gian tạo, nhưng đối với các tác vụ ngắn hạn, thời gian tạo có thể là chìa khóa.
dùng17918

4
@ user17918 - Bạn có thể chia sẻ mã được bạn sử dụng để tính toán thời gian được đề cập ở trên không ..
mã hóa

Một khác biệt lớn, với các quy trình, bảng tạo hạt nhân cho mỗi quy trình và các nhà cung cấp chỉ sử dụng một bảng trang, vì vậy tôi nghĩ là bình thường các luồng nhanh hơn sau đó xử lý
c4f4t0r

Một cách đơn giản khác để xem xét nó là TCB khá nhỏ hơn PCB và do đó, rõ ràng là quá trình chuyển đổi ngữ cảnh liên quan đến PCB sẽ tiêu tốn nhiều thời gian hơn so với chuyển đổi luồng.
Karthik Balaguru

5

Làm thế nào kết hợp chặt chẽ là nhiệm vụ của bạn?

Nếu chúng có thể sống độc lập với nhau, thì hãy sử dụng các quy trình. Nếu họ dựa vào nhau, sau đó sử dụng chủ đề. Bằng cách đó bạn có thể giết và khởi động lại một quy trình xấu mà không can thiệp vào hoạt động của các tác vụ khác.


4

Để làm phức tạp vấn đề hơn nữa, có một thứ như lưu trữ cục bộ luồng và bộ nhớ chia sẻ Unix.

Lưu trữ cục bộ cho phép mỗi luồng có một thể hiện riêng của các đối tượng toàn cục. Lần duy nhất tôi sử dụng nó là khi xây dựng môi trường mô phỏng trên linux / windows, cho mã ứng dụng chạy trong RTOS. Trong RTOS, mỗi tác vụ là một quá trình với không gian địa chỉ riêng của nó, trong môi trường mô phỏng, mỗi tác vụ là một luồng (với một không gian địa chỉ dùng chung). Bằng cách sử dụng TLS cho những thứ như singletons, chúng tôi có thể có một phiên bản riêng cho từng luồng, giống như trong môi trường RTOS 'thực'.

Bộ nhớ dùng chung có thể (rõ ràng) mang lại cho bạn những lợi ích về hiệu suất khi có nhiều tiến trình truy cập vào cùng một bộ nhớ, nhưng với chi phí / rủi ro phải đồng bộ hóa các quy trình đúng cách. Một cách để làm điều đó là có một quy trình tạo cấu trúc dữ liệu trong bộ nhớ dùng chung, sau đó gửi một điều khiển đến cấu trúc đó thông qua giao tiếp giữa các quá trình truyền thống (như một đường ống có tên).


1
Tôi đã sử dụng bộ lưu trữ cục bộ để thu thập số liệu thống kê, lần cuối cùng tôi viết một chương trình mạng luồng: mỗi luồng được ghi vào bộ đếm riêng của nó, không cần khóa và chỉ khi bị rối, mỗi luồng sẽ kết hợp các chỉ số của nó thành tổng số toàn cầu. Nhưng vâng, TLS không được sử dụng phổ biến hoặc cần thiết. Mặt khác, bộ nhớ dùng chung ... ngoài việc gửi dữ liệu hiệu quả, bạn cũng có thể chia sẻ các ẩn dụ POSIX giữa các quy trình bằng cách đặt chúng vào bộ nhớ dùng chung. Nó thật tuyệt vời.
ephemient

4

Trong công việc gần đây của tôi với LINUX, một điều cần chú ý là các thư viện. Nếu bạn đang sử dụng các luồng, hãy đảm bảo mọi thư viện bạn có thể sử dụng trên các luồng đều an toàn cho luồng. Điều này đốt cháy tôi một vài lần. Đáng chú ý libxml2 không phải là chủ đề an toàn ra khỏi hộp. Nó có thể được biên dịch với luồng an toàn nhưng đó không phải là những gì bạn nhận được khi cài đặt aptitude.


3

Tôi phải đồng ý với những gì bạn đã nghe. Khi chúng tôi điểm chuẩn cụm của chúng tôi ( xhplvà như vậy), chúng tôi luôn có hiệu suất tốt hơn đáng kể với các quy trình qua các luồng.</anecdote>


3

Quyết định giữa luồng / tiến trình phụ thuộc một chút vào những gì bạn sẽ sử dụng nó. Một trong những lợi ích của một quy trình là nó có một PID và có thể bị giết mà không cần chấm dứt cha mẹ.

Đối với một ví dụ trong thế giới thực của máy chủ web, apache 1.3 được sử dụng để chỉ hỗ trợ nhiều quy trình, nhưng trong 2.0, họ đã thêm một bản tóm tắt để bạn có thể chuyển đổi giữa hai. Comments dường như để đồng ý rằng quá trình này mạnh mẽ hơn nhưng đề có thể cho một chút cắn hiệu suất tốt hơn (trừ cho các cửa sổ nơi hiệu suất cho quá trình hút và bạn chỉ muốn sử dụng bài).


2

Đối với hầu hết các trường hợp, tôi muốn các quy trình hơn chủ đề. các luồng có thể hữu ích khi bạn có một tác vụ tương đối nhỏ hơn (quá trình xử lý >> thời gian được thực hiện bởi mỗi đơn vị tác vụ được chia) và có nhu cầu chia sẻ bộ nhớ giữa chúng. Hãy suy nghĩ một mảng lớn. Ngoài ra (không chính thức), lưu ý rằng nếu mức sử dụng CPU của bạn là 100% hoặc gần với nó, sẽ không có lợi ích gì từ đa luồng hoặc xử lý. (thực tế nó sẽ xấu đi)


Bạn có nghĩa là không có lợi ích gì? Làm thế nào về việc thực hiện các tính toán nặng trong luồng GUI? Di chuyển chúng sang luồng song song sẽ tốt hơn nhiều từ trải nghiệm người dùng, bất kể CPU được tải như thế nào.
olegst

2

Chủ đề -> Chủ đề chia sẻ một không gian bộ nhớ, nó là một sự trừu tượng của CPU, nó rất nhẹ. Các quy trình -> Các quy trình có không gian bộ nhớ riêng, đó là một bản tóm tắt của máy tính. Để thực hiện song song nhiệm vụ, bạn cần trừu tượng hóa CPU. Tuy nhiên, ưu điểm của việc sử dụng một tiến trình trên một luồng là bảo mật, ổn định trong khi một luồng sử dụng bộ nhớ ít hơn tiến trình và cung cấp độ trễ thấp hơn. Một ví dụ về web sẽ là chrome và firefox. Trong trường hợp Chrome, mỗi tab là một quy trình mới do đó mức sử dụng bộ nhớ của chrome cao hơn firefox, trong khi tính bảo mật và độ ổn định được cung cấp tốt hơn firefox. Bảo mật ở đây được cung cấp bởi chrome là tốt hơn, vì mỗi tab là một quy trình mới, các tab khác nhau không thể rình mò vào không gian bộ nhớ của một quy trình nhất định.


2

Tôi nghĩ rằng tất cả mọi người đã làm một công việc tuyệt vời trả lời câu hỏi của bạn. Tôi chỉ thêm nhiều thông tin về luồng so với tiến trình trong Linux để làm rõ và tóm tắt một số phản hồi trước đó trong ngữ cảnh của kernel. Vì vậy, phản hồi của tôi liên quan đến mã cụ thể của kernel trong Linux. Theo tài liệu Linux Kernel, không có sự phân biệt rõ ràng giữa luồng so với tiến trình ngoại trừ luồng sử dụng không gian địa chỉ ảo được chia sẻ không giống như tiến trình. Cũng lưu ý, Hạt nhân Linux sử dụng thuật ngữ "tác vụ" để chỉ quy trình và luồng nói chung.

"Không có cấu trúc bên trong thực hiện các quy trình hoặc luồng, thay vào đó có một cấu trúc task_struct mô tả một đơn vị lập lịch trừu tượng được gọi là task"

Cũng theo Linus Torvalds, bạn KHÔNG nên nghĩ về quy trình so với luồng và bởi vì nó quá hạn chế và sự khác biệt duy nhất là COE hoặc Bối cảnh thực thi theo nghĩa "tách không gian địa chỉ khỏi cha mẹ" hoặc không gian địa chỉ dùng chung. Trong thực tế, ông sử dụng một ví dụ máy chủ web để đưa ra quan điểm của mình ở đây (rất khuyến khích đọc).

Tín dụng đầy đủ cho tài liệu kernel linux


-3

Nếu bạn cần chia sẻ tài nguyên, bạn thực sự nên sử dụng các chủ đề.

Cũng xem xét thực tế rằng các chuyển đổi ngữ cảnh giữa các luồng ít tốn kém hơn nhiều so với chuyển đổi ngữ cảnh giữa các tiến trình.

Tôi thấy không có lý do gì để đi rõ ràng với các quy trình riêng biệt trừ khi bạn có lý do chính đáng để làm điều đó (bảo mật, kiểm tra hiệu suất đã được chứng minh, v.v ...)


3
Tôi có đại diện để chỉnh sửa, nhưng tôi không đồng ý lắm. Chuyển đổi ngữ cảnh giữa các tiến trình trên Linux gần như rẻ như chuyển đổi ngữ cảnh giữa các luồng.
ephemient
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.