Linux ใช้รูปแบบเธรด 1-1 โดยที่ (ไปยังเคอร์เนล) ไม่มีความแตกต่างระหว่างกระบวนการและเธรด - ทุกอย่างเป็นงานที่รันได้ง่าย * * * *
บน Linux การเรียกระบบclone
โคลนงานโดยมีระดับการแชร์ที่กำหนดค่าได้ซึ่ง ได้แก่ :
CLONE_FILES
: แชร์ตารางตัวบอกรายละเอียดไฟล์เดียวกัน (แทนที่จะสร้างสำเนา)
CLONE_PARENT
: อย่าตั้งค่าความสัมพันธ์พาเรนต์ - ลูกระหว่างงานใหม่กับงานเก่า (ไม่เช่นนั้นgetppid()
= child's parent getpid()
)
CLONE_VM
: แบ่งปันพื้นที่หน่วยความจำเดียวกัน (แทนที่จะสร้างสำเนาCOW )
fork()
เรียกclone(
ใช้งานร่วมกันอย่างน้อย)
และpthread_create()
เรียกใช้งานร่วมกันมากที่สุดclone(
)
**
fork
ไอเอ็นจีมีค่าใช้จ่ายมากกว่าpthread_create
ไอเอ็นจีเล็กน้อยเนื่องจากการคัดลอกตารางและสร้างการแมป COW สำหรับหน่วยความจำ แต่นักพัฒนาเคอร์เนลลินุกซ์ได้ลอง (และประสบความสำเร็จ) ในการลดต้นทุนเหล่านั้น
การสลับระหว่างงานหากพวกเขาแชร์พื้นที่หน่วยความจำเดียวกันและตารางต่าง ๆ จะถูกกว่านิดหน่อยถ้าไม่ได้แชร์เพราะข้อมูลอาจถูกโหลดในแคชแล้ว อย่างไรก็ตามการสลับงานยังคงเร็วมากแม้ว่าจะไม่ได้แชร์อะไรเลยนี่เป็นสิ่งอื่นที่นักพัฒนาเคอร์เนล Linux พยายามทำให้มั่นใจ (และประสบความสำเร็จในการทำให้มั่นใจ)
ในความเป็นจริงหากคุณใช้ระบบหลายโปรเซสเซอร์การไม่แชร์อาจเป็นประโยชน์ต่อประสิทธิภาพการทำงาน: หากแต่ละงานใช้โปรเซสเซอร์อื่นการซิงโครไนซ์หน่วยความจำที่ใช้ร่วมกันนั้นมีราคาแพง
* ประยุกต์ CLONE_THREAD
ทำให้การส่งสัญญาณถูกแบ่งใช้ (ซึ่งต้องการCLONE_SIGHAND
ซึ่งแบ่งใช้ตารางตัวจัดการสัญญาณ)
** แบบง่าย มีอยู่ทั้งในSYS_fork
และSYS_clone
syscalls แต่ใน kernel ที่sys_fork
และsys_clone
มีทั้งห่อบางมากรอบเดียวฟังก์ชั่นที่ตัวเองเป็นเสื้อคลุมรอบบางdo_fork
copy_process
ใช่คำว่าprocess
, thread
และtask
มีการใช้ค่อนข้างสลับกันในลินุกซ์ ...