การทำงานพร้อมกันใน 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 มากขึ้น