Multithreaded Programmingbls.buu.ac.th/~f52325/report_last_semester/%BA%B7%B7%D5... · Web...
Transcript of Multithreaded Programmingbls.buu.ac.th/~f52325/report_last_semester/%BA%B7%B7%D5... · Web...
108
บทท 4
Multithreaded Programming
4.1 บทนำ� ในอดตการประมวลผลเปนแบบ 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.1 แรงจงใจ (Motivation) ซอฟแวรหลาย ๆ ตวทรนอยบนคอมพวเตอร PC ททนสมย
คอระบบ Multithreaded การประยกตใชแบบฉบบของมนคอการควบคมจะแยกโปรเซสออกไปหลาย ๆ เสนงาน อยาง Web Browser กตองใชหนงเสนงานเพอแสดงรปภาพหรอตวอกษรในขณะทเสนอน ๆ ดงเอาขอมลจากเครอขายตวอยางเชน word processing เสนงานหนงจะแสดงในสวนของการแสดงผลของตวอกษร เสนงานทสองจะใชในเรองของการตอบสนองจากคยบอรด สวนเสนทสามจะชวยในเรองของการตรวจสอบคำาผด เปนตน
109
ในสถานการณบางอยางการทำางานแบบ single อาจจะตองการทำางานพรอมกนหลาย ๆ งาน เชน web server ยอมรบสงทเครองลกขายตองการพวก web page image sound ถาเครองใหบรการมระบบการทำางานแบบ single เครองลกขายนบพน ๆ เครองทตดตอเขามากจะไดรบการใหบรการเพยงเครองเดยวเทานน
วธหนงคอให server run โปรเซสขนมาหนงโปรเซสและรอรบ request เมอไดรบแลว จะสรางโปรเซสแยกออกมาเพอใหบรการในทก request ทขอมา ซงจรง ๆ แลวการสรางโปรเซสในลกษณะนเปนวธแบบธรรมดาทเคยใชกนกอนทจะมระบบ เสนงานขนมาอก การสรางโปรเซสตองใชเวลาในการสรางมากและตองละเอยดถถวน ดงทแสดงใหดในบทกอนหนา ถามโปรเซสใหมถกสรางขนกจะทำางานเหมอนกบโปรเซสเดมทมอยแลว และทำาไมการทำางานแบบนจงไม overhead
4.1.2 ขอไดเปรยบหรอประโยชนของ multithread programming มอย 4 ขอหลก ๆคอ
1. ก�รตอบสนอง (Responsiveness) การทำางานแบบ Multithreading สอสารกนระหวาง application จะยอมใหโปรแกรมรนตอไปไดถาสวนของโปรแกรมถก block หรอมการทำางานหรอรอคำาสงเปนเวลานาน ๆ ดวยวธนจะเพมการตอบสนองไปยง user ตวอยางเชน web browser จะยงคงยอมให user ตดตอกนในหนง thread ในขณะทรปภาพถกโหลดจาก thread อน
110
2. ก�รแชรทรพย�กร(resource sharing) โดยปกต thread จะแชรมนจะแชรหนวยความจำาและทรพยากรกนเอง ขอดตรงสวนนในการแชร code และ data คอจะยอมให application มหลาย ๆ thread ทแตกตางกนทำางานอยบน space เดยวกน
3. คว�มประหยด (Economy) การแบงหนวยความจำาและทรพยากรตาง ๆ เพอทจะสรางโปรเซสซงเปนการฟมเฟอยและใชเวลามากเพราะวามนแชรและดงขอมลกนอยดงนนการทำางานแบบ multithread จงมความประหยดในการสรางและ context-switch thread
4. ก�รเออเฟ อประโยชนของสถ�ปตยกรรม Multiprocessor ประโยชนของ Multithreading นนมมากมายในสถาปตยกรรม Multiprocessor ซงมนสามารถทำางานคขนานกนไปบนตวสงการทตางกนได แบบ single thread process นนจำาถกจำากดใหทำางานบน CPU ตวเดยวเทานน สวนในแบบ Multithread นนจะทำางานบน CPU หลายตวในเวลาเดยวกนได
4.2 รปแบบหล�ยเสนง�นเราจะอธบายการทำางานของเสนงาน ซงมการพฒนามาตลอด
แตอยางไรกตามการสนบสนนการทำางานของเสนงานจะขนอยกบระดบของผใช (user level) จากเสนงานของผใชหรอจาก kernel แตเสนงานของผใชจะสนบสนนมากกวา kernel และสามารถควบคมโดยไมตองใช kernel support สวนเสนงานของ kernel นนจะสนบสนนและควบคมโดยตรงจากระบบปฏบตการ และเกอบทก
111
รนของระบบปฏบตการไมวาจะเปน Windows XP, Linux, Mac OS X, Solaris และ Tru64 UNIX ( สมยกอนคอ Digital UNIX ) ทสนบสนนการทำางานของ kernel
ในทสดแลวเสนงานของผใชและเสนงานของ kernel กยงเชอมโยงกนอยด ในสวนนเราจะพสจนความสมพนธซงสามารถแบงออกเปน 3 รปแบบทเปนทรจกกนโดยทวไป
4.2.1 รปแบบหล�ยตอหนง (M:1) รปแบบหลายตอหนง ( รป 4.2 ) หลายเสนงานของผใชจะ
ทำางานกบหนงเสนงานของ kernel ตวจดการเสนงานนนจะแกปญหาจาก thread library ในพนทของผใช ซงมนจะมประสทธภาพมาก แตกระบวนการทงหมดจะกดขวางกน ถาเสนงานไปทำาการกดขวาง system call อกทงเปนเพราะวามเพยงหนงเสนงานทสามารถเขาไปใน kernel ในหนงชวงเวลา เสนงานหลายเสนงานนนไปสามารถทำางานขนานในรปแบบหลายกระบวนการได
Green threads เปน thread library ทสะดวกสำาหรบเครอง Solaris และระบบจำาพวก GNU Portable thread
4.2.2 รปแบบหนงตอหนง (1:1)
112
รปแบบหนงตอหนง (รป 4.3) จากรปในแตละเสนงานของผใชจะทำางานกบหนงเสนงานของ kernel ซงมนจะจดใหมการทำางานเกดขนพรอมกนมากกวารปแบบหลายตอหนง (M:1) โดยจะปลอยใหเสนงานอนทำางานในขณะทมเสนงานทำางานกบ system call อกทงยงปลอยใหหลายเสนงานนนทำางานในรปแบบขนานของหลายกระบวบการอกดวย มขอเสยเพยงขอเดยวสำาหรบรปแบบนคอ การสรางเสนงานของผใชจะตองสรางเสนงานของ kernel ใหสอดคลองกนเพราะวา การสรางเสนงานของ kernel นนรบผดชอบโดยชน application สวนใหญแลวการจดหารปแบบ การลดคาของ คาสนบสนนเสนงานจะถกกระทำาโดยระบบ ไมวาจะเปนระบบปฏบตการ Linux หรอ Windows กตามซงรวมไปถง Windows 95, 98, NT, 2000 และ XP จะใชรปแบบหนงตอหนง (1:1) เปนเครองมอ
4.2.3 รป แบบหล�ยตอหล�ย (M:M)
รปแบบหลายตอหลาย (รป 4.4) หลายเสนงานของผใชจะทำางานกบเสนงานกบเสนงานของ kernel ทนอยกวาหรอเทากนได จำานวนเสนงานของ kernel บางครงจะถกระบเจาะจงจากชน application หรอ โดยเครอง ( การแบงเสนงาน kernel บน application ในกระบวนการหลายจะแบงไดมากกวาแบบกระบวนการเดยว ) ทรปแบบหนงตอหนง (1:1) เปนทยอมรบโดยผพฒนานนคอการสรางเสนงานทผใชตองการ ถกทวากระบวนการทำางานพรอมกนแตไมไดเขาไปทำางานใน system call พรอมกน
113
เพราะวา kernel สามารถทจะทำางานกบหนงเสนงานในหนงชวงเวลา รปแบบหนงตอหนง (1:1) ยอมใหเกดการทำางานพรอมกนไดมากแตในการขยายนนจะตองระวงไมใหสรางเสนงานมากเกนไปภายใน application (และในบางกรณอาจมขอจำากดในกระบวนการสรางเสนงาน) รปแบบหลายตอหลาย (M:M) ไมสามารถจดการกบขอบกพรองสองประการคอ ผพฒนาไมจำาเปนตองสรางเสนงานของผใชหลายเสน และเสนงานของ kernel ทคลายกนสามารถทำางานในแบบขนานบนระบบหลายกระบวนกรได อกทงเมอมเสนงานทำางานกบ system call, kernel สามารถทจะดำาเนนการกบเสนงานอนได อกประการหนงคอ แมวาเสนงานของผใชจะมจำานวนมากกวาหรอเทากนกบจำานวนเสนงานของ kernel แตยงยอมรบวาเสนงานของผใชนนมขอบเขตทจำากดตอหนงเสนงานของ kernel ความแตกตางบางอยางเกยวกบรปแบบ two level ( รป 4.5) เปนการรองรบโดยระบบปฏบตการ เชน IRIX, HP-UX และ Tru 64 UNIX ระบบปฏบตการ Solaris รองรบรปแบบ two level ในรนเกากวา Solaris 9 แตอยางไรกตามระบบ Solaris 9 เรมตนใชงานดวยรปแบบหนงตอหนง (1:1)
4.3 Thread Library
114
Thread Library เปนขอกำาหนดทสรางโดยโปรแกรมเมอร สำาหรบสรางและจดการเกยวกบเสนงาน โดยมสองขนตอนในการทำางานคอ
1. การเขาถงแหลงของขอมลทงหมดในเนอทของผใช โดยไมผาน kernel ทกคาและทกโครงสรางขอมลของแหลงขอมลในพนทของผใช หรอเปนการเรยกจากฟงกชนเฉพาะในพนทของผใชและไมใช system call
2. การเขาถงเครองมอทรบรองแหลงของ kernel โดยตรงดวยระบบปฏบตการ ในสวนนโคดและโครงสรางขอมลสำาหรบแหลงขอมลในพนทของ kernel การเรยกฟงกชนใน API แหลงขอมลแบบธรรมดาจะสงผลใน system call ถง kernel
Thread Library 3 อยางหลก ๆ ทใชในปจจบนคอ1. POSIX Pthreads2. Win323. Java
Pthreads เปนเสนงานมาตราฐานของ POSIX จะจดการเกยวกบระดบของผใช หรอ ระดบของ kernel Threads Library ของ Win32 เปนแหลงขอมลของ kernel level ทสะดวกของระบบวนโดวส เสนงานของจาวาเปน API ทยอมรบในการสรางและจดการเสนงานโดยตรงในโปรแกรมจาวา อยางไรกตาม เพราะวากรณสวนใหญแลว JVM จะเปนตวทำางานทางดานบนสดของระบบ
115
ปฏบตการ เสนงานของจาวา API นนเปนรปแบบเครองมอทใช threads library ไดสะดวกบนระบบโฮส ซงคลายกบระบบปฏบตการวนโดวส เสนงานของจาวาเปนรปแบบเครองมอทใชในระบบ Win32 API, UNIX และระบบปฏบตการ Linux เชนเดยวกบการใช Pthreads
ในสวนทเหลอของเรองสวนนเราจะอธบายถงการสรางเสนงานพนฐาน ซงใช 3 thread library และมภาพประกอบตวอยาง เราออกแบบโปรแกรมของรปแบบหลายเสนงานเมอทำาการหาผลรวมของคาทเปนจำานวนเตมบวกในเสนงานทใชซงรจกกนในรปฟงกชนการหาผลรวม
จากตวอยาง ถา N มคาเทากบ 5 ในฟงกชนนคาผลรวม จาก 0 ถง 5 คอ 15 โปรแกรมนจะทำางานดวยคาขอบบนของการหาผลรวมขนเสนเสนมาตราฐาน ถาผใชใสคา 8 ผลรวมของจำานวนคาจาก 0 ถง 8 จะออกมาเปนอยางไร
4.3.1 Pthreads Pthreads เปนตวพนฐานของ POSIX ( IEEE
103.1C ) เรยกไดวาเปน API สำาหรบการสรางเสนงานและสงทเกดขนในเวลาเดยวกน เปนตวบงบอกถงพฤตกรรมของเสนงานโดยไมใชเครองมอ การออกแบบระบบปฏบตการมกจะใชเครองมอในงานทตองการ ระบบปฏบตการสวนใหญใช Pthreads เปนเครองมอ ไมวาจะเปน Solaris, Linux, Mac OS X และ Tru64 UNIX Shareware เปนเครองมอทสะดวกในการใชงานทวไปสำาหรบงานทหลากหลายซงดกบ ระบบปฏบตการวนโดวส
โปรแกรมภาษา C ทแสดงในรป 4.6 เปนตวสาธตแบบพนฐานของ Pthreads API สำาหรบสรางโปรแกรมรปแบบหลายเสน
116
งาน ทเราทำาการคำานวณหาผลรวมของจำานวนเตมบวกในการแบงเสนงาน ในโปรแกรม Pthreads แบงเสนงานและเรมประมวลผล โดยแบงออกเปนฟงกชน ในรป 4.6 สวนของฟงกชน runner() เมอโปรแกรมเรมทำางาน เสนงานเสนหนงจะควบคมการทำางานของ main() หลงจากนน main() จะสรางเสนงานทสองและเรมควบคมการทำางานของฟงกชน runner()
เสนงานสองเสนสามารถใชขอมลรวมกนไดทงหมด เมอเรามองลกลงไปในโปรแกรมจะเหนวา ทกโปรแกรม Pthreads นนจะถกรวบรวมไวในสวนของเฮดเดอรไฟลคอ Pthread.h สวนของ pthreads จะรองรบเกยวกบการจำาแนกของการสรางเสนงาน แตละเสนงานสามารถทจะกำาหนดขนาดของ attribute และตารางการใชขอมล
Pthread_attr_t จะเปนตวแทน attribute ของเสนงาน เราจะกำาหนดคา attribute ในสวนของฟงกชนเรยก pthread_atr_int(&attr) เพราะเราไมสามารถกำาหนดคาของ attribute ไดแนนอน เราสามารถใชคา attribute พนฐานได (ในบทท 5 เราจะอธบายการทำางานของ attribute จาก Pthreads API)
การแบงเสนงานถอเปนการสรางเสนงานดวย pthreads_create() ของฟงกชนเรยก ในการเพมและผานของเสนงาน สามารถจำาแนกเสนงานได อกทงชอของฟงกชนเมอมเสนงานใหมเรมประมวลผล ในสวนนฟงกชน runner() สดทายเราจะสงคาจำานวนเตมคงทไปยงเสนงานทควบคมมน
117
จดน
โปรแกรมม 2 เสนงานคอ เสนงานพออยใน main() และ เสนงาน
118
ลก ทำาการรวมการทำางานในฟงกชน runner() หลงจากการสรางเสนงานลก เสนงานพอจะรอคำาสงสนสดการทำางานจากฟงกชน pthread_join() เสนงานลกจะสนสดการทำางานเมอมนเรยกฟงกชน pthread_exit() เสนงานลกสามารถทจะกลบมาทำางานไดอกครงเมอเสนงานพอสงขอมลไปยงสวนของขอมลทใชรวมกน (shared data)
4.3.2 เสนง�นของระบบ Win32 วธการสำาหรบสรางเสนงานทใชในระบบ Win32 วธการจะ
คลายๆ Pthreads ในระบบอน ๆ เราจะรวมไปถงเสนงานระบบ Win32 ในโปแกรมภาษา C ทแสดงดงรป 4.7 จะเหนไดวา เราจะใช Windows.h เปนหวของไฟล เมอใชรปแบบ win32 เปนรปแบบในการนำาเสนอ
Pthreads ทแสดงในรป 4.6 ขอมลถกแบงโดยเสนงานททำาการแบง ในสวนน ผลรวมทงหมดจะรองรบ (ขอมล DWORD) รปแบบเปนจำานวนเตมบวกขนาด 32 บต เราจะอธบายฟงกชน summation() นเปนการทำางานในเสนงานแบง ฟงกชนนเปนการสง pointer ไปยงคาวาง ระบบ Win32 ถกกำาหนดโดย LPVOID การทำางานของเสนงานนฟงกชนทกำาหนดขอมลทงหมด จากผลรวมไปถงคาของผลรวม จาก 0 ถง คาคงททผานไปถงฟงกชน summation()
เสนงานทสรางขนในระบบ Win32 จะใชฟงกชน CreateThread() และใน Pthreads จะกำาหนดขนาด attribute สำาหรบเสนงานทแบงตวสงคาไปยงฟงกชน attribute ทรวบรวมขอมลทปลอดภย ขนาดของขอมลนนจะเพมหรอลดสามารถทจะกำาหนดได ถาเสนงานอยในสถานะรอการทำางาน ในโปรแกรมนเราจะใชคาพนฐาน สำาหรบ attribute น (เราจะกำาหนดคาของเสนงาน ในสถานะรอแทนทเราจะทำามนในตอนท CPU ทำางาน) ชวงทเสนงานลกสราง เสนงานพอจะรอมนทำางานจนสนสดการทำางาน กอนทจะแสดง
119
คาผลลพธออกมา ซงคานนจะถกกำาหนดโดยเสนงานลก จะถกยกเลกโดยโปรแกรม Pthreads (รป 4.6) เสนงานพอจะรอเสนงานลกใช pthread_join() ซงการทำางานคลายกบระบบ Win32 ทใชฟงกชน WaitForSingleObject() เพราะการสรางเสนงานจะไปปดสวนของการสนสดการทำางานของเสนงานลก (เราจะปองกน การพองกนของวตถ ซงเราจะอธบายเพมในบทท 6 )
4.3.3 เสนง�นของระบบ Java เสนงานเปนรปแบบแรกของการประมวลผลโปรแกรมใน
โปรแกรมจาวา และ ภาษาจาวา และ มนเปนขอกำาหนดลกษณะของกลมสมาชกขนาดใหญในการสรางและจดการเกยวกบเสนงาน ทกโปรแกรมจาวาประกอบไปดวยเสนงานเดยวขนาดเลกทำาการควบคมอย ตวอยางคอโปรแกรมจาวาทมเมธอด main() เพยงอยางเดยวททำางานแบบเสนงานเดยวของ JVM
เราม 2 วธในการสรางเสนงานในโปรแกรมจาวา วธทหนง คอ การสรางคลาสใหมทมาจากเสนงานคลาสเสนงานและผานเมธอด run() อกทางเลอกหนง สามารถควบคมไดหลายผใชซงเปนวธการกำาหนดขอบเขตของคลาสทเปนตวทำางานอย ซงตวททำางานนนเราจะใชเปนตวทเราคดตาม เมอคลาสทำางานมนจะเปนตวกำาหนดเมธอด run() โคดทใชในเมธอด run() เปนอะไรททำาการแบงเสนงาน
120
คลาสผลรวมทใชแสดงสวนททำางานได การสรางเสนงานเปนการ
121
ทำางานโดยสวนของการสรางวตถตวอยาง ของคลาสเสนงานและผานการสรางวตถทสามารถทำางานได
การสรางเสนงานทไมเจาะจงการสรางเสนงานใหม ในทางตรงกนขามมนจะเปนเมธอด start() ททำาการสรางเสนงานใหมอยางแทจรง การเรยกเมธอด start() เพอการทำาวตถใหมจะตองใช 2 สงคอ
1). การจดการหนวยความจำาและการเรมใชเสนงาน JVM2). เรยกเมธอด run() ใหเสนงานทำางานทเหมาะสมดวย JVM
( หมายเหต เราไมเคยเรยกใชเมธอด run() โดยตรงหรอในทางตรงกนขามเราเรยกเมธอด start() และมนจะเปนตวเรยก เมธอด run() ตอไป )
เมอโปรแกรมทำางานเสรจ 2 เสนงานทถกสรางโดย JVM อยางทหนง เสนงานพอเรมการทำางานในเมธอด main() อยางทสอง เสนงานจะถกสรางเมอ เมธอด start() ในวตถเสนงานเปนตวเรยก เสนงานลกนจะเรมทำาการประมวลผลในเมธอด run() ของคลาส Summation หลงจากสงคาผลลพธ เสนงานนจะถกกำาจดเมอมนออกจากเมธอด run()
การแบงปนขอมลระหวางเสนงานจะเกดขนงายในระบบ WIn32 และ Pthreads ขอมลทถกแบงปนนนจะถกเปดเผยทวไปอยางแทจรงซงเปนภาษาแนวคดเชงวตถ จาวาไมมแนวคดของขอมลแบบน ถาเสนงานอยางนอยสองเสนงานทำาการแบงปนขอมลในโปรแกรมจาวา การแบงปนขอมลเกดขนจากการสงขอมลจากแหลงทแบงปนขอมลถงเสนงานทเหมาะสม ในโปรแกรมจาวาทแสดงในรป 4.8 เสนงานหลกและเสนงานรองทำาการแบงปนขอมลกนในคลาส sum วตถทถกแบงถกอางองมาจากเมธอด getSum() และ setSum() ( คณจะสงสยวาทำาไมเราไมใชวตถทเปนจำานวนเตม แทนทเราจะใชการออกแบบคลาสใหม มสาเหตมาจากคลาสของ
122
จำานวนเตมเปลยนแปลงไมได นนคอ คาของขอมลในเซตมนไมสามารถเปลยนแปลงได )
การเรยกเสนงานพอใน Pthreads และ Win32 ใช pthread_join() และ WaitForSingleObject() (ตามลำาดบ) รอเสนงานลกเสรจสนการทำางาน เมธอด join() ในจาวาทำางานคลายกน (ขอสงเกต join() ในจาวาไมใช InterruptedException ซงเราเลอกทจะไมใชมน)
123
4.4 Threading Issuesในสวนนเราจะมาพดถง บางสวน บางเนอหา ในเรองเกยวกบ
multithreaded program class Sum
124
{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)
125
{if (args.length > 0){
if (Integer.parseInt(args[0]) > 0)System.err.println(args[0] + "
must be >= 0. ");else{
//create the object to be shared Sum sumObject = new Sum();int upper =
Integer.paseInt(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){}
}}
elseSystem.err.println("Usage :
Summation < Integer value >");}
}ตวอยางโปรแกรมภาษา Java ในการหาคาผลรวมของ จำานวน non-
negative
4.4.1 The fork() and exec() System call
126
ใน บทท 3 เราไดอธบาย ถงหลกการทำางานของการเรยกใช fork ไปแลว ในการชวย แยก และ สำาเนา process โดดถา ม Thread หนงใน program เรยก fork กจะทำากบ process ใหมๆ ซำาๆ ทก Thread หรอ ทำาแคครงเดยว
ระบบปฏบตการ UNIX บางตวมใหเลอก fork ได ทง 2 รปแบบ แบบทหนงคอการทำาซำา ๆ ทก Thread อกแบบคอการเลอกทำาเฉพาะ Thread ท มการเรยกใช fork จากระบบexec system call ทำางานในทางแบบเดยวกบทอธบายไวใน บทท 3 และ ถาม Thread เรยกการ exec จากระบบ โปรแกรมจะมการกำาหนด parameter ไว สำาหรบ exec และจะจดเกบไวใน process ทกครงทมการเรยกใช
ทางเลอก ของ 2 รปแบบในการ fork ขนอยกบ application ถาท exec เรยกนนมขนาดใหญ หลงจากททำาการ fork แลวจะหลกเลยงในการทำาซำาทก Thread และ program จะมการกำาหนด parameter ไว exec เพอจดเกบ process ยกตวอยางการทำาซำาอยางเดยวในการเรยก Thread สมควรเปน โดย ถา process คนละ process กน ไมไดเรยก exec หลงจากการ fork แลว process แตละ process นาจะมการทำาสำาเนาทก ๆ Thread ไว
4.4.2 Cancellation Thread cancellation เปนขนตอนสดทายของ
Thread กอนจะทำางานเสรจสน ยกตวอยาง ในการทำางานหลาย ๆ Thread พรอม ๆ กน การคนหาผาน Database และ Thread หนงมการสงคาผลทไดกลบมา Thread อน ๆ ทเหลอกจะยกเลกการทำางานตอทนท ในรปแบบอนทเกดขนกเมอผใชกดปม Stop บน Web page เมอมการ loading ทตางไปจากทตองการ ในหลาย ๆ ครงจะเหนไดวาเมอมการใชงานใน web browser จะมการแยกกน
127
โหลดรปภาพ ในหนา นน ๆ แตเมอใดถาผใชกดปม Stop บน web browser ทก Thread ททำางานอยรปในการโหลดรปในหนานนกจะยกเลกการทำางานทนท
บอยครงทการยกเลก Thread เกดกบการทเราเลอกทจะยกเลกเฉพาะ Thread เปาหมายการยกเลก Thread เปาหมายจะเกดขนใน 2 กรณดงน
1. Asynchronous cancellation เปนการเลอกจบ Thread ทมขนาดใหญโตมาก
2. Deferred cancellation เชคดวา Thread นนหมดระยะเวลาเรยกหรอยง หรอ ใกลทจะหมดเวลากใหดวาควรจะหยดการทำางาน ถางานททำาอยเปนงานเกา
ความยากของการ cancellation อยทตำาแหนงทเราจะทำางานยกเลก Thread รวมไปถงการทเราจะยกเลก Thread ไป แลวถาเราตองการทจะกลบไปทำางานตรงสวนนนอกครงจะทำาไดอยางไร บอยครงทระบบตองการทจะกลบไปทำางานสวนทยกเลกไปแตไมสามารถกลบไปใชงานไดดงเดม ดงนนการยกเลกการทำางานของ Thread ทไมสอดคลองกนจงไมเหมาะกบการทำางานในระบบทมขนาดใหญ เมอเรามองตามระบบ cancellation ในขอแตกตางระหวาง thread ทถกยกเลกชใหเหนวาการทเราเลอกทจะยกเลก Thread นน ๆ จำาเปนตองมตวชเอาไว เพอทเราจะสามารถกลบไปทำางานเดมไดอกแมมการยกเลกไปแลว และเพอความปลอดภยกนผดพลาด เราเรยกวา cancellation point
4.4.3 Signal Handling signal ใชในระบบปฏบตการ UNIX เพอบอกถงการทำางาน
ของ process ทกำาลงทำางานอย โดยเฉพาะ signal จะมความสอดคลองหรอไมนนขนอยกบ เหตการณทกำาลงทำางานอย ทก
128
signal ไมวาจะเปนแบบสอดคลองหรอไมสอดคลอง มรปแบบดงตอไปน
1. signal ทแบงออกตามความจำาเพาะ ของเหตการณ นนๆ2. signal ทแบงออกตาม process ททำางานอย
3. แบงตามประเภท ผใชงาน ทก ๆ signal จะตองมตวควบคม และตวควบคมแบงออกได
ดงน ตวควบคมอตโนมต ตวควบคมทผใชกำาหนด
ทก signal จะมตวควบคมอตโนมต เมอมการทำางานบน kernel เมอมการเรยกใชงาน และการกระทำาพนฐานของ signal จะถกเปลยน เมอม user defined signal handler เขามาควบคมแทน signal จะถกเปลยนเสนทาง บางครง signal กจะถกปลอยไวเฉย ๆ จนมการยกเลกโปรแกรม สำาหรบการใชงานแค Thread เดยวกไมมปญหาในโปรแกรม แตถาเรานำามาใชใน multithread program แลวเราควรจะใชงาน signal อยางไร เมอไหร ตอนไหนท ควรจะสง signal
ตอไปนเปนก�รแบงแบบทวๆ ไปในกรณทสง signal สงใหเฉพาะ Thread ทมการเรยกขอ สงทกๆ ทก ๆ Thread ใน process สงเฉพาะ Thread หนงใน process มอบใหเฉพาะ Thread ทไดรบ signal สำาหรบ
process Method ทใชสำาหรบสง signal นนขนอยกบประเภท ของ
signal ดวย ยกตวอยาง signal ทไมสอดคลอง ตองการทจะสงไปบอกสาเหตท Thread อน ๆ ไมทำางานใน process ไมวาอยางไรกตาม signal ทสงไปนกไมสามารถบอกไดชดเจน แตบาง signal
129
สามารถสงไปทก ๆ Thread ไดสวนมาก multithread ใน UNIX จะขนอยกบการตอบรบของ signal อาจจะมการปดกนในบางกรณ signal ทไมมความสอดคลอง สามารถสงไปถงเฉพาะ Thread ทไมถกปดกนเทานน อยางไรกตามเพราะ signal จำาเปนตอการควบคม พน ฐาน UNIX จงมคำาสงบางตวทสามารถทำาใหควบคม signal ได ดวยการ kill( aid_t aid , int signal) ใน Window ไมมระบบรองรบ signal เทาไหร จงมการ ใช asynchronous procedure calls( ADC )ในการควบคม Thread ตางๆดเหตการณตาง ๆ ทเกดขน คลาย ๆ กบการควบคมการทำางานของ signal ใน UNIX อยางไรกตาม ADC ใน Window คอนขางมขอจำากดในการใชงาน
4.4.4 Thread Pool ในหวขอ 4.1 ทเรายกตวอยางเกยวกบ web sever ทไดรบ
การตดตอขอรองมา กจะมการสราง Thread ตางๆ เพอทจะไปแกไขปญหาทมเขามา ในทางตรงขาม การสราง Thread ตาง ๆ นนยากกวาการ แตก process อยางแนนอน และปญหาทเกดขนกบการทำา multithread นนกไมไดมนอยเชนกน
ขอ แรก คอปญหาการทเราตองเลอกตดสนใจ เกยวกบชวงเวลา กบความสำาคญของแตละ Thread ในการทเราจะนำาไปจดคว ไวทำางานใหเสรจเปนงาน ๆ ไป อยางทสอง การกงวลกบปญหาบางอยาง ถาเรายอมรบขอเรยกรองทก ๆ ขอทเรยกรองมาก จะทำาใหเราไมมขอบงชถงลำาดบ การกระทำาทจะเขามาทำางานรวมกนในระบบ ทรพยากรเครอง ไมวาจะเปน CPU เวลา หรอ แมกระทงหนวยความจำา จะถกใชหมดไปกบ Thread งานทมจำานวนมหาศาล ดงนนจงมกระบวนการหนงถกนำาขนมาใชเรยกวา Thread Pool
แนวคด thread pool คอการนำาตวเลขมาไวท thread ในแตละ process ทจะทำางานและ จดหาพนททมาสำารองไว คอ pool และใหแตละ thread รอการเรยกใชงานตามตวเลขทไดรบ
130
เมอ sever มการตอบรบ จากการรองขอ มนกจะออกมาจาก pool มาทำาหนาทใหเสรจแลวตอบกลบเมอทำางานเสรจแลวจงกลบไปท pool เหมอนเดมรอการเรยกครงตอไป แตถา pool เตม ไมสามารถรบ thread ไดแลว ระบบกตองรอจนกวาจะมทวาง จงสามารถทำางานอยางอนได
ประโยชน ของแนวคดน1.ตอบสนองกบสงทเรยกขอเรวกวาเดม2.จำากดการใชทรพยากรในเครองได
ตวเลขของ thread ใน pool สามารถชวยแกปญหาการจดลำาดบในการเรยกใชไดเปนอยางด เพราะไดคำานงถง ปจจยหลาย ๆ ดาน ทงดาน CPU พนทใน memory และ กลมทมความตองการในดานเดยวกน
ใน Win32 API มการจดหา function ทเกยวของกบ thread pool การใช thread pool ใน API การสราง thread นน ม function ในการสรางคอ Thread Create() มการพดถงแลวใน 4.3.2 ตวรปแบบ function ประกอบดวยดงน
DWORD WINAPI PoolFunction ( AVOID Parameter)
{/*** this function runs as a separate thread.**/
}
ตวชใน PoolFunction() จะสงคาหนงไปยง thread pool API แลวจงดำาเนนการตอไป โดยมตว QueueUserWorkItem() เปน function ทอยใน pool API ไวสงคา parameter กลบม 3 ตว ดงน
- LPTHREAD_START_ROURINE เปนตวชไปยง function
131
- PVOID เปนคา parameter ทตองการสงไปดำาเนนการ
- ULONG เปนตวบงชวาจะดำาเนนการแบบไหน
ตวอย�งก�รสงค� QueueUserWorkItem(&PoolFunction, NULL, 0);
การสราง thread จาก programmer จากการเรยกใช function PoolFunction() ดงตวอยางน ไมมการสงคา parameter ใด ๆ ไป และ Flag เปน 0 คอ ไมไดสงใหทำาคำาสงพเศษ ใด ๆ เราไดสราง thread ทไมไดใสคำาสงพเศษใด ๆ ลงไปขนมาสงอน ๆ ทไดมการจดเกบไวใน Win32 thread pool API กคอสวนทชวยเหลอตาง ๆ ทมประโยชน ในตางชวงเวลาของการเขาถง Thread ของ I/O ใน java.ultil.concurrent package ใน Java 1.5 กไดจดหาสงทมประโยชนและชวยเหลอ ทเกยวกบ thread pool ไวใหดวย
4.4.5 Thread -Specific Data thread เปนสวนหนงของ process ทใชขอมลรวมกบ
process จรง ๆ แลวการทนำาขอมลมาใชรวมกนทำาใหเกดประโยชน ตอการ multithread programming ดวย อยางไรกตาม ในบางสถานการณ thread กสมควรทจะม ขอมลเปนของตวเองโดดชดเจน เราจะเรยกขอมลสวนนวา thread-specific data ตวอยาง ในการดำาเนนการระหวาง process ในระบบ เราควรทจะมการรองรบการดำาเนนการในแตละ thread นอกจากนแตละการดำาเนนการนาจะมสงทบงบอกเปนลกษณะ เฉพาะการเชอโยงแตละ thread ทมความแตกตางกนน เราจะใช thread-specific data
132
4.4.6 Scheduler Activations สดทายนเราจะพจารณาถงการเชอมตอระหวาง kernel และ thread library ใน multithread programs อยางไหนจะเปนทตองการ ระหวาง many-to-many และ two level model จงมการปรบปรงและเพมเตมใหเปนทยอมรบและกลายเปนรปแบบทดทสด
หลายระบบทมการจดเตรยมรองรบไว เฉพาะ แคแบบใดแบบหนงเทานน ระหวาง many-to-many และ two level model ถาใชโครงสรางทเปนกลางระหวาง ผใชงาน และ kernel thread จะตองม lightweight process หรอ LWP ดงรปทแสดงดานบน (figure 4.9)เปนตวทำาหนาทประสานงานสวนกลาง โดยจะสามารถสรางตาราง Schedule เพอเปนตารางในการควบคมการทำางานของ thread ของ user ได แตละ LWP จะเชอมตอกบ kernel thread และ kernel thread จะเปนตวประมวลผลงานแตละงาน
133
ทผานเขามาถา มการปดกนเกดขนในชนน ระหวางผใชกบ LWP กจะถกปดไปดวย
แตละ application ตองการลำาดบของ LWP เพอทจะชวยใหสามารถทำางานไดอยางมประสทธภาพ ปกตแลว application ตางๆสามารถทำางานไดถาม LWP เพยงพอ สวน application ทเกยวกบ I/O ทมความละเอยดสง ตองใช LWP หลากหลายตวในการทจะใหสามารถทำางานได
รปแบบหนงในการเชอมตอระหวาง user thread library และ kernel เรยกวา scheduler activation มการทำางานในรปแบบท kernel จะจด application กบผดำาเนนการ (LWPs)และ application สามารถเลอกตาราง user thread ทเหมาะแกการประมวลผล นอกจากน kernel จะตองแจงให application ทราบถงงานทไดรบ ขนตอนนเรยกวา up-call จะมการจดการขนตอนนโดยม thread library และ up-call handler จะทำางานในระบบประมวลผลเสมอนและจะมตวททำาหนาทสงสญญานบอกเมอ application ถก block อกรปแบบหนง kernel จะทำาการ up-call ไปยง application ใหทราบวา thread ถก block และสามารถระบ thread ไดชดเจน kernel จะจดหาตวประมวลผลใหม ให application โดยกอนทจะมาทำางานทหนวยประมวลผลใหม application จะตองจำาสถานะ ในทเดมไว แลวทำาการยกเลกการทำางานทเดม แลวมาทำางานในหนวยประมวลผลใหมแทนการ up-call handle จะมการเลอก application ทมความเหมาะสมทจะขนมาทำางานแทน application เดมทถก block เมอ อยในสถานะ ถก block จะตองรอจนกวา kernel จะเรยกใชงานจงสามารถกลบไปทำางานได
134
4.5 Operating-System Exampleในสวนน เราจะดวา thread ใน windows XP และ Linux
นนจะมการทำางานอยางไร
4.5.1 Windows XP Thread Windows XP ใชตว implement เปน Win32
Application Programming Interface เปน Library เปน API หลกของตระกลระบบปฏบตการ Microsoft จรง ๆ และจะกลาวถงอะไรในการนำาไปประยกตใชในระบบปฏบตการ
โปรแกรม Windows XP จะทำางานโดยแยกโปรเซสและแตละโปรเซสจะประกอบดวย thread หนง thread หรอมากกวานน Win32 api ทใชในการสราง thread จะอยในหวขอท 4.3.2 Windows XP จะใช การอธบายแบบ one to one หมายถง Kernel thread 1 หนวย กบ User thread 1 หนวย ซงระบบปฏบตการจะยอมให thread อนประมวลผลไดเปนระบบขนาน ททำางานแบบมลตโปรเซสเซอร มการใชหลกการนอยในระบบปฏบตการ Windows ในปจจบน โดยโมเดลนตองไมยอมใหสราง user thread มากเกนไป จะอยในหวขอท4.2.2
องคประกอบทวไปของ Thread มดงน Thread ID เปนตวบงบอกถง Thread แตละตว Register เปนการเซทตวแทนคาของตวคำาสง User stack จะถกใชเมอ thread ทำางานอยใน user
mode และ kernel stack จะถกใช เมอ thread ทำางานอยใน kernel mode Private storage area register set, stacks และ Private storage area รวม
เรยกวา context of the threadsโครงสรางขอมลหลกของ thread ประกอบดวย:
135
ETHREAD (executive thread block) KTHREAD (kernel thread block) TEB (thread environment block)
องคประกอบขอ ETHREAD ประกอบไปดวย pointer ทเปนตวชโปรเซสของ thread และ หนาทของ Address ซง ควบคมโดย thread start control ETHREAD โดยสวนใหญจะม pointer ทสอดคลองกนคอ KTHREAD KTHREAD ประกอบดวย ตารางและขอมลทสอดคลองกนของ thread และยงม kernel stack ทจะทำางานใน mode kernel ตวชไปยง TEBETHREAD และ KTHREAD ทอยใน kernel space นนหมายความวามนจะอยเฉพาะใน kernel เทานน
TEB คอโครงสรางขอมลทอยใน user-space ทผานเขามาเมอ thread ทำางานอยใน user mode ในขณะทมนอยในพนทอนทไมใช user space มนจะประกอบดวยตวช thread user mode stack และ array สำาหรบ thread
4.5.2 Linux Threads Linux มกจะเรยกวา task มากกวาเรยกวา thread การ
สราง thread ใช clone() system call clone() ยอมให child task ใช address space รวมกนกบ parent task (process) ตวอยางเชน ถา cone() ผานแลว flag ของ CLONE_FSCLONE_VMCLONE_SIGHAND และ CLONE_FILES task ของ parent and child จะแชรขอมลระบบไฟลเดยวกน ใชหนวยความจำา
136
เดยวกน ใชตวสงสญญาณเดยวกน และตดตงการเปดไฟลเหมอนกน การใชClone() ทเปนทนยมเทากบเปนการสราง Thread (จะอธบายในบทน )เมอ parent task แชรทรพยากรสวนใหญใหกบ child task อยางไรกตามถาไมเซทรปแบบของ Flag เมอทำาการ clone()มนจะทำาใหไมสามารถแชรไดผลลพธในฟงกชนนคลายกบการเรยกใช fork()
ระดบของการแชรมดวยกนหลายระดบซงเปนไปไดเพราะวางานททำาแทนอยใน Linux kernel โครงสรางขอมล kernel พเศษนมอยในแตละ task ในระบบ โครงสรางขอมลนเปนเหมอนการเกบขอมลของ task เอาไว ซงม pointer เปนตวชไปยงโครงสรางขอมลอนทขอมลเหลานถกเกบไวตวอยางเชนโครงสรางขอมลของการแทนแบบ list ผลคอ จะม task ใหมถกสรางขนมา และมการสำาเนาขอมลทงหมดของโครงสรางขอมลของ parent process ทมความเกยวเนองกนไปควบคกน task ใหมทสรางขนมาเมอทำาการ clone() จะถกสรางขนมาอยางไรกตามมนแทนทจะสำาเนาขอมลทงหมดของโครงสรางขอมล ใหกำาหนดจดของ task ใหมไปยงโครงสรางขอมลของ parent task ขนอยกบเซทคาของ flag ใหผาน ในการ clone()
สรปThread เปนการควบคมการทำางานภายในของโปรเซส
Multithreaded โปรเซสจะประกอบไปดวย thread ททำาหนาทตางกนแตทำางานอยบน address เดยวกนขอดของ Mulithreding ประกอบไปดวย การเพมการตอบสนองตอผใช ทงแชร ทรพยากรในโปรเซส ความประหยดและความสามารถของ task ในสถาปตยกรรมแบบ Multiprocessor
137
ในระดบของ user thread คอสงทโปรแกรมเมอรมองเหนและ ระบบปฏบตการ kernel จะสนบสนนจดการในระดบ kernel โดยทวไปแลว user-level จะเรวกวาในการสรางและจดการมากกวา kernel thread และไมกาวกายสงท kernel ตองการ
3 รปแบบทแตกตางกนของ ความสมพนธของ model ระหวาง user thread กบ kernel thread ดงน
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 อนเขามาประมวลผลกอนได
ระบบปฏบตการททนสมยสวนใหญจะให kernel สนบสนน thread ในระบบ OS แบบ Windows 98 NT 2000 และ XP และยงม Solaris ของ Linux อกดวย
138
thread library จะใหโปรแกรมเมอรทจดการเกยวกบ application เพอสรางและจดการเกยวกบ thread Thread Library มอย3 สวนหลก ๆ คอ
POSIX Pthreads Win32 threads Java threads