เทรด (Threads)
สารบัญ :: #1 :: #2 :: #3 :: #4 :: #5 :: #6 :: #7 :: #8 :: #9 :: #10 :: #11 :: #12 :: Linux ::
เทรด

สาระการเรียนรู้
1. ความหมายของ Threads
2. Multithreading Models
3. Threading Issues
4. Pthreads

จุดประสงค์การสอน
1. เข้าใจความหมายของ Threads
2. สามารถเขียนแผนภาพแสดง Singlethread และ Multithread ได้
3. เข้าใจความหมายของ Multithreading Models
4. สามารถเขียนแผนภาพแสดง Multithreading models แต่ละแบบได้
5. เข้าใจความหมายของ Threading Issues
6. เข้าใจความหมายของ Pthreads

แนะนำบทเรียน
ปัจจุบันการประมวลผลมีความซับซ้อนมาก เครื่องคอมพิวเตอร์สามารถทำได้หลายงานพร้อมกัน ซึ่งเรียกว่า multiprogramming เช่น ดูหนัง ฟังเพลง และพิมพ์งานไปพร้อมกัน การเปิดเว็บเพจ (webpage) หน้าหนึ่งอาจเรียกใช้ภาพ เสียง คลิ๊ป และโปรแกรมมากมายขึ้นมาทำงาน เช่น เปิดเว็บไซต์ www.sanook.com แล้วใช้คำสั่ง DOS>netstat -na ก็จะพบว่าเครื่องคอมพิวเตอร์ของเรา ได้ติดต่อกับเครื่องบริการหลายเครื่อง เพื่อให้ได้ข้อมูลครบถ้วนสำหรับแสดงเว็บเพจหน้าหนึ่ง แต่ละ port ที่ถูกเปิดการเชื่อมต่อก็จะมีกิจกรรมหลายเทรดที่ต้องทำงานไปพร้อมกัน
   อาจนึกถึงเกม sim เช่น Starcraft ที่เราควบคุมกองทัพ ให้รถขุดทอง ทหาร และฐานทัพทำงานไปพร้อมกัน ซึ่งแน่นอนว่าไม่ใช่โปรเซสเดียว และไม่ใช่เทรดเดียว แต่เราสร้างหลายโปรเซส และมีหลายเทรดในแต่ละโปรเซส เพื่อให้ทั้งหมดบรรลุเป้าหมายของการทำงาน ตามการควบคุมของผู้เล่นเกม

บทนำ ในอดีตการประมวลผลเป็นแบบ single thread ที่ CPU ถูกครอบครองโดย process ครั้งละ 1 process เท่านั้น แต่ปัจจุบันระบบปฏิบัติการยอมให้เป็นระบบ Multithreaded ซึ่งในแต่ละระบบปฏิบัติการมีรูปแบบแตกต่างกันไปเช่น Java, Windows, Linux หรือ Unix ในบางครั้งเราเรียก thread ว่า LWP (Light Weight Process) ซึ่งเป็นความสามารถพื้นฐานของ CPU ในการจัดสรร Thread ID, Program counter, Register set และ Stack ให้กับทุก ๆ Thread ส่วนในอดีตเราจะเรียกว่า Heavy weight process เพราะเป็นแบบ Single thread of control
4.1 ความหมายของ Threads
Thread แปลว่า ด้าย
Thread คือ ส่วนประกอบย่อยของโปรเซส ถ้า thread ที่เป็นส่วนประกอบย่อยจะเรียกว่า Lightweight process(LWP) แต่ถ้าโปรเซสดั่งเดิมที่มีการควบคุมเพียง 1 thread แสดงว่าทำงานได้เพียง 1 งานจะเรียกว่า Heavyweight process
โดยปกติ Process ที่มี 1 thread จะเรียกว่า Single thread แต่ถ้า 1 process มีหลาย thread จะเรียกว่า Multithread เพราะ ใน Process หนึ่งอาจมีได้หลาย Thread เช่น Web browser 1 หน้า อาจมีทั้งการ download ข้อมูลพร้อมกับการแสดง text แสดงรูปภาพ หรือ java มาแสดงในหน้าเดียวกัน
Thread มี 2 ส่วนที่สัมพันธ์กัน
1. User thread ง่ายที่จะถูกสร้าง และอาจถูกยกเลิกก่อนเข้า kernel thread ได้
2. Kernel thread รองรับ user thread และปฏิบัติงาน
แต่ละ Thread ประกอบไปด้วย
1. Thread ID หมายเลข Thread ใน process
2. Program counter ใช้นับคำสั่งที่ประมวลผลอย่างเป็นลำดับ
3. Register set ใช้เก็บค่าที่ทำงานอยู่
4. Stack ใช้เก็บประวัติการประมวลผล
4.2 Multithreading Models
โปรแกรมในปัจจุบันออกแบบให้ทำงานแบบ Multithread เช่น web browser ซึ่งควบคุมรูปภาพ การดึงข้อมูลจากเครือข่าย หรือ Word ที่แสดงภาพ ในขณะที่รอรับคำสั่งจากแป้นพิมพ์ และตรวจสอบไวยกรณ์ เป็นต้น
1. Many-to-one model
หมายถึง Kernel thread 1 หน่วย กับ User thread หลายหน่วย เป็นการออกแบบที่จะยอมให้เพียง thread เดียวที่เข้าถึง kernel ในกรณีที่ thread ไป block system call จะทำให้ process ทั้งหมดถูก block ไปด้วย โดยโมเดลนี้ยอมให้สร้าง user thread ได้ตามต้องการ แต่ไม่สามารถประมวลผลได้พร้อมกัน เพราะยอมให้เข้าใช้ kernel thread ได้ครั้งละ thread เท่านั้น
2. One-to-one model
หมายถึง Kernel thread 1 หน่วย กับ User thread 1 หน่วย ซึ่งระบบปฏิบัติการจะยอมให้ thread อื่นประมวลผลได้เป็นระบบขนาน ที่ทำงานแบบมัลติโปรเซสเซอร์ มีการใช้หลักการนี้อยู่ในระบบปฏิบัติการ Windows ในปัจจุบัน โดยโมเดลนี้ต้องไม่ยอมให้สร้าง user thread มากเกินไป
3. Many-to-many model
หมายถึง โมเดลที่ลดข้อจำกัดของ 2 แบบแรก ผู้ใช้สามารถสร้าง user thread เท่าที่จำเป็น และสัมพันธ์กับ kernel thread ที่รับการทำงานแบบขนานในแบบมัลติโปรเซสเซอร์ เมื่อมี thread ที่ block system call ทาง kernel จะจัดเวลาให้ thread อื่นเข้ามาประมวลผลก่อนได้
    ข้อได้เปรียบ หรือประโยชน์ของ multithreaded (Benefits)
  1. การตอบสนอง (Responsiveness)
  2. การแชร์รีซอร์ส (Resource sharing)
  3. ความประหยัด (Economy)
  4. การเอื้อประโยชน์ของสถาบัตยกรรมมัลติโปรเซสเซอร์ (Utilization of multiprocessor architectures)
4.3 Threading Issues เรื่องราวเกี่ยวกับ thread มีหลายอย่างที่ต้องพิจารณา การยกเลิก (Cancellation) thread เป็นเรื่องที่ต้องทำความเข้าใจ เพราะการยกเลิกหมายถึงการทำให้ thread เป้าหมายจบการทำงาน ก่อนที่จะทำงานจนเสร็จสมบูรณ์ การยกเลิกนี้มี 2 วิธี
1.1 Asynchronous cancellation การยกเลิกที่ thread อื่น สั่งให้ thread เป้าหมายหยุดทำงาน
1.2 Defered cancellation การยกเลิก thread เป้าหมาย โดยใช้ตรวจสอบตนเอง ว่าตนเองต้องถูกยกเลิกด้วยหรือไม่
4.4 Pthreads
Pthreads อ้างถึงมาตรฐาน POSIX (IEEE 1003.1c) เพื่อกำหนด API(Application programming interface) สำหรับสร้าง และการซินโครไนซ์เซชัน นี่คือการกำหนดสภาพแวดล้อมของ thread ซึ่ง Thread specification นี้ถูกจำกัดใน Solaris2 แต่ Pthread ไม่ถูกสนับสนุนใน Windows แม้จะมี shareware เผยแพร่แล้วก็ตาม
Historically, hardware vendors have implemented their own proprietary versions of threads. These implementations differed substantially from each other making it difficult for programmers to develop portable threaded applications. In order to take full advantage of the capabilities provided by threads, a standardized programming interface was required. For UNIX systems, this interface has been specified by the IEEE POSIX 1003.1c standard (1995). Implementations which adhere to this standard are referred to as POSIX threads, or Pthreads. Most hardware vendors now offer Pthreads in addition to their proprietary (เป็นเจ้าของ) API's.

http://www.llnl.gov/computing/tutorials/workshops/workshop/pthreads/samples/hello.c
================================
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5
void *PrintHello(void *threadid) {
   printf("\n%d: Hello World!\n", threadid);
   pthread_exit(NULL);
}
int main (int argc, char *argv[]) {
   pthread_t threads[NUM_THREADS];
   int rc, t;
   for(t=0;t < NUM_THREADS;t++){
      printf("Creating thread %d\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}
================================
Output :
Creating thread 0 Creating thread 1 0: Hello World! 1: Hello World! Creating thread 2 Creating thread 3 2: Hello World! 3: Hello World! Creating thread 4 4: Hello World!
4.5 ปฏิบัติการฝึกเขียน threading model - ฝึกเขียนโปรแกรมด้วยภาษา C แสดงการทำงานของ pthread
- ค้นคว้าข้อมูลเกี่ยวกับ เทรด จากอินเทอร์เน็ต แล้วทำรายงาน และส่งตัวแทนนำเสนอหน้าชั้น
เพิ่มเติม 2549-12-13
โครงสร้างพื้นฐานการซิงโครไนซ์ (Synchronization)
(sync. การทำให้งาน 2 งาน ทำร่วมกันอย่างราบรื่น แต่ async. คือการทำงานของงานที่ไม่เกี่ยวเนื่องกัน)
1. Race Condition สภาพที่โปรเซสสามารถเข้าถึงทรัพยากรได้พร้อมกัน
2. Mutual Exclusion (MuTex) and Critical Region ซึ่งกันและกัน กันไม่ให้เข้า วิกฤต อนาเขต
3. วิธีแก้ปัญหา Mutual Exclusion with busi waiting 5 วิธี
- Disable Interrupt ยกเลิกการขัดจังหวะ - Lock Variable สร้างตัวแปรล็อก โดยใช้ software และตัวแปร Global อาจทำให้ lock กันเอง - Strict Alternation กำหนดทางเลือกอื่น เพื่อสลับกันเข้า Critical Region เหมาะกับ 2 process - Peterson's Solution ใช้จัดการ 2 กระบวนการ เพื่อเข้าครอบครองทรัพยากร flag[0] = 0 flag[1] = 0 turn = 0 p0: flag[0] = 1 p1: flag[1] = 1 turn = 1 turn = 0 while( flag[1] && turn == 1 ); while( flag[0] && turn == 0 ); // do nothing // do nothing // critical section // critical section ... ... // end of critical section // end of critical section flag[0] = 0 flag[1] = 0 - TSL Instruction (Test Set Lock) อ่านค่าใน Registry แล้วเปลี่ยนตามสถานะ
4. Sleep and walkup 5. Semaphore ของ Edsger Dijkstra คือตัวแปรป้องกันไม่ให้เกิดปัญหาการเข้าใช้ทรัพยากร P() ใช้ทรัพยากร V() คืนทรัพยากร Init() กำหนดทรัพยากรให้เข้าใช้ได้
P(Semaphore s) { wait until s > 0, then s := s-1; /* must be atomic once s > 0 is detected */ } V(Semaphore s) { s := s+1; /* must be atomic */ } Init(Semaphore s, Integer v) { s := v; }
6. Event Counter เกี่ยวข้องกับ 3 ปฏิบัติการคือ read() advance() เพื่อเพิ่มค่า await() เพื่อsleep 7. Monitor คือชุดของ procedure, variable, data structure รวมเป็น package เพื่อควบคุมการ sync. The Dinning Philosophers Problem คือปัญหาที่ตกลงกันไม่ได้ของนักปราชญ์ในโต๊ะอาหาร อาจทำให้คนใดคนหนึ่งต้องอดตายจากเงื่อนไขการใช้ส้อมทานอาหาร แต่ไม่มีโอกาสนั้นสำหรับบางคน ซึ่งแก้ปัญหาด้วยแนวคิดของ semaphore ได้
ถาม - ตอบ ส่วนหนึ่งเรียบเรียงจากหนังสือของ รศ.ดร.กฤษดา ขันกสิกรรม
ถามสถานะของเธรด มีกี่สถานะ มีอะไรบ้าง
ตอบมี 7 สถานะ
1. Born
2. Ready
3. Running
4. Terminated
5. Blocked
6. Waiting
7. Sleeping
ถามเธรด (Thread) แปลว่าอะไร
ตอบเส้นด้าย
ถามระบบปฏิบัติการที่สนับสนุน User-level threads คือระบบใด
ตอบระบบ POSIX Pthread, Mach C-threads และ Solaris 2 UI -threads
ถามระบบปฏิบัติการที่สนับสนุน Kernel-level threads คือระบบใด
ตอบระบบ Windows NT/2000/XP, Linux, Mac OS
ถามระบบปฏิบัติการที่สนับสนุน Combining User and Kernel-level threads คือระบบใด
ตอบระบบ HP-UX, IRIX
ถามเธรด (Thread) แบบ User-level threads มีการทำงานแบบใด
ตอบMany to One
ถามเธรด (Thread) แบบ Kernel-level threads มีการทำงานแบบใด
ตอบOne to One
ถามเธรด (Thread) แบบ Combining User and Kernel-level threads มีการทำงานแบบใด
ตอบMany to Many
ถามภาษาโปรแกรม ภาษาใดสนับสนุนการทำ Multithreading
ตอบภาษา Java, C#, Visual C++.NET, Visual Basic .NET
ถามContext switching คืออะไร
ตอบการเปลี่ยนการประมวลผลจากโปรเซสหนึ่งไปประมวลผลอีกโปรเซสหนึ่ง
ถามเธรด (Thread) เป็นโปรเซสแบบใด
ตอบแบบ Lightweight process
ถามโปรเซส (Process) เป็นโปรเซสแบบใด
ตอบแบบ Heavyweight process
ถามMultithreading Models มีกี่แบบ อะไรบ้าง
ตอบมี 3 แบบ
1. Many-to-one model
2. One-to-one model
3. Many-to-many model
แนะนำเว็บไซต์ (Website guide) + https://computing.llnl.gov/tutorials/pthreads/
เอกสารอ้างอิง (Reference) [1] Abraham silverschatz, Peter baer galvin, "Operating system concept", John wiley & Sons, New York, 2003.
[2] Milan Milenkovic, "Operating systems: concepts and design", McGraw-Hill inc., New York, 1992.
[3] William stallings, "Operating system", Prentice hall, New York, 1999.
[4] ไพศาล โมลิสกุลมงคล และคณะ, "ระบบปฏิบัติการ", สำนักพิมพ์ดวงกมลสมัย, กรุงเทพฯ, 2545.
[5] พิเชษฐ์ ศิริรัตนไพศาลกุล, "ระบบปฏิบัติการ (Operating system)", บริษัท ซีเอ็ดยูเคชั่น จำกัด., กรุงเทพฯ, 2546.
[6] ดร.ยรรยง เต็งอำนวย, "ระบบปฏิบัติการ (Operating system)", บริษัท ซีเอ็ดยูเคชั่น จำกัด., กรุงเทพฯ, 2541.
[7] ประชา พฤกษ์ประเสริฐ, "ระบบปฏิบัติการ", บริษัท ซัคเซส มีเดีย จำกัด., กรุงเทพฯ, 2549.
[8] วศิน เพิ่มทรัพย์, "คู่มือ MS-DOS", พี.เอ็น.การพิมพ์, กรุงเทพฯ, 2545.
[9] ชนินทร์ เชาวมิตร, "คู่มือยูนิกซ์เดสก์ทอป", บริษัท ซีเอ็ดยูเคชั่น จำกัด., กรุงเทพฯ, 2538.
[10] รศ.ดร.กฤษดา ขันกสิกรรม, "ระบบปฏิบัติการ (Operating Systems)", อาง้วนการพิมพ์, นครสวรรค์, 2555.

http://goo.gl/72BPC