สาระการเรียนรู้ 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 ที่เราควบคุมกองทัพ ให้รถขุดทอง ทหาร และฐานทัพทำงานไปพร้อมกัน ซึ่งแน่นอนว่าไม่ใช่โปรเซสเดียว และไม่ใช่เทรดเดียว แต่เราสร้างหลายโปรเซส และมีหลายเทรดในแต่ละโปรเซส เพื่อให้ทั้งหมดบรรลุเป้าหมายของการทำงาน ตามการควบคุมของผู้เล่นเกม
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!
โครงสร้างพื้นฐานการซิงโครไนซ์ (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 ได้