บทที่  5  เธรด  Threads บทนำ  Overview ตัวแบบการทำงานแบบหลายเธรด หรือ โมเดล มัลติเธรด  Multithreading Models การทำงานของเธรด  Threading Issues พีเธรด  Pthreads เธรดของวินโดวส์เอ็กซ์พี  Windows XP Threads เธรดของลีนุกซ์  Linux Threads เธรดของจาวา  Java Threads
โปรเซสแบบเธรดเดียวและแบบมัลติเธรด  Single and Multithreaded Processes
ประโยชน์ที่ได้รับ มีการตอบสนองที่รวดเร็ว  Responsiveness มีการแบ่งสรรทรัพยากรในการใช้งาน  Resource Sharing ประหยัด  Economy ก่อให้เกิดประโยชน์ สำหรับโครงสร้างแบบ  MP Utilization of MP Architectures
เธรดระดับผู้ใช้  User Threads การบริหารจัดการเธรดกระทำโดยเธรดไลบารีระดับผู้ใช้ เธรดไลบารี สามเธรดหลัก 1 POSIX Pthreads 2  จาวาเธรด  Java threads 3  วิน  32   เธรด  Win32 threads
เธรดระดับเคอร์แนล  Kernel Threads รองรับการทำงานโดยเคอร์แนล อาทิเช่น วินโดวส์ เอ็กซ์พี หรือ  2000 Windows XP/2000 โซลาริส  Solaris ลินุกซ์  Linux ทรู 64  ยูนิกซ์  Tru64 UNIX แมก โอเอส เอ็กซ์  Mac OS X
ตัวแบบ ( โมเดล )  ในการทำมัลติเธรด  Multithreading Models Many-to-One One-to-One Many-to-Many
Many-to-One เธรดระดับผู้ใช้หลายๆ เธรดถูกแมพเข้ากับเธรดระดับเคอร์แนลเพียงเธรดเดียว อาทิเช่น  โซลาริสกรีนเธรด  Solaris Green Threads จีนูพอร์ทเทเบิลเธรด  GNU Portable Threads
Many-to-One Model
One-to-One เธรดระดับผู้ใช้หนึ่งเธรด แมพกับหนึ่งเคอร์แนลเธรด  อาทิเช่น  วินโดวส์ เอ็นที เอ็กซ์พี และ  2000 Windows NT/XP/2000 ลินุกซ์  Linux โซลาริส ตั้งแต่รุ่นที่  9  เป็นต้นไป  Solaris 9 and later
One-to-one Model
Many-to-Many Model อนุญาตให้ เธรดระดับผู้ใช้หลายเธรดสามารถแมพกับเคอร์แนลเธรดหลายเธรด  อนุญาตให้ระบบปฏิบัติการ สามารถสร้างเธรดระดับเคอร์แนลได้ตามจำนวนที่ต้องการ โซลาริสเริ่มใช้ตัวแบบนี้ตั้งแต่รุ่นที่  9  วินโดวส์ เอ็นที  2000  ใช้แพ็กเกจ เธรดไฟเบอร์  ThreadFiber  package
Many-to-Many Model
ตัวแบบแบบสองระดับ  Two-level Model มีความแตกต่างจาก  M:M  ยกเว้นความสามารถในการเชื่อมระหว่างเธรดระดับผู้ใช้กับเธรดระดับเคอร์แนลเข้าไว้ด้วยกัน  อาทิเช่น  IRIX HP-UX Tru64 UNIX Solaris 8  และรุ่นถัดไป
Two-level Model
การทำงานของเธรด  Threading Issues หมายถึงการทำงานการเรียกระบบด้วย  fork()  และ  exec() การยกเลิกเธรด  การจัดการกับอานัติสัญญาณต่างๆ  เธรดพูล หรือแหล่งรวมเธรด  ข้อมูลเฉพาะสำหรับเธรด  การจัดลำดับงานการกระตุ้นเพื่อให้เกิดการทำงาน
Semantics of fork() and exec() Does  fork()  duplicate only the calling thread or all threads?
การยกเลิกเธรด  Thread Cancellation การสิ้นสุดการทำงานของเธรดก่อนที่จะทำงานเสร็จสิ้น  การยกเลิกแบบไม่สัมพันธ์  Asynchronous cancellation   ทำให้เธรดนั้นสิ้นสุดการทำงานโดยทันทีทันใด  การยกเลิกแบบเชิงสัมพันธ์  Deferred cancellation   อนุญาตให้เธรดที่ต้องการยกเลิก ได้รับการตรวจสอบถึงความเหมาะสมว่ายามารถยกเลิฏได้หรือไม่ก่อน
การจัดการอานัติสัญญาณ  Signal Handling ระบบอานัติสัญญาณถูกนำมาใช้ในระบบยูนิกซ์ เพื่อแจ้งเตือนโปรเซสว่าเกิดเหตุการใดๆ ขึ้น  การจัดการแบบเดี่ยว  A  signal handler   ใช้เพื่อการอานัติสัญญาณโปรเซส 1.  อานัติสัญญาณถูกสร้างขึ้นโดยเหตุการณ์ต่างๆ  2.  อานัติสัญญาณจะถูกส่งให้กับโปรเซส 3.  อานัติสัญญาณได้รับการบริหารจัดการ การเลือกสรร การส่งอานัติสัญญาณไปยังเธรด เพื่อการรับรู้อานัติสัญญาณ การส่งอานัติสัญญาณไปยังทุกๆ เธรดในโปรเซส การส่งอานัติสัญญาณไปยังเธรดเพื่อการทำงานที่ถูกต้องในโปรเซส การกำหนดเธรดคุณสมบัติเฉพาะหนึ่งรับทุกๆ อานัติสัญญาณเพื่อโปรเซส
แหล่งรวมเธรด หรือเธรดพูล  Thread Pools สร้างเธรดขึ้นจำนวนหนึ่งเก็บไว้ในเธรดพูลเมื่อเธรดนั้นต้องรอคอยในการทำงาน ประโยชน์  แบ่งงานบริการออกเป็นส่วนย่อยๆ ทำให้สามารถทำงานได้รวดเร็ว โดยเธรดที่มีอยู่เดิมสามารถสร้างเธรดใหม่ขึ้นได้ อนุญาตให้จำนวนของเธรดในแอพพลิเคชั่นสามารถกำหนดให้ผูกพันกับขนาดของแหล่งรวมเธรดหรือเธรดพูลได้
ข้อมูลเฉพาะของเธรด  Thread Specific Data อนุญาตให้เธรดแต่ละเธรดสามารถมีสำเนาข้อมูลเป็นของตนเอง  มีประโยชน์มากเมื่อ คุณไม่มีสิทธิ์ในการควบคุมโปรเซสในการสร้างเธรด  ( อาทิ เมื่อใช้เธรดพูล )
การจัดลำดับงานการกระตุ้นเพื่อให้เกิดการทำงาน Scheduler Activations ทั้ง  M:M  และ ทั้งตัวแบบสองระดับ จำเป็นต้องมีการสื่อสาร เพื่อการบริหารจัดการจำนวนของเธรดระดับเคอร์แนลที่มีอยู่ในแอพพลิเคชั่น  ตัวจัดลำดับงานการกระตุ้นเพื่อให้เกิดการทำงานรองรับการทำงานแบบ เรียกขึ้น  upcalls  หมายถึงกลไกการสื่อสารจากเคอร์แนลไปยังเธรดไลบรารี่ การสื่อสารนี้อนุญาตให้แอพพลิเคชั่นสามารถบริหารจัดการเธรดระดับเคอร์แนลให้มีจำนวนที่เหมาะสมถูกต้อง
Pthreads มาตรฐาน  POSIX (IEEE 1003.1c) API  สำหรับการสร้างเธรด และการทำงานเชิงสัมพันธ์ API  จะกำหนดพฤติกรรมของเธรดไลบรารี่ การนำไปใช้งานขึ้นอยู่กับการพัฒนาไลบรารี่ โดยปกติมีใช้อยู่ใน ระบบปฏิบัติการยูนิกส์  ( โซลาริส ลินุกซ์ แม็กโอเอสเอ็กซ์ )
เธรดของวินโดวส์เอ็กซ์พี  Windows XP Threads ใช้การแมพแบบ  One to One  แต่ละเธรดประกอบไปด้วย  เธรดไอดี  thread id เซ็ตของรีจิสเตอร์  Register set แบ่งระหว่าง แสต็กของผู้ใช้กับของเคอร์แนล  Separate user and kernel stacks พื้นที่การจัดเก็บข้อมูลแบบไพรเวท ( แบบเฉพาะตัว )  Private data storage area เซ็ตของรีจีสเตอร์ แสต็ก และ พื้นที่การจัดเก็บข้อมูลแบบไพรเวท รวมเรียกว่าคอนเท็กซ์หรือสภาพแวดล้อม  context   ของเธรด  โครงสร้างข้อมูลพื้นฐานของเธรด ประกอบด้วย ETHREAD (executive thread block) KTHREAD (kernel thread block) TEB (thread environment block)
เธรดของลีนุกซ์  Linux Threads ในระบบลีนุกซ์อ้างอิงโดยเรียกว่า ทาสค์หรืองาน แทนที่จะเรียกว่า เธรด  การสร้างเธรดสามารถทำได้โดยการเรียกระบบด้วยคำสั่ง  clone() คำสั่ง  clone()  อนุญาตให้ทาสค์ลูกสามารถร่วมใช้พื้นที่แอดเดรสหรือ แอดเดรสสเปซ ของทาสค์ต้นกำเนิด  ( โปรเซส )
เธรดของจาวา  Java Threads เธรดของจาวาถูกบริหารจัดการโดย  JVM Java Virtual Machine  เธรดของจาวาอาจถูกสร้างโดย  การขยายคลาสของเธรด  การใช้อินเตอร์เฟสที่สามารถรันได้
สถานะของเธรดในจาวา  Java Thread States

Operating System Chapter 5

  • 1.
    บทที่ 5 เธรด Threads บทนำ Overview ตัวแบบการทำงานแบบหลายเธรด หรือ โมเดล มัลติเธรด Multithreading Models การทำงานของเธรด Threading Issues พีเธรด Pthreads เธรดของวินโดวส์เอ็กซ์พี Windows XP Threads เธรดของลีนุกซ์ Linux Threads เธรดของจาวา Java Threads
  • 2.
  • 3.
    ประโยชน์ที่ได้รับ มีการตอบสนองที่รวดเร็ว Responsiveness มีการแบ่งสรรทรัพยากรในการใช้งาน Resource Sharing ประหยัด Economy ก่อให้เกิดประโยชน์ สำหรับโครงสร้างแบบ MP Utilization of MP Architectures
  • 4.
    เธรดระดับผู้ใช้ UserThreads การบริหารจัดการเธรดกระทำโดยเธรดไลบารีระดับผู้ใช้ เธรดไลบารี สามเธรดหลัก 1 POSIX Pthreads 2 จาวาเธรด Java threads 3 วิน 32 เธรด Win32 threads
  • 5.
    เธรดระดับเคอร์แนล KernelThreads รองรับการทำงานโดยเคอร์แนล อาทิเช่น วินโดวส์ เอ็กซ์พี หรือ 2000 Windows XP/2000 โซลาริส Solaris ลินุกซ์ Linux ทรู 64 ยูนิกซ์ Tru64 UNIX แมก โอเอส เอ็กซ์ Mac OS X
  • 6.
    ตัวแบบ ( โมเดล) ในการทำมัลติเธรด Multithreading Models Many-to-One One-to-One Many-to-Many
  • 7.
    Many-to-One เธรดระดับผู้ใช้หลายๆ เธรดถูกแมพเข้ากับเธรดระดับเคอร์แนลเพียงเธรดเดียวอาทิเช่น โซลาริสกรีนเธรด Solaris Green Threads จีนูพอร์ทเทเบิลเธรด GNU Portable Threads
  • 8.
  • 9.
    One-to-One เธรดระดับผู้ใช้หนึ่งเธรด แมพกับหนึ่งเคอร์แนลเธรด อาทิเช่น วินโดวส์ เอ็นที เอ็กซ์พี และ 2000 Windows NT/XP/2000 ลินุกซ์ Linux โซลาริส ตั้งแต่รุ่นที่ 9 เป็นต้นไป Solaris 9 and later
  • 10.
  • 11.
    Many-to-Many Model อนุญาตให้เธรดระดับผู้ใช้หลายเธรดสามารถแมพกับเคอร์แนลเธรดหลายเธรด อนุญาตให้ระบบปฏิบัติการ สามารถสร้างเธรดระดับเคอร์แนลได้ตามจำนวนที่ต้องการ โซลาริสเริ่มใช้ตัวแบบนี้ตั้งแต่รุ่นที่ 9 วินโดวส์ เอ็นที 2000 ใช้แพ็กเกจ เธรดไฟเบอร์ ThreadFiber package
  • 12.
  • 13.
    ตัวแบบแบบสองระดับ Two-levelModel มีความแตกต่างจาก M:M ยกเว้นความสามารถในการเชื่อมระหว่างเธรดระดับผู้ใช้กับเธรดระดับเคอร์แนลเข้าไว้ด้วยกัน อาทิเช่น IRIX HP-UX Tru64 UNIX Solaris 8 และรุ่นถัดไป
  • 14.
  • 15.
    การทำงานของเธรด ThreadingIssues หมายถึงการทำงานการเรียกระบบด้วย fork() และ exec() การยกเลิกเธรด การจัดการกับอานัติสัญญาณต่างๆ เธรดพูล หรือแหล่งรวมเธรด ข้อมูลเฉพาะสำหรับเธรด การจัดลำดับงานการกระตุ้นเพื่อให้เกิดการทำงาน
  • 16.
    Semantics of fork()and exec() Does fork() duplicate only the calling thread or all threads?
  • 17.
    การยกเลิกเธรด ThreadCancellation การสิ้นสุดการทำงานของเธรดก่อนที่จะทำงานเสร็จสิ้น การยกเลิกแบบไม่สัมพันธ์ Asynchronous cancellation ทำให้เธรดนั้นสิ้นสุดการทำงานโดยทันทีทันใด การยกเลิกแบบเชิงสัมพันธ์ Deferred cancellation อนุญาตให้เธรดที่ต้องการยกเลิก ได้รับการตรวจสอบถึงความเหมาะสมว่ายามารถยกเลิฏได้หรือไม่ก่อน
  • 18.
    การจัดการอานัติสัญญาณ SignalHandling ระบบอานัติสัญญาณถูกนำมาใช้ในระบบยูนิกซ์ เพื่อแจ้งเตือนโปรเซสว่าเกิดเหตุการใดๆ ขึ้น การจัดการแบบเดี่ยว A signal handler ใช้เพื่อการอานัติสัญญาณโปรเซส 1. อานัติสัญญาณถูกสร้างขึ้นโดยเหตุการณ์ต่างๆ 2. อานัติสัญญาณจะถูกส่งให้กับโปรเซส 3. อานัติสัญญาณได้รับการบริหารจัดการ การเลือกสรร การส่งอานัติสัญญาณไปยังเธรด เพื่อการรับรู้อานัติสัญญาณ การส่งอานัติสัญญาณไปยังทุกๆ เธรดในโปรเซส การส่งอานัติสัญญาณไปยังเธรดเพื่อการทำงานที่ถูกต้องในโปรเซส การกำหนดเธรดคุณสมบัติเฉพาะหนึ่งรับทุกๆ อานัติสัญญาณเพื่อโปรเซส
  • 19.
    แหล่งรวมเธรด หรือเธรดพูล Thread Pools สร้างเธรดขึ้นจำนวนหนึ่งเก็บไว้ในเธรดพูลเมื่อเธรดนั้นต้องรอคอยในการทำงาน ประโยชน์ แบ่งงานบริการออกเป็นส่วนย่อยๆ ทำให้สามารถทำงานได้รวดเร็ว โดยเธรดที่มีอยู่เดิมสามารถสร้างเธรดใหม่ขึ้นได้ อนุญาตให้จำนวนของเธรดในแอพพลิเคชั่นสามารถกำหนดให้ผูกพันกับขนาดของแหล่งรวมเธรดหรือเธรดพูลได้
  • 20.
    ข้อมูลเฉพาะของเธรด ThreadSpecific Data อนุญาตให้เธรดแต่ละเธรดสามารถมีสำเนาข้อมูลเป็นของตนเอง มีประโยชน์มากเมื่อ คุณไม่มีสิทธิ์ในการควบคุมโปรเซสในการสร้างเธรด ( อาทิ เมื่อใช้เธรดพูล )
  • 21.
    การจัดลำดับงานการกระตุ้นเพื่อให้เกิดการทำงาน Scheduler Activationsทั้ง M:M และ ทั้งตัวแบบสองระดับ จำเป็นต้องมีการสื่อสาร เพื่อการบริหารจัดการจำนวนของเธรดระดับเคอร์แนลที่มีอยู่ในแอพพลิเคชั่น ตัวจัดลำดับงานการกระตุ้นเพื่อให้เกิดการทำงานรองรับการทำงานแบบ เรียกขึ้น upcalls หมายถึงกลไกการสื่อสารจากเคอร์แนลไปยังเธรดไลบรารี่ การสื่อสารนี้อนุญาตให้แอพพลิเคชั่นสามารถบริหารจัดการเธรดระดับเคอร์แนลให้มีจำนวนที่เหมาะสมถูกต้อง
  • 22.
    Pthreads มาตรฐาน POSIX (IEEE 1003.1c) API สำหรับการสร้างเธรด และการทำงานเชิงสัมพันธ์ API จะกำหนดพฤติกรรมของเธรดไลบรารี่ การนำไปใช้งานขึ้นอยู่กับการพัฒนาไลบรารี่ โดยปกติมีใช้อยู่ใน ระบบปฏิบัติการยูนิกส์ ( โซลาริส ลินุกซ์ แม็กโอเอสเอ็กซ์ )
  • 23.
    เธรดของวินโดวส์เอ็กซ์พี WindowsXP Threads ใช้การแมพแบบ One to One แต่ละเธรดประกอบไปด้วย เธรดไอดี thread id เซ็ตของรีจิสเตอร์ Register set แบ่งระหว่าง แสต็กของผู้ใช้กับของเคอร์แนล Separate user and kernel stacks พื้นที่การจัดเก็บข้อมูลแบบไพรเวท ( แบบเฉพาะตัว ) Private data storage area เซ็ตของรีจีสเตอร์ แสต็ก และ พื้นที่การจัดเก็บข้อมูลแบบไพรเวท รวมเรียกว่าคอนเท็กซ์หรือสภาพแวดล้อม context ของเธรด โครงสร้างข้อมูลพื้นฐานของเธรด ประกอบด้วย ETHREAD (executive thread block) KTHREAD (kernel thread block) TEB (thread environment block)
  • 24.
    เธรดของลีนุกซ์ LinuxThreads ในระบบลีนุกซ์อ้างอิงโดยเรียกว่า ทาสค์หรืองาน แทนที่จะเรียกว่า เธรด การสร้างเธรดสามารถทำได้โดยการเรียกระบบด้วยคำสั่ง clone() คำสั่ง clone() อนุญาตให้ทาสค์ลูกสามารถร่วมใช้พื้นที่แอดเดรสหรือ แอดเดรสสเปซ ของทาสค์ต้นกำเนิด ( โปรเซส )
  • 25.
    เธรดของจาวา JavaThreads เธรดของจาวาถูกบริหารจัดการโดย JVM Java Virtual Machine เธรดของจาวาอาจถูกสร้างโดย การขยายคลาสของเธรด การใช้อินเตอร์เฟสที่สามารถรันได้
  • 26.

Editor's Notes

  • #2 Chapter 5: Threads Overview Multithreading Models Threading Issues Pthreads Windows XP Threads Linux Threads Java Threads