Professional Documents
Culture Documents
ภาพที่ 4.1 (a) 3 โพรเซสแต่ละโพรเซสจะมี 1 Thread (b) 1 โพรเซสที่มี 3 Thread
ภาพที่ 4.1 (a) 3 โพรเซสแต่ละโพรเซสจะมี 1 Thread (b) 1 โพรเซสที่มี 3 Thread
การจัดการเธรด
4.1 เธรด
องค์ประกอบภายในเธรดประกอบด้วย
1. Threads ID หมายเลขเธรดที่อยู่ในโพรเซส
2. Counter ตัวนับเพื่อติดตามคาสั่งที่จะถูกดาเนินการเป็นลาดับถัดไป
3. Register หน่วยความจาเก็บค่าตัวแปรที่ทางานอยู่ปัจจุบัน
4. Stack เก็บประวัติการทางาน
4.2 ตัวอย่างการใช้เธรด
ซอฟต์ แ วร์ ปั จ จุ บั น ที่ รั น กั บ เครื่ อ งพี ซี ส มั ย ใหม่ มี ก ารออกแบบให้ เป็ น Multithread โดยแยก
ออกเป็นโพรเซสที่ควบคุมหลาย ๆ เธรด เช่น โปรแกรมเว็บบราวเซอร์ที่มีเธรดหนึ่งในการแสดงรูปภาพหรือ
เขียนข้อความในขณะที่อีกเธรดหนึ่งกาลังดึงข้อมูลจากเน็ ตเวิร์ค หรือในโปรแกรมเวิร์ด โพรเซสเซอร์ที่มี
หลายเธรด โดยที่เธรดหนึ่งกาลังแสดงภาพกราฟฟิก เธรดที่สองกาลังรอรับคาสั่งจากคีย์บอร์ดจากผู้ ใช้
ในขณะทีเ่ ธรดที่สามกาลังตรวจสอบคาสะกดและไวยากรณ์ในลักษณะทางานอยู่เบื้องหลัง เป็นต้น
ในสถานการณ์บางอย่างการทางานแบบ Single อาจจะต้องการทางานพร้อมกันหลาย ๆ งาน
เช่น web server ยอมรับสิ่งที่เครื่องลูกข่ายต้องการพวก Web page image sound ถ้าเครื่องให้บริการมี
ระบบการทางานแบบ single เครื่องลูกข่ายนับพัน ๆ เครื่องที่ติดต่อเข้ามาก็จะได้รับการให้บริการเพียง
เครื่องเดียวเท่านั้น วิธีหนึ่งคือให้เซริฟเวอร์เรียกใช้งานโพรเซสขึ้นมาหนึ่งโพรเซสและรอรับ การร้องขอ
เมื่อได้รับแล้ว จะสร้างโพรเซสแยกออกมาเพื่อให้บริการในทุก การร้องขอที่ขอมา ซึ่งจริง ๆ แล้วการสร้าง
โพรเซสในลักษณะนี้เป็นวิธีแบบธรรมดาที่เคยใช้กันก่อนที่จะมีระบบเธรดขึ้นมาอีก การสร้างโพรเซสต้องใช้
ระบบปฏิบัติการคอมพิวเตอร์ (Operating Systems) 67
4.3 ความแตกตางระหวางโพรเซสกับเธรด
4.4 สถานะของเธรด
การเก็บขอมูลที่เกี่ยวของ เชน User register, Program counter และ Stack pointer ไว้ และซีพียูจะ
ไปใหบริการแกเธรดตัวอื่นที่พรอมสาหรับการบริการตอไป
3. Unblock เมื่อมีเหตุการณทีเ่ ธรดถูกบล็อก เธรดก็จะถูกนาไปเก็บไวใน Ready queue
4. Finish เมื่อเธรดสิ้นสุดการทางานคาตาง ๆ ก็จะถูกส่งคืน ให้กับระบบภาพแสดงตัวอยางของ
เธรดในระบบ Multithreading
4.7 เธรดสาหรับผู้ใช้และเธรดสาหรับระบบปฏิบัตกิ าร
4.8 รูปแบบของเธรด
มีห ลายระบบที่ ส นั บ สนุ น ทั้ ง เธรดส าหรับ ผู้ ใช้ และเธรดส าหรับ ระบบปฏิ บั ติ ก าร ในรูป แบบที่
แตกต่างกัน พิจารณาในรูปแบบทั้งสามของการดาเนินการเธรดดังนี้ เราจะอธิบายการทางานของเธรดซึ่งมี
การพัฒนามาตลอด แต่อย่างไรก็ตามการสนับสนุนการทางานของเธรดจะขึ้นอยู่กับระดับของผู้ใช้จากเธรด
ของผู้ใช้หรือจาก Kernel แต่เธรดของผู้ใช้จะสนับสนุนมากกว่า Kernel และสามารถควบคุมโดยไม่ต้องใช้
การสนับสนุนจาก Kernel ส่วนเธรดของ Kernel นั้นจะสนับสนุนและควบคุมโดยตรงจากระบบปฏิบัติการ
และเกือบทุกรุ่นของระบบปฏิบัติการไม่ว่าจะเป็น ระบบปฏิบัติการวินโดว์ ลินุกส์ แมคโอเอส โซลาริส และ
ยูนิกส์ (เช่น Tru64 UNIX) ที่สนับสนุนการทางานของ Kernel
ในที่สุดแล้ ว เธรดของผู้ใช้และเธรดของ Kernel ก็ยังเชื่อมโยงกันอยู่ดี ในส่ วนนี้ สามารถพิสู จน์
ความสัมพันธ์ซึ่งสามารถแบ่งออกเป็น 3 รูปแบบที่เป็นที่รู้จักกันโดยทั่วไป
ระบบปฏิบัติการคอมพิวเตอร์ (Operating Systems) 71
4.9 คลังข้อมูลการจัดการเธรด
Pthreads เป็ น เธรดมาตรฐานของ POSIX จะจั ด การเกี่ ยวกั บ ระดั บ ของผู้ ใช้ หรือ ระดั บ ของ
Kernel Threads Library ของ Win32 เป็นแหล่งข้อมูลของ Kernel level ที่สะดวกของระบบวินโดวส์
เธรดของจาวาเป็ น API ที่ยอมรับ ในการสร้างและจัดการเธรดโดยตรงในโปรแกรมจาวา อย่างไรก็ตาม
เพราะว่ากรณีส่วนใหญ่แล้ว JVM จะเป็นตัวทางานทางด้านบนสุดของระบบปฏิบัติการ เธรดของจาวา API
นั้ น เป็ น รู ป แบบเครื่อ งมื อที่ ใช้ Threads library ได้ ส ะดวกบนระบบโฮส ซึ่งคล้ ายกับ ระบบปฏิ บั ติ การ
วินโดวส์ เธรดของจาวาเป็นรูปแบบเครื่องมือที่ใช้ในระบบ Win32 API, UNIX และระบบปฏิบัติการลินุกส์
เช่นเดียวกับการใช้ Pthreads
ในส่วนที่เหลือของเรื่องส่วนนี้เราจะอธิบายถึงการสร้างเธรดพื้นฐาน ซึ่งใช้ 3 Thread library และ
มีภาพประกอบตัวอย่าง เราออกแบบโปรแกรมของรูปแบบหลายเธรดเมื่อทาการหาผลรวมของค่าที่เป็น
จานวนเต็มบวกในเธรดที่ใช้ซึ่งรู้จักกันในรูปฟังก์ชันการหาผลรวม
จากตัวอย่ าง ถ้า N มีค่าเท่ ากับ 5 ในฟั งก์ชันนี้ค่ าผลรวม จาก 0 ถึง 5 คือ 15 โปรแกรมนี้ จะ
ทางานด้วยค่าขอบบนของการหาผลรวมของเธรดมาตรฐาน ถ้าผู้ใช้ใส่ค่า 8 ผลรวมของจานวนค่าจาก 0 ถึง
8 จะออกมาเป็นอย่างไร
4.9.1 Pthreads
Pthreads เป็นตัวพื้นฐานของ POSIX ( IEEE 103.1C ) เรียกได้ว่าเป็น API สาหรับการสร้าง
เธรดและสิ่งที่เกิดขึ้นในเวลาเดียวกัน เป็นตัวบ่งบอกถึงพฤติกรรมของเธรดโดยไม่ใช้เครื่องมือ การออกแบบ
ระบบปฏิบัติการมักจะใช้เครื่องมือในงานที่ต้องการ ระบบปฏิบัติการส่วนใหญ่ใช้ Pthreads เป็นเครื่องมือ
ไม่ว่าจะเป็นระบบปฏิบัติการโซราริ ส ลินุกส์ แมคโอเอส และยูนิกส์ เป็นเครื่องมือที่สะดวกในการใช้งาน
ทั่วไปสาหรับงานที่หลากหลายซึ่งดีกับระบบปฏิบัติการวินโดวส์
74 บทที่ 4 การจัดการเธรด
#include <pthread.h>
#include <stdio.h>
int sum; /* this data is shared by the thread(s) */
void *runner(void *param); /* threads call this function */
int main(int argc, char *argv[])
{
pthread t tid; /* the thread identifier */
pthread attr t attr; /* set of thread attributes */
if (argc != 2) {
fprintf(stderr,"usage: a.out <integer value>\n");
return -1;
}
if (atoi(argv[1]) < 0) {
fprintf(stderr,"%d must be >= 0\n",atoi(argv[1]));
return -1;
}
/* get the default attributes */
pthread attr init(&attr);
/* create the thread */
pthread create(&tid,&attr,runner,argv[1]);
/* wait for the thread to exit */
pthread join(tid,NULL);
printf("sum = %d\n",sum);
}
/* The thread will begin control in this function */
void *runner(void *param)
{
int i, upper = atoi(param);
sum = 0;
for (i = 1; i <= upper; i++)
sum += i;
pthread exit(0);
}
class Sum
{
private int sum;
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
}
class Summation implements Runnable
{
private int upper;
private Sum sumValue;
public Summation(int upper, Sum sumValue) {
this.upper = upper;
this.sumValue = sumValue;
}
public void run() {
int sum = 0;
for (int i = 0; i <= upper; i++)
sum += i;
sumValue.setSum(sum);
}
}
public class Driver
{
public static void main(String[] args) {
if (args.length > 0) {
if (Integer.parseInt(args[0]) < 0)
System.err.println(args[0] + " must be >= 0.");
else {
Sum sumObject = new Sum();
int upper = Integer.parseInt(args[0]);
Thread thrd = new Thread(new Summation(upper, sumObject));
thrd.start();
try {
thrd.join();
System.out.println
("The sum of "+upper+" is "+sumObject.getSum());
} catch (InterruptedException ie) { }
}
}
else
System.err.println("Usage: Summation <integer value>"); }
}
4.10 การยกเลิกเธรด
4.11 สรุป
แบบฝึกหัดท้ายบทที่ 4
บรรณานุกรมประจาบทที่ 4