ความแตกต่างระหว่างเธรดและไฟเบอร์คืออะไร? ฉันเคยได้ยินเรื่องเส้นใยจากทับทิมและฉันอ่านแล้วได้ยินว่ามันมีอยู่ในภาษาอื่นบางคนสามารถอธิบายให้ฉันได้ง่ายๆว่าอะไรคือความแตกต่างระหว่างเธรดและไฟเบอร์
ความแตกต่างระหว่างเธรดและไฟเบอร์คืออะไร? ฉันเคยได้ยินเรื่องเส้นใยจากทับทิมและฉันอ่านแล้วได้ยินว่ามันมีอยู่ในภาษาอื่นบางคนสามารถอธิบายให้ฉันได้ง่ายๆว่าอะไรคือความแตกต่างระหว่างเธรดและไฟเบอร์
คำตอบ:
ในแง่ที่ง่ายที่สุดเธรดมักถูกพิจารณาว่าเป็นสิ่งที่ยึดเอาเสียก่อน (แม้ว่าสิ่งนี้อาจไม่เป็นจริงขึ้นอยู่กับระบบปฏิบัติการ) ในขณะที่เส้นใยถูกพิจารณาว่าเป็นเส้นใยที่มีน้ำหนักเบา ทั้งคู่เป็นเส้นทางการดำเนินการแยกต่างหากสำหรับแอปพลิเคชันของคุณ
ด้วยเธรด: เส้นทางการดำเนินการปัจจุบันอาจถูกขัดจังหวะหรือยึดเอาไว้ได้ตลอดเวลา (หมายเหตุ: คำสั่งนี้เป็นลักษณะทั่วไปและอาจไม่ถือเป็นจริงเสมอขึ้นอยู่กับ OS / เธรดแพ็คเกจ / ฯลฯ ) ซึ่งหมายความว่าสำหรับเธรดความสมบูรณ์ของข้อมูลเป็นปัญหาใหญ่เนื่องจากเธรดหนึ่งอาจหยุดทำงานในระหว่างการอัปเดตกลุ่มข้อมูลทำให้ความสมบูรณ์ของข้อมูลอยู่ในสถานะที่ไม่ดีหรือไม่สมบูรณ์ นี่หมายความว่าระบบปฏิบัติการสามารถใช้ประโยชน์จาก CPU และแกนประมวลผลหลายคอร์ได้ด้วยการรันเธรดมากกว่าหนึ่งเธรดในเวลาเดียวกันและปล่อยให้มันขึ้นกับนักพัฒนาเพื่อป้องกันการเข้าถึงข้อมูล
ด้วย Fibre: เส้นทางการประมวลผลปัจจุบันจะถูกขัดจังหวะเมื่อไฟเบอร์ให้การประมวลผลเท่านั้น (หมายเหตุเดียวกันกับด้านบน) ซึ่งหมายความว่าเส้นใยจะเริ่มและหยุดในสถานที่ที่กำหนดไว้อย่างดีเสมอดังนั้นความสมบูรณ์ของข้อมูลจึงเป็นปัญหาน้อยกว่ามาก นอกจากนี้เนื่องจากไฟเบอร์ถูกจัดการในพื้นที่ผู้ใช้บ่อยครั้งจึงไม่จำเป็นต้องทำการเปลี่ยนบริบทที่มีราคาแพงและการเปลี่ยนสถานะของ CPU ทำให้การเปลี่ยนจากไฟเบอร์หนึ่งไปสู่ประสิทธิภาพที่สูงขึ้น ในทางกลับกันเนื่องจากไม่มีเส้นใยสองชนิดที่สามารถทำงานได้ในเวลาเดียวกันการใช้เส้นใยเพียงอย่างเดียวจะไม่ใช้ประโยชน์จาก CPU หลายตัวหรือหลายแกน CPU
เธรดใช้การกำหนดตารางเวลาแบบจองล่วงหน้าในขณะที่เส้นใยใช้การกำหนดเวลาแบบร่วมมือ
ด้วยเธรดการควบคุมการไหลสามารถถูกขัดจังหวะได้ตลอดเวลาและเธรดอื่นสามารถใช้แทน ด้วยโปรเซสเซอร์หลายตัวคุณสามารถมีหลายเธรดที่ทำงานพร้อมกัน ( มัลติเธรดพร้อมกันหรือ SMT) เป็นผลให้คุณจะต้องมีมากระมัดระวังเกี่ยวกับการเข้าถึงข้อมูลพร้อมกันและปกป้องข้อมูลของคุณด้วย mutexes, semaphores ตัวแปรสภาพและอื่น ๆ มันมักจะเป็นเรื่องยากมากที่จะได้รับสิทธิ
yield()
ด้วยใยอาหารควบคุมเฉพาะสวิทช์เมื่อคุณบอกว่ามันไปโดยปกติจะมีการเรียกใช้ฟังก์ชันที่ชื่อว่าสิ่งที่ต้องการ ทำให้การเข้าถึงข้อมูลพร้อมกันง่ายขึ้นเนื่องจากคุณไม่ต้องกังวลเกี่ยวกับ atomicity ของโครงสร้างข้อมูลหรือ mutexes ตราบใดที่คุณไม่ยอมแพ้ก็ไม่มีอันตรายจากการถูกจองและมีเส้นใยอื่นพยายามอ่านหรือแก้ไขข้อมูลที่คุณทำงานด้วย อย่างไรก็ตามหากเส้นใยของคุณเข้าสู่วงวนไม่สิ้นสุดไม่มีเส้นใยอื่นใดที่สามารถวิ่งได้เนื่องจากคุณไม่ได้ให้ผลผลิต
นอกจากนี้คุณยังสามารถผสมเธรดและเส้นใยซึ่งก่อให้เกิดปัญหาทั้งสองอย่าง ไม่แนะนำ แต่บางครั้งอาจเป็นสิ่งที่ถูกต้องถ้าทำอย่างระมัดระวัง
ใน Win32 ไฟเบอร์คือเธรดที่ผู้ใช้จัดการ ไฟเบอร์มีสแต็กของตัวเองและตัวชี้คำสั่งของมันเองเป็นต้น แต่ระบบไฟเบอร์ไม่ได้ถูกกำหนดโดย OS: คุณต้องเรียก SwitchToFiber อย่างชัดเจน ในทางตรงกันข้ามเธรดถูกกำหนดเวลาไว้ล่วงหน้าโดยระบบปฏิบัติการ ดังนั้นการพูดแบบไฟเบอร์คือเธรดที่จัดการที่ระดับแอปพลิเคชัน / รันไทม์แทนที่จะเป็นเธรด OS จริง
ผลที่ตามมาก็คือเส้นใยมีราคาถูกกว่าและแอพพลิเคชั่นสามารถควบคุมการจัดตารางเวลาได้มากขึ้น สิ่งนี้อาจสำคัญหากแอปสร้างงานพร้อมกันจำนวนมากและ / หรือต้องการปรับให้เหมาะสมเมื่อทำงาน ตัวอย่างเช่นเซิร์ฟเวอร์ฐานข้อมูลอาจเลือกใช้เส้นใยแทนที่จะเป็นเธรด
(อาจมีประเพณีอื่น ๆ สำหรับคำเดียวกัน; ตามที่ระบุไว้นี่คือคำจำกัดความของ Win32)
ก่อนอื่นฉันขอแนะนำให้อ่านคำอธิบายของความแตกต่างระหว่างกระบวนการและเธรดเป็นวัสดุพื้นหลัง
เมื่อคุณอ่านแล้วมันตรงไปตรงมา สามารถนำเธรดไปใช้ได้ในเคอร์เนลในพื้นที่ผู้ใช้หรือทั้งสองอย่างสามารถผสมกันได้ โดยทั่วไปแล้วเส้นใยจะถูกนำไปใช้ในพื้นที่ของผู้ใช้
ในส่วน 11.4 "กระบวนการและเธรดใน Windows Vista" ในระบบปฏิบัติการสมัยใหม่ความคิดเห็น Tanenbaum:
แม้ว่าเส้นใยถูกกำหนดเวลาไว้พร้อมกันหากมีหลายเธรดการกำหนดเวลาเส้นใยจำเป็นต้องมีการซิงโครไนซ์อย่างระมัดระวังจำนวนมากเพื่อให้แน่ใจว่าเส้นใยจะไม่รบกวนซึ่งกันและกัน เพื่อลดความซับซ้อนของการโต้ตอบระหว่างเธรดและเส้นใยมันมักจะมีประโยชน์ในการสร้างเธรดจำนวนมากเท่าที่มีตัวประมวลผลเพื่อเรียกใช้และทำให้เธรดแต่ละเธรดทำงานบนชุดตัวประมวลผลที่มีอยู่ที่แตกต่างกัน แต่ละเธรดสามารถเรียกใช้ชุดย่อยเฉพาะของเส้นใยสร้างความสัมพันธ์แบบหนึ่งต่อกลุ่มระหว่างเธรดและไฟเบอร์ซึ่งทำให้การซิงโครไนซ์ง่ายขึ้น ถึงกระนั้นก็ยังมีปัญหามากมายกับเส้นใย ห้องสมุด Win32 ส่วนใหญ่นั้นไม่ทราบถึงเส้นใยและแอปพลิเคชันที่พยายามใช้ไฟเบอร์ราวกับว่าเป็นเธรดจะพบกับความล้มเหลวหลายอย่าง เคอร์เนลไม่มีความรู้เกี่ยวกับเส้นใยและเมื่อไฟเบอร์เข้าสู่เคอร์เนลเธรดที่กำลังดำเนินการอาจปิดกั้นและเคอร์เนลจะกำหนดเวลาเธรดโดยพลการบนโปรเซสเซอร์ทำให้ไม่สามารถใช้งานเส้นใยอื่นได้ ด้วยเหตุผลเหล่านี้เส้นใยจึงไม่ค่อยถูกใช้ยกเว้นเมื่อทำการย้ายรหัสจากระบบอื่นที่ต้องการฟังก์ชันที่จัดทำโดยเส้นใยอย่างชัดเจน
โปรดทราบว่านอกเหนือจากเธรดและไฟเบอร์ Windows 7 ยังแนะนำการตั้งเวลาโหมดผู้ใช้ :
User-mode scheduling (UMS) เป็นกลไกที่มีน้ำหนักเบาที่แอพพลิเคชั่นสามารถใช้ในการกำหนดตารางเวลาเธรดของตนเอง แอปพลิเคชันสามารถสลับไปมาระหว่างเธรด UMS ในโหมดผู้ใช้โดยไม่ต้องเกี่ยวข้องกับตัวกำหนดตารางระบบและควบคุมการประมวลผลอีกครั้งหากบล็อกเธรด UMS ในเคอร์เนล เธรด UMS นั้นแตกต่างจากเส้นใยซึ่งแต่ละเธรด UMS จะมีบริบทเธรดของตัวเองแทนการแชร์บริบทเธรดของเธรดเดี่ยว ความสามารถในการสลับระหว่างเธรดในโหมดผู้ใช้ทำให้ UMS มีประสิทธิภาพมากกว่าเธรดพูลสำหรับการจัดการไอเท็มงานระยะสั้นจำนวนมากที่ต้องใช้การเรียกระบบน้อย
ข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อเส้นใยและ UMS สามารถใช้ได้โดยการเฝ้าดูเดฟ Probert: ใน Windows 7 - ผู้ใช้โหมดตารางเวลา (UMS)
เธรดถูกกำหนดเวลาโดยระบบปฏิบัติการ (pre-emptive) เธรดอาจถูกหยุดหรือทำงานต่อได้ตลอดเวลาโดยระบบปฏิบัติการ แต่เส้นใยจะจัดการตัวเองมากขึ้นหรือน้อยลง (ร่วมมือกัน) และให้ผลซึ่งกันและกัน นั่นคือโปรแกรมเมอร์ควบคุมเมื่อเส้นใยทำการประมวลผลของพวกเขาและเมื่อการประมวลผลที่สลับไปยังเส้นใยอื่น
โดยทั่วไปเธรดอาศัยเคอร์เนลเพื่อขัดจังหวะเธรดหรือเธรดอื่นสามารถรัน (ซึ่งเป็นที่รู้จักกันดีในชื่อมัลติทาสกิ้งแบบ pre-emptive) ในขณะที่เส้นใยใช้มัลติทาสก์แบบร่วมมือทำงานซึ่งมันเป็นไฟเบอร์เองที่ยอมแพ้เวลาของมัน เส้นใยอื่นสามารถวิ่งได้
ลิงก์ที่มีประโยชน์บางคำอธิบายดีกว่าที่ฉันคิดไว้คือ:
ตอนแรกเธรดถูกสร้างขึ้นเป็นกระบวนการที่มีน้ำหนักเบา ในทำนองเดียวกันเส้นใยเป็นด้ายที่มีน้ำหนักเบาอาศัย (แบบง่าย) บนเส้นใยของตัวเองเพื่อกำหนดเวลาซึ่งกันและกันโดยการควบคุมผลผลิต
ฉันเดาว่าขั้นตอนต่อไปจะเป็นเส้นที่คุณต้องส่งสัญญาณทุกครั้งที่คุณต้องการให้พวกเขาทำตามคำสั่ง (ไม่เหมือนกับลูกชาย 5yo ของฉัน :-) ในสมัยก่อน (และแม้กระทั่งตอนนี้ในบางแพลตฟอร์มที่ฝังตัว), เธรดทั้งหมดเป็นเส้นใย, ไม่มีการปล่อยล่วงหน้าและคุณต้องเขียนเธรดของคุณเพื่อให้ทำงานได้ดี
คำจำกัดความของไฟเบอร์ Win32 เป็นคำจำกัดความของ "Green Thread" ซึ่งก่อตั้งขึ้นที่ Sun Microsystems ไม่จำเป็นต้องสิ้นเปลืองไฟเบอร์คำบนเธรดบางชนิดเช่นเธรดที่ดำเนินการในพื้นที่ผู้ใช้ภายใต้การควบคุมโค้ดผู้ใช้ / เธรดไลบรารี
เพื่อชี้แจงข้อโต้แย้งดูที่ความคิดเห็นต่อไปนี้:
เราควรสมมติว่ากระบวนการทำจากเธรดและเธรดควรทำจากเส้นใย เมื่อใช้ตรรกะในใจการใช้เส้นใยสำหรับเธรดประเภทอื่น ๆ นั้นไม่ถูกต้อง