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 clone
nhâ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 )
và pthread_create()
cuộc gọi clone(
chia sẻ nhiều nhất )
. **
fork
ing tốn kém hơn một chút so với pthread_create
ing 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_THREAD
làm cho việc phân phối tín hiệu được chia sẻ (cần chia sẻ CLONE_SIGHAND
bảng xử lý tín hiệu).
** Giản thể. Tồn tại cả hai SYS_fork
và SYS_clone
tòa nhà, nhưng trong nhân, sys_fork
và sys_clone
cả hai đều là các hàm bao rất mỏng xung quanh cùng một do_fork
chứ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
, thread
và task
được sử dụng chứ không phải thay thế cho nhau trong nhân Linux ...