การทำงานพร้อมกันใน Python - เธรด
โดยทั่วไปอย่างที่เราทราบกันดีว่าด้ายเป็นเส้นที่บิดบางมากซึ่งมักจะเป็นของฝ้ายหรือผ้าไหมและใช้สำหรับตัดเย็บเสื้อผ้าและอื่น ๆ เธรดคำเดียวกันนี้ยังใช้ในโลกของการเขียนโปรแกรมคอมพิวเตอร์ ทีนี้เราจะเชื่อมโยงด้ายที่ใช้เย็บเสื้อผ้ากับด้ายที่ใช้ในการเขียนโปรแกรมคอมพิวเตอร์ได้อย่างไร? บทบาทที่ดำเนินการโดยทั้งสองเธรดมีความคล้ายคลึงกันที่นี่ ในเสื้อผ้าด้ายจะยึดผ้าเข้าด้วยกันและอีกด้านหนึ่งในการเขียนโปรแกรมคอมพิวเตอร์ด้ายจะยึดโปรแกรมคอมพิวเตอร์ไว้และปล่อยให้โปรแกรมดำเนินการตามลำดับหรือการดำเนินการหลายอย่างพร้อมกัน
Threadเป็นหน่วยปฏิบัติการที่เล็กที่สุดในระบบปฏิบัติการ มันไม่ได้อยู่ในโปรแกรม แต่ทำงานภายในโปรแกรม กล่าวอีกนัยหนึ่งเธรดไม่ได้เป็นอิสระจากกันและแชร์โค้ดส่วนข้อมูล ฯลฯ กับเธรดอื่น ๆ เธรดเหล่านี้เรียกอีกอย่างว่ากระบวนการที่มีน้ำหนักเบา
สถานะของเธรด
เพื่อให้เข้าใจถึงการทำงานของเธรดในเชิงลึกเราจำเป็นต้องเรียนรู้เกี่ยวกับวงจรชีวิตของเธรดหรือสถานะเธรดต่างๆ โดยปกติเธรดสามารถมีได้ในห้าสถานะที่แตกต่างกัน สถานะต่างๆดังแสดงด้านล่าง -
กระทู้ใหม่
เธรดใหม่เริ่มวงจรชีวิตในสถานะใหม่ อย่างไรก็ตามในขั้นตอนนี้ยังไม่เริ่มและยังไม่ได้รับการจัดสรรทรัพยากรใด ๆ เราสามารถพูดได้ว่ามันเป็นเพียงตัวอย่างของวัตถุ
รันได้
เมื่อเธรดเกิดใหม่เริ่มต้นเธรดจะรันได้นั่นคือกำลังรอรัน ในสถานะนี้มีทรัพยากรทั้งหมด แต่ตัวกำหนดตารางเวลางานยังไม่ได้กำหนดเวลาให้รัน
วิ่ง
ในสถานะนี้เธรดจะดำเนินการและรันงานซึ่งได้รับเลือกโดยตัวกำหนดตารางเวลางานเพื่อรัน ตอนนี้เธรดสามารถไปที่สถานะตายหรือสถานะไม่สามารถรันได้ / กำลังรอ
ไม่ทำงาน / รอ
ในสถานะนี้เธรดจะหยุดชั่วคราวเนื่องจากกำลังรอการตอบสนองของคำร้องขอ I / O บางอย่างหรือรอให้การดำเนินการของเธรดอื่นเสร็จสิ้น
ตาย
เธรดที่รันได้จะเข้าสู่สถานะสิ้นสุดเมื่อทำงานเสร็จสมบูรณ์หรือถูกยกเลิก
แผนภาพต่อไปนี้แสดงวงจรชีวิตที่สมบูรณ์ของเธรด -
ประเภทของเธรด
ในส่วนนี้เราจะเห็นประเภทต่างๆของเธรด ประเภทมีคำอธิบายด้านล่าง -
เธรดระดับผู้ใช้
นี่คือเธรดที่จัดการโดยผู้ใช้
ในกรณีนี้เคอร์เนลการจัดการเธรดจะไม่ทราบถึงการมีอยู่ของเธรด ไลบรารีเธรดมีรหัสสำหรับการสร้างและทำลายเธรดสำหรับการส่งข้อความและข้อมูลระหว่างเธรดสำหรับการจัดกำหนดการการทำงานของเธรดและสำหรับการบันทึกและกู้คืนบริบทเธรด แอปพลิเคชันเริ่มต้นด้วยเธรดเดียว
ตัวอย่างของเธรดระดับผู้ใช้ ได้แก่ -
- เธรด Java
- เธรด POSIX
ข้อดีของเธรดระดับผู้ใช้
ต่อไปนี้เป็นข้อดีที่แตกต่างกันของเธรดระดับผู้ใช้ -
- การสลับเธรดไม่ต้องการสิทธิ์โหมดเคอร์เนล
- เธรดระดับผู้ใช้สามารถรันบนระบบปฏิบัติการใดก็ได้
- การจัดกำหนดการอาจเป็นแอปพลิเคชันเฉพาะในเธรดระดับผู้ใช้
- เธรดระดับผู้ใช้สร้างและจัดการได้อย่างรวดเร็ว
ข้อเสียของเธรดระดับผู้ใช้
ต่อไปนี้เป็นข้อเสียที่แตกต่างกันของเธรดระดับผู้ใช้ -
- ในระบบปฏิบัติการทั่วไปการเรียกระบบส่วนใหญ่จะบล็อก
- แอปพลิเคชันมัลติเธรดไม่สามารถใช้ประโยชน์จากการประมวลผลหลายขั้นตอนได้
เธรดระดับเคอร์เนล
เธรดที่ถูกจัดการของระบบปฏิบัติการทำงานบนเคอร์เนลซึ่งเป็นแกนหลักของระบบปฏิบัติการ
ในกรณีนี้เคอร์เนลจะจัดการเธรด ไม่มีรหัสการจัดการเธรดในพื้นที่แอปพลิเคชัน เคอร์เนลเธรดได้รับการสนับสนุนโดยตรงจากระบบปฏิบัติการ แอปพลิเคชันใด ๆ สามารถตั้งโปรแกรมให้เป็นแบบมัลติเธรดได้ เธรดทั้งหมดภายในแอปพลิเคชันได้รับการสนับสนุนภายในกระบวนการเดียว
เคอร์เนลจะเก็บรักษาข้อมูลบริบทสำหรับกระบวนการโดยรวมและสำหรับแต่ละเธรดภายในกระบวนการ การตั้งเวลาโดยเคอร์เนลจะทำแบบเธรด เคอร์เนลดำเนินการสร้างเธรดการตั้งเวลาและการจัดการในพื้นที่เคอร์เนล โดยทั่วไปเคอร์เนลเธรดจะสร้างและจัดการได้ช้ากว่าเธรดผู้ใช้ ตัวอย่างของเธรดระดับเคอร์เนล ได้แก่ Windows, Solaris
ข้อดีของหัวข้อระดับเคอร์เนล
ต่อไปนี้เป็นข้อดีที่แตกต่างกันของเธรดระดับเคอร์เนล -
เคอร์เนลสามารถกำหนดเวลาเธรดหลายเธรดจากกระบวนการเดียวกันในหลายกระบวนการได้พร้อมกัน
ถ้าเธรดหนึ่งในกระบวนการถูกบล็อกเคอร์เนลสามารถกำหนดเวลาเธรดอื่นของกระบวนการเดียวกันได้
กิจวัตรของเคอร์เนลเองสามารถเป็นแบบมัลติเธรดได้
ข้อเสียของหัวข้อระดับเคอร์เนล
โดยทั่วไปเคอร์เนลเธรดจะสร้างและจัดการได้ช้ากว่าเธรดผู้ใช้
การถ่ายโอนการควบคุมจากเธรดหนึ่งไปยังอีกเธรดภายในกระบวนการเดียวกันจำเป็นต้องมีการสลับโหมดไปที่เคอร์เนล
บล็อกควบคุมเธรด - TCB
Thread Control Block (TCB) อาจถูกกำหนดให้เป็นโครงสร้างข้อมูลในเคอร์เนลของระบบปฏิบัติการที่มีข้อมูลเกี่ยวกับเธรดเป็นหลัก ข้อมูลเฉพาะเธรดที่จัดเก็บใน TCB จะเน้นข้อมูลสำคัญบางอย่างเกี่ยวกับแต่ละกระบวนการ
พิจารณาประเด็นต่อไปนี้ที่เกี่ยวข้องกับเธรดที่มีอยู่ใน TCB -
Thread identification - เป็นรหัสเธรดเฉพาะ (tid) ที่กำหนดให้กับเธรดใหม่ทุกรายการ
Thread state - มีข้อมูลที่เกี่ยวข้องกับสถานะ (Running, Runnable, Non-Running, Dead) ของเธรด
Program Counter (PC) - ชี้ไปที่คำสั่งโปรแกรมปัจจุบันของเธรด
Register set - ประกอบด้วยค่ารีจิสเตอร์ของเธรดที่กำหนดให้สำหรับการคำนวณ
Stack Pointer- ชี้ไปที่สแต็กของเธรดในกระบวนการ ประกอบด้วยตัวแปรโลคัลภายใต้ขอบเขตของเธรด
Pointer to PCB - มีตัวชี้ไปยังกระบวนการที่สร้างเธรดนั้น
ความสัมพันธ์ระหว่างกระบวนการและเธรด
ในมัลติเธรดกระบวนการและเธรดเป็นคำศัพท์ที่เกี่ยวข้องอย่างใกล้ชิดสองคำโดยมีเป้าหมายเดียวกันเพื่อให้คอมพิวเตอร์สามารถทำสิ่งต่างๆได้มากกว่าหนึ่งอย่างในแต่ละครั้ง กระบวนการสามารถมีเธรดตั้งแต่หนึ่งเธรดขึ้นไป แต่ในทางกลับกันเธรดไม่สามารถมีกระบวนการได้ อย่างไรก็ตามทั้งสองยังคงเป็นหน่วยปฏิบัติการพื้นฐานสองหน่วย โปรแกรมเรียกใช้ชุดคำสั่งเริ่มต้นกระบวนการและเธรดทั้งสองอย่าง
ตารางต่อไปนี้แสดงการเปรียบเทียบระหว่างกระบวนการและเธรด -
กระบวนการ | เกลียว |
---|---|
กระบวนการมีน้ำหนักมากหรือใช้ทรัพยากรมาก | เธรดมีน้ำหนักเบาซึ่งใช้ทรัพยากรน้อยกว่ากระบวนการ |
การสลับกระบวนการต้องการการโต้ตอบกับระบบปฏิบัติการ | การสลับเธรดไม่จำเป็นต้องโต้ตอบกับระบบปฏิบัติการ |
ในสภาพแวดล้อมการประมวลผลที่หลากหลายแต่ละกระบวนการจะรันโค้ดเดียวกัน แต่มีหน่วยความจำและทรัพยากรไฟล์ของตัวเอง | เธรดทั้งหมดสามารถแชร์ไฟล์ที่เปิดชุดเดียวกันกระบวนการย่อย |
หากกระบวนการหนึ่งถูกปิดกั้นจะไม่มีกระบวนการอื่นใดสามารถดำเนินการได้จนกว่ากระบวนการแรกจะถูกบล็อก | ในขณะที่เธรดหนึ่งถูกบล็อกและรอเธรดที่สองในภารกิจเดียวกันสามารถรันได้ |
หลายกระบวนการโดยไม่ใช้เธรดใช้ทรัพยากรมากขึ้น | กระบวนการหลายเธรดใช้ทรัพยากรน้อยลง |
ในหลายกระบวนการแต่ละกระบวนการดำเนินการโดยไม่ขึ้นกับกระบวนการอื่น ๆ | เธรดหนึ่งสามารถอ่านเขียนหรือเปลี่ยนแปลงข้อมูลของเธรดอื่นได้ |
หากจะมีการเปลี่ยนแปลงใด ๆ ในกระบวนการพาเรนต์ก็จะไม่ส่งผลกระทบต่อกระบวนการย่อย | หากมีการเปลี่ยนแปลงใด ๆ ในเธรดหลักก็อาจส่งผลต่อลักษณะการทำงานของเธรดอื่นของกระบวนการนั้น |
ในการสื่อสารกับกระบวนการพี่น้องกระบวนการต่างๆต้องใช้การสื่อสารระหว่างกระบวนการ | เธรดสามารถสื่อสารโดยตรงกับเธรดอื่นของกระบวนการนั้น |
แนวคิดของมัลติเธรด
ดังที่เราได้กล่าวไปแล้วก่อนหน้านี้ว่า Multithreading คือความสามารถของ CPU ในการจัดการการใช้งานระบบปฏิบัติการโดยดำเนินการหลายเธรดพร้อมกัน แนวคิดหลักของมัลติเธรดคือการบรรลุความเท่าเทียมกันโดยแบ่งกระบวนการออกเป็นหลายเธรด พูดง่ายๆก็คือเราสามารถพูดได้ว่ามัลติเธรดเป็นวิธีการทำงานหลายอย่างพร้อมกันโดยใช้แนวคิดของเธรด
สามารถเข้าใจแนวคิดของมัลติเธรดได้ด้วยความช่วยเหลือของตัวอย่างต่อไปนี้
ตัวอย่าง
สมมติว่าเรากำลังเรียกใช้กระบวนการ กระบวนการนี้อาจเป็นการเปิด MS word เพื่อเขียนอะไรบางอย่าง ในกระบวนการดังกล่าวจะมีการกำหนดเธรดหนึ่งเธรดเพื่อเปิด MS word และอีกเธรดหนึ่งจะต้องเขียน ตอนนี้สมมติว่าถ้าเราต้องการแก้ไขบางอย่างก็จะต้องมีเธรดอื่นเพื่อทำงานแก้ไขไปเรื่อย ๆ
แผนภาพต่อไปนี้ช่วยให้เราเข้าใจว่ามีเธรดจำนวนมากในหน่วยความจำอย่างไร -
เราจะเห็นในแผนภาพด้านบนว่าสามารถมีเธรดได้มากกว่าหนึ่งเธรดภายในกระบวนการเดียวโดยทุกเธรดมีชุดรีจิสเตอร์และตัวแปรโลคัลของตัวเอง นอกเหนือจากนั้นเธรดทั้งหมดในกระบวนการแชร์ตัวแปรส่วนกลาง
ข้อดีของมัลติเธรด
ตอนนี้ให้เราดูข้อดีบางประการของมัลติเธรด ข้อดีมีดังนี้ -
Speed of communication - Multithreading ช่วยเพิ่มความเร็วในการคำนวณเนื่องจากแต่ละคอร์หรือโปรเซสเซอร์จัดการเธรดที่แยกจากกันพร้อมกัน
Program remains responsive - ช่วยให้โปรแกรมยังคงตอบสนองได้เนื่องจากเธรดหนึ่งรอสำหรับอินพุตและอีกเธรดหนึ่งรัน GUI ในเวลาเดียวกัน
Access to global variables - ในมัลติเธรดเธรดทั้งหมดของกระบวนการเฉพาะสามารถเข้าถึงตัวแปรโกลบอลและหากมีการเปลี่ยนแปลงใด ๆ ในตัวแปรโกลบอลเธรดอื่น ๆ ก็จะมองเห็นได้เช่นกัน
Utilization of resources - การรันเธรดหลายเธรดในแต่ละโปรแกรมทำให้ใช้ CPU ได้ดีขึ้นและเวลาว่างของ CPU จะน้อยลง
Sharing of data - ไม่มีความต้องการพื้นที่เพิ่มเติมสำหรับแต่ละเธรดเนื่องจากเธรดภายในโปรแกรมสามารถแชร์ข้อมูลเดียวกันได้
จุดด้อยของมัลติเธรด
ตอนนี้ให้เราดูข้อเสียบางประการของการมัลติเธรด ข้อเสียมีดังนี้ -
Not suitable for single processor system - มัลติเธรดพบว่ายากที่จะบรรลุประสิทธิภาพในแง่ของความเร็วในการคำนวณบนระบบโปรเซสเซอร์เดี่ยวเมื่อเทียบกับประสิทธิภาพของระบบมัลติโปรเซสเซอร์
Issue of security - อย่างที่เราทราบกันดีว่าเธรดทั้งหมดในโปรแกรมแชร์ข้อมูลเดียวกันดังนั้นจึงมีปัญหาด้านความปลอดภัยอยู่เสมอเนื่องจากเธรดที่ไม่รู้จักสามารถเปลี่ยนแปลงข้อมูลได้
Increase in complexity - มัลติเธรดสามารถเพิ่มความซับซ้อนของโปรแกรมและการดีบักจะกลายเป็นเรื่องยาก
Lead to deadlock state - มัลติเธรดสามารถนำโปรแกรมไปสู่ความเสี่ยงที่อาจเข้าสู่สภาวะชะงักงัน
Synchronization required- ต้องมีการซิงโครไนซ์เพื่อหลีกเลี่ยงการกีดกันซึ่งกันและกัน สิ่งนี้นำไปสู่การใช้หน่วยความจำและ CPU มากขึ้น