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) là 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