ความแตกต่างระหว่างเธรดและไฟเบอร์คืออะไร?


187

ความแตกต่างระหว่างเธรดและไฟเบอร์คืออะไร? ฉันเคยได้ยินเรื่องเส้นใยจากทับทิมและฉันอ่านแล้วได้ยินว่ามันมีอยู่ในภาษาอื่นบางคนสามารถอธิบายให้ฉันได้ง่ายๆว่าอะไรคือความแตกต่างระหว่างเธรดและไฟเบอร์

คำตอบ:


162

ในแง่ที่ง่ายที่สุดเธรดมักถูกพิจารณาว่าเป็นสิ่งที่ยึดเอาเสียก่อน (แม้ว่าสิ่งนี้อาจไม่เป็นจริงขึ้นอยู่กับระบบปฏิบัติการ) ในขณะที่เส้นใยถูกพิจารณาว่าเป็นเส้นใยที่มีน้ำหนักเบา ทั้งคู่เป็นเส้นทางการดำเนินการแยกต่างหากสำหรับแอปพลิเคชันของคุณ

ด้วยเธรด: เส้นทางการดำเนินการปัจจุบันอาจถูกขัดจังหวะหรือยึดเอาไว้ได้ตลอดเวลา (หมายเหตุ: คำสั่งนี้เป็นลักษณะทั่วไปและอาจไม่ถือเป็นจริงเสมอขึ้นอยู่กับ OS / เธรดแพ็คเกจ / ฯลฯ ) ซึ่งหมายความว่าสำหรับเธรดความสมบูรณ์ของข้อมูลเป็นปัญหาใหญ่เนื่องจากเธรดหนึ่งอาจหยุดทำงานในระหว่างการอัปเดตกลุ่มข้อมูลทำให้ความสมบูรณ์ของข้อมูลอยู่ในสถานะที่ไม่ดีหรือไม่สมบูรณ์ นี่หมายความว่าระบบปฏิบัติการสามารถใช้ประโยชน์จาก CPU และแกนประมวลผลหลายคอร์ได้ด้วยการรันเธรดมากกว่าหนึ่งเธรดในเวลาเดียวกันและปล่อยให้มันขึ้นกับนักพัฒนาเพื่อป้องกันการเข้าถึงข้อมูล

ด้วย Fibre: เส้นทางการประมวลผลปัจจุบันจะถูกขัดจังหวะเมื่อไฟเบอร์ให้การประมวลผลเท่านั้น (หมายเหตุเดียวกันกับด้านบน) ซึ่งหมายความว่าเส้นใยจะเริ่มและหยุดในสถานที่ที่กำหนดไว้อย่างดีเสมอดังนั้นความสมบูรณ์ของข้อมูลจึงเป็นปัญหาน้อยกว่ามาก นอกจากนี้เนื่องจากไฟเบอร์ถูกจัดการในพื้นที่ผู้ใช้บ่อยครั้งจึงไม่จำเป็นต้องทำการเปลี่ยนบริบทที่มีราคาแพงและการเปลี่ยนสถานะของ CPU ทำให้การเปลี่ยนจากไฟเบอร์หนึ่งไปสู่ประสิทธิภาพที่สูงขึ้น ในทางกลับกันเนื่องจากไม่มีเส้นใยสองชนิดที่สามารถทำงานได้ในเวลาเดียวกันการใช้เส้นใยเพียงอย่างเดียวจะไม่ใช้ประโยชน์จาก CPU หลายตัวหรือหลายแกน CPU


7
มีวิธีใดที่จะใช้หลายเธรดในการเรียกใช้เส้นใยแบบขนานหรือไม่?
Baradé

2
@ เจสัน, เมื่อคุณระบุ ~ "ด้วยเส้นใยเส้นทางการดำเนินการปัจจุบันจะถูกขัดจังหวะเฉพาะเมื่อเส้นใยให้การประมวลผล" และ "เส้นใยมักจะเริ่มและหยุดในสถานที่ที่กำหนดไว้อย่างดีดังนั้นความสมบูรณ์ของข้อมูลจะน้อยกว่าปัญหา" คุณหมายถึง เมื่อแบ่งปันตัวแปรเราไม่จำเป็นต้องใช้ "กลไกการล็อค" และตัวแปรระเหย? หรือคุณหมายถึงว่าเรายังต้องทำสิ่งเหล่านั้น?
Pacerier

@ Baradéมันเป็นคำถามที่น่าสนใจคุณหาคำตอบได้ไหม?
Mayur

57

เธรดใช้การกำหนดตารางเวลาแบบจองล่วงหน้าในขณะที่เส้นใยใช้การกำหนดเวลาแบบร่วมมือ

ด้วยเธรดการควบคุมการไหลสามารถถูกขัดจังหวะได้ตลอดเวลาและเธรดอื่นสามารถใช้แทน ด้วยโปรเซสเซอร์หลายตัวคุณสามารถมีหลายเธรดที่ทำงานพร้อมกัน ( มัลติเธรดพร้อมกันหรือ SMT) เป็นผลให้คุณจะต้องมีมากระมัดระวังเกี่ยวกับการเข้าถึงข้อมูลพร้อมกันและปกป้องข้อมูลของคุณด้วย mutexes, semaphores ตัวแปรสภาพและอื่น ๆ มันมักจะเป็นเรื่องยากมากที่จะได้รับสิทธิ

yield()ด้วยใยอาหารควบคุมเฉพาะสวิทช์เมื่อคุณบอกว่ามันไปโดยปกติจะมีการเรียกใช้ฟังก์ชันที่ชื่อว่าสิ่งที่ต้องการ ทำให้การเข้าถึงข้อมูลพร้อมกันง่ายขึ้นเนื่องจากคุณไม่ต้องกังวลเกี่ยวกับ atomicity ของโครงสร้างข้อมูลหรือ mutexes ตราบใดที่คุณไม่ยอมแพ้ก็ไม่มีอันตรายจากการถูกจองและมีเส้นใยอื่นพยายามอ่านหรือแก้ไขข้อมูลที่คุณทำงานด้วย อย่างไรก็ตามหากเส้นใยของคุณเข้าสู่วงวนไม่สิ้นสุดไม่มีเส้นใยอื่นใดที่สามารถวิ่งได้เนื่องจากคุณไม่ได้ให้ผลผลิต

นอกจากนี้คุณยังสามารถผสมเธรดและเส้นใยซึ่งก่อให้เกิดปัญหาทั้งสองอย่าง ไม่แนะนำ แต่บางครั้งอาจเป็นสิ่งที่ถูกต้องถ้าทำอย่างระมัดระวัง


3
ฉันคิดว่าการวนซ้ำไม่สิ้นสุดเป็นเพียงข้อผิดพลาดที่ต้องแก้ไขและเธรดมีข้อได้เปรียบค่อนข้างชัดเจนเมื่อมีการวนซ้ำไม่สิ้นสุด แนวคิดที่ไม่ใช่บั๊กกี้ที่เกี่ยวข้องคือเมื่อมีกระบวนการที่ใช้เวลานานซึ่งผู้ใช้อาจต้องการยกเลิก ในกรณีนี้ไม่ว่าคุณจะใช้เธรดหรือเส้นใยกระบวนการที่ใช้เวลานานจะต้องร่วมมือกัน - เพียงแค่การฆ่าเธรดอาจทำให้โครงสร้างข้อมูลบางส่วนของคุณยุ่งเหยิงดังนั้นวิธีที่ดีกว่าอย่างหนึ่งคือเธรดกระบวนการที่ใช้เวลานานจะตรวจสอบเป็นระยะ ถ้ามันถูกขัดจังหวะ มันไม่ได้แตกต่างจากเส้นใยที่ให้ผลผลิตเป็นระยะ ๆ
Evgeni Sergeev

43

ใน Win32 ไฟเบอร์คือเธรดที่ผู้ใช้จัดการ ไฟเบอร์มีสแต็กของตัวเองและตัวชี้คำสั่งของมันเองเป็นต้น แต่ระบบไฟเบอร์ไม่ได้ถูกกำหนดโดย OS: คุณต้องเรียก SwitchToFiber อย่างชัดเจน ในทางตรงกันข้ามเธรดถูกกำหนดเวลาไว้ล่วงหน้าโดยระบบปฏิบัติการ ดังนั้นการพูดแบบไฟเบอร์คือเธรดที่จัดการที่ระดับแอปพลิเคชัน / รันไทม์แทนที่จะเป็นเธรด OS จริง

ผลที่ตามมาก็คือเส้นใยมีราคาถูกกว่าและแอพพลิเคชั่นสามารถควบคุมการจัดตารางเวลาได้มากขึ้น สิ่งนี้อาจสำคัญหากแอปสร้างงานพร้อมกันจำนวนมากและ / หรือต้องการปรับให้เหมาะสมเมื่อทำงาน ตัวอย่างเช่นเซิร์ฟเวอร์ฐานข้อมูลอาจเลือกใช้เส้นใยแทนที่จะเป็นเธรด

(อาจมีประเพณีอื่น ๆ สำหรับคำเดียวกัน; ตามที่ระบุไว้นี่คือคำจำกัดความของ Win32)


37

ก่อนอื่นฉันขอแนะนำให้อ่านคำอธิบายของความแตกต่างระหว่างกระบวนการและเธรดเป็นวัสดุพื้นหลัง

เมื่อคุณอ่านแล้วมันตรงไปตรงมา สามารถนำเธรดไปใช้ได้ในเคอร์เนลในพื้นที่ผู้ใช้หรือทั้งสองอย่างสามารถผสมกันได้ โดยทั่วไปแล้วเส้นใยจะถูกนำไปใช้ในพื้นที่ของผู้ใช้

  • โดยทั่วไปสิ่งที่เรียกว่าเธรดคือเธรดของการดำเนินการที่ใช้ในเคอร์เนล: สิ่งที่เรียกว่าเธรดเคอร์เนล การกำหนดตารางเวลาของเคอร์เนลเธรดได้รับการจัดการโดยเคอร์เนลโดยเฉพาะแม้ว่าเธรดเคอร์เนลสามารถปล่อย CPU โดยสมัครใจโดยนอนถ้ามันต้องการ เคอร์เนลเธรดมีข้อดีที่สามารถใช้การบล็อก I / O และปล่อยให้เคอร์เนลกังวลเกี่ยวกับการจัดกำหนดการ ข้อเสียเปรียบหลักคือการสลับเธรดค่อนข้างช้าเนื่องจากต้องวางกับเคอร์เนล
  • Fibres เป็นเธรดพื้นที่ผู้ใช้ที่มีการจัดการการกำหนดเวลาในพื้นที่ผู้ใช้โดยหนึ่งหรือหลายเคอร์เนลเธรดภายใต้กระบวนการเดียว ทำให้เปลี่ยนไฟเบอร์ได้เร็วมาก หากคุณจัดกลุ่มเส้นใยทั้งหมดที่เข้าถึงชุดข้อมูลที่ใช้ร่วมกันโดยเฉพาะภายใต้บริบทของเคอร์เนลเธรดเดี่ยวและมีการจัดการการกำหนดตารางเวลาโดยเธรดเคอร์เนลเดี่ยวคุณสามารถกำจัดปัญหาการซิงโครไนซ์เนื่องจากไฟเบอร์จะทำงานในอนุกรมได้อย่างมีประสิทธิภาพ ควบคุมการตั้งเวลา การจัดกลุ่มเส้นใยที่เกี่ยวข้องภายใต้เคอร์เนลเธรดเดี่ยวมีความสำคัญเนื่องจากเคอร์เนลเธรดที่พวกเขากำลังทำงานอยู่สามารถถูก pre-empted โดยเคอร์เนล ประเด็นนี้ไม่ชัดเจนในคำตอบอื่น ๆ อีกมากมาย นอกจากนี้หากคุณใช้การบล็อก I / O ในไฟเบอร์เคอร์เนลเธรดทั้งหมดจะเป็นส่วนหนึ่งของบล็อกรวมถึงเส้นใยทั้งหมดที่เป็นส่วนหนึ่งของเคอร์เนลเธรดนั้น

ในส่วน 11.4 "กระบวนการและเธรดใน Windows Vista" ในระบบปฏิบัติการสมัยใหม่ความคิดเห็น Tanenbaum:

แม้ว่าเส้นใยถูกกำหนดเวลาไว้พร้อมกันหากมีหลายเธรดการกำหนดเวลาเส้นใยจำเป็นต้องมีการซิงโครไนซ์อย่างระมัดระวังจำนวนมากเพื่อให้แน่ใจว่าเส้นใยจะไม่รบกวนซึ่งกันและกัน เพื่อลดความซับซ้อนของการโต้ตอบระหว่างเธรดและเส้นใยมันมักจะมีประโยชน์ในการสร้างเธรดจำนวนมากเท่าที่มีตัวประมวลผลเพื่อเรียกใช้และทำให้เธรดแต่ละเธรดทำงานบนชุดตัวประมวลผลที่มีอยู่ที่แตกต่างกัน แต่ละเธรดสามารถเรียกใช้ชุดย่อยเฉพาะของเส้นใยสร้างความสัมพันธ์แบบหนึ่งต่อกลุ่มระหว่างเธรดและไฟเบอร์ซึ่งทำให้การซิงโครไนซ์ง่ายขึ้น ถึงกระนั้นก็ยังมีปัญหามากมายกับเส้นใย ห้องสมุด Win32 ส่วนใหญ่นั้นไม่ทราบถึงเส้นใยและแอปพลิเคชันที่พยายามใช้ไฟเบอร์ราวกับว่าเป็นเธรดจะพบกับความล้มเหลวหลายอย่าง เคอร์เนลไม่มีความรู้เกี่ยวกับเส้นใยและเมื่อไฟเบอร์เข้าสู่เคอร์เนลเธรดที่กำลังดำเนินการอาจปิดกั้นและเคอร์เนลจะกำหนดเวลาเธรดโดยพลการบนโปรเซสเซอร์ทำให้ไม่สามารถใช้งานเส้นใยอื่นได้ ด้วยเหตุผลเหล่านี้เส้นใยจึงไม่ค่อยถูกใช้ยกเว้นเมื่อทำการย้ายรหัสจากระบบอื่นที่ต้องการฟังก์ชันที่จัดทำโดยเส้นใยอย่างชัดเจน


4
นี่คือคำตอบที่สมบูรณ์ที่สุด
Bernard

12

โปรดทราบว่านอกเหนือจากเธรดและไฟเบอร์ Windows 7 ยังแนะนำการตั้งเวลาโหมดผู้ใช้ :

User-mode scheduling (UMS) เป็นกลไกที่มีน้ำหนักเบาที่แอพพลิเคชั่นสามารถใช้ในการกำหนดตารางเวลาเธรดของตนเอง แอปพลิเคชันสามารถสลับไปมาระหว่างเธรด UMS ในโหมดผู้ใช้โดยไม่ต้องเกี่ยวข้องกับตัวกำหนดตารางระบบและควบคุมการประมวลผลอีกครั้งหากบล็อกเธรด UMS ในเคอร์เนล เธรด UMS นั้นแตกต่างจากเส้นใยซึ่งแต่ละเธรด UMS จะมีบริบทเธรดของตัวเองแทนการแชร์บริบทเธรดของเธรดเดี่ยว ความสามารถในการสลับระหว่างเธรดในโหมดผู้ใช้ทำให้ UMS มีประสิทธิภาพมากกว่าเธรดพูลสำหรับการจัดการไอเท็มงานระยะสั้นจำนวนมากที่ต้องใช้การเรียกระบบน้อย

ข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อเส้นใยและ UMS สามารถใช้ได้โดยการเฝ้าดูเดฟ Probert: ใน Windows 7 - ผู้ใช้โหมดตารางเวลา (UMS)


7

เธรดถูกกำหนดเวลาโดยระบบปฏิบัติการ (pre-emptive) เธรดอาจถูกหยุดหรือทำงานต่อได้ตลอดเวลาโดยระบบปฏิบัติการ แต่เส้นใยจะจัดการตัวเองมากขึ้นหรือน้อยลง (ร่วมมือกัน) และให้ผลซึ่งกันและกัน นั่นคือโปรแกรมเมอร์ควบคุมเมื่อเส้นใยทำการประมวลผลของพวกเขาและเมื่อการประมวลผลที่สลับไปยังเส้นใยอื่น


7

โดยทั่วไปเธรดอาศัยเคอร์เนลเพื่อขัดจังหวะเธรดหรือเธรดอื่นสามารถรัน (ซึ่งเป็นที่รู้จักกันดีในชื่อมัลติทาสกิ้งแบบ pre-emptive) ในขณะที่เส้นใยใช้มัลติทาสก์แบบร่วมมือทำงานซึ่งมันเป็นไฟเบอร์เองที่ยอมแพ้เวลาของมัน เส้นใยอื่นสามารถวิ่งได้

ลิงก์ที่มีประโยชน์บางคำอธิบายดีกว่าที่ฉันคิดไว้คือ:


7

ตอนแรกเธรดถูกสร้างขึ้นเป็นกระบวนการที่มีน้ำหนักเบา ในทำนองเดียวกันเส้นใยเป็นด้ายที่มีน้ำหนักเบาอาศัย (แบบง่าย) บนเส้นใยของตัวเองเพื่อกำหนดเวลาซึ่งกันและกันโดยการควบคุมผลผลิต

ฉันเดาว่าขั้นตอนต่อไปจะเป็นเส้นที่คุณต้องส่งสัญญาณทุกครั้งที่คุณต้องการให้พวกเขาทำตามคำสั่ง (ไม่เหมือนกับลูกชาย 5yo ของฉัน :-) ในสมัยก่อน (และแม้กระทั่งตอนนี้ในบางแพลตฟอร์มที่ฝังตัว), เธรดทั้งหมดเป็นเส้นใย, ไม่มีการปล่อยล่วงหน้าและคุณต้องเขียนเธรดของคุณเพื่อให้ทำงานได้ดี


3

คำจำกัดความของไฟเบอร์ Win32 เป็นคำจำกัดความของ "Green Thread" ซึ่งก่อตั้งขึ้นที่ Sun Microsystems ไม่จำเป็นต้องสิ้นเปลืองไฟเบอร์คำบนเธรดบางชนิดเช่นเธรดที่ดำเนินการในพื้นที่ผู้ใช้ภายใต้การควบคุมโค้ดผู้ใช้ / เธรดไลบรารี

เพื่อชี้แจงข้อโต้แย้งดูที่ความคิดเห็นต่อไปนี้:

  • ด้วย hyper-threading ซีพียูแบบมัลติคอร์สามารถรับหลายเธรดและแจกจ่ายทีละเธรดในแต่ละคอร์
  • Superscalar ไปป์ไลน์ซีพียูยอมรับหนึ่งเธรดสำหรับการดำเนินการและใช้ Instruction Level Parallelism (ILP) เพื่อรันเธรดได้เร็วขึ้น เราอาจสันนิษฐานว่าด้ายหนึ่งเส้นถูกแบ่งเป็นเส้นใยแบบขนานที่ทำงานในท่อแบบขนาน
  • SMT CPU สามารถรับหลายเธรดและเบรกเข้าสู่เส้นใยคำสั่งเพื่อการทำงานแบบขนานบนหลาย ๆ ท่อโดยใช้ท่อได้อย่างมีประสิทธิภาพมากขึ้น

เราควรสมมติว่ากระบวนการทำจากเธรดและเธรดควรทำจากเส้นใย เมื่อใช้ตรรกะในใจการใช้เส้นใยสำหรับเธรดประเภทอื่น ๆ นั้นไม่ถูกต้อง


สิ่งนี้น่าสนใจ
JSON
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.