630 likes | 875 Views
บทที่ 5 Process Scheduling. 5.1 Basic Concepts
E N D
บทที่ 5 Process Scheduling
5.1 Basic Concepts ในระบบโปรเซสเดี่ยว มีหนึ่งโปรเซสเท่านั้นที่สามารถทำงานได้ในเวลามีสิ่งอื่นต้องคอยจนกระทั่ง CPU ว่าง จุดประสงค์ในหลาย ๆ โครงการคือต้องมีโปรเซสทำงานตลอดเวลา การใช้ CPU ให้เป็นประโยชน์ เป็นแนวความคิดที่มีความสัมพันธ์กันอย่างง่าย โปรเซสที่ทำให้สำเร็จจนกระทั่งมันเป็นการรอคอยตามแบบอย่างเพื่อให้เสร็จ ในระบบคอมพิวเตอร์อย่างง่าย CPU เพิ่งจะเป็นสิ่งที่ไม่มีประโยชน์ เวลาที่ใช้ในการคอยทั้งหมดใช้ไม่ได้ ไม่มีประโยชน์ในการทำงานที่สำเร็จ ทั้งโปรแกรมที่หลากหลาย พวกเราพยายามใช้เวลาเพื่อทำให้เกิดขึ้น หลาย ๆ กระบวน
ชนิดของรายการมีความสำคัญกับหน้าที่ในระบบต่าง คอมพิวเตอร์เกือบทั้งหมดมีตารางการทำงานก่อนการใช้งาน แน่นอน CPU เป็นหนึ่งแหล่งค้นหาในคอมพิวเตอร์ที่เป็นดั้งเดิม เช่นนี้เองทำให้ศูนย์กลางการทำงานของระบบเป็นผู้ออกแบบตารางการทำงาน
5.1.1CPU-I/O Burst Cycle ตารางการทำงานของ CPU จะสำเร็จได้ต้องไว้ใจและปฏิบัติตามคุณสมบัติของโปรเซส โปรเซสที่ทำให้สำเร็จประกอบขึ้นด้วยวงล้อต่าง ๆ โปรเซสต่าง ๆ ที่สลับระหว่างสองสถานะ ความสำเร็จในโปรเซสเริ่มต้นด้วยการระเบิดของ CPU ในที่สุด สุดท้ายของ CPU จะมีการร้องขอให้จบอย่างสำเร็จ
5.1.2 CPU Scheduler เมื่อไรก็ตามที่ CPU กลายเป็นสิ่งที่ไม่จำเป็น ระบบจึงจำเป็นต้องคัดเลือกหนึ่งโปรเซสเตรียมพร้อมเพื่อให้แผนการสำเร็จ การคัดเลือกโปรเซสนั้นต้องทำตามรูปแบบการบริหารโดยเป็นตารางการทำที่สั้น ๆ ตารางที่เลือกจากโปรเซสที่จดจำแบ่งให้ CPU นั้นประสบความสำเร็จ แถวของเครื่องหมายต่าง ๆ ไม่จำเป็นสิ่งแรก ถ้าเราจะให้เห็นเราควรพิจารณาหลาย ๆชนิดในตารางต่างๆ แถวที่พร้อมสามารถเป็นเครื่องมือแก่แถวของ FIFO แถวลำดับ หรือรายชื่อที่เชื่อมต่อ แนวความคิด อย่างไรก็ตามโปรเซสทั้งหมด เชื่อมต่อโอกาสที่ CPU ทำงาน การบันทึกของแถวในโปรเซสทั่วไปสามารถควบคุมอยู่ในโปรเซส
5.1.3 การให้สิทธิการจัดเวลา (preemptive Scheduling) เป็นโปรเซสที่ระบบจะต้องตัดสินใจหรือเลือกเมื่อมีเหตุการณ์หนึ่งเกิดขึ้น คือ 1. เมื่อโปรเซสเปลี่ยนสถานะจาก กำลังทำงาน เป็น กำลังรอคอย (เช่นผลของการเรียกร้อง(request) input/output หรือคำขอร้องของการรอจากสถานะสิ้นสุดของโปรเซสลูก) 2. เมื่อโปรเซสเปลี่ยนสถานะจากกำลังทำงานเป็นสถานะพร้อมเช่นเมื่อเกิดการ interrupt 3. เมื่อโปรเซสเปลี่ยนสถานะจากกำลังรอคอยเป็นสถานะพร้อมเช่นเมื่อ Input/Output เสร็จสิ้นไปแล้ว 4. เมื่อโปรเซสสิ้นสุด
การ โปรเซสจะเก็บ CPU จนกระทั่งปล่อยออกจาก CPU โดยเหตุการณ์หรือสลับไปที่สถานะการรอ สถานการณ์นี้ใช้ Microsoft Windows 3.x Window 95 แนะนำจากตาราง preemptive และลำดับย่อยทั้งหมดเวอร์ชันของระบบปฏิบัติการ window มีการใช้สิทธิ์การจัดเวลา ระบบปฏิบัติการ Mac OS X จาก Macintoshใช้ตาราง preemptive ก่อนเวอร์ชันของระบบปฏิบัติการ Macintosh ขึ้นอยู่กับตาราง cooperative ตารางcooperativeเป็นเพียงวิธีสามารถใช้แบบฟอร์มของฮาร์ดแวร์เพราะว่ามันไม่เรียกฮาร์ดแวร์พิเศษ
ตาราง preemptive เก่าก่อให้เกิดความสัมพันธ์กับราคาจากการแบ่งข้อมูล พิจารณ์จากเคสของสองโปรเซสจากการแบ่งข้อมูล ในขณะที่หนึ่งเป็นการแก้ไขข้อมูลมันเป็น preempted ดังนั้นโปรเซสที่สองสามารถรันได้ โปรเซสที่สองพยายามอ่านข้อมูลนั่นเป็นในสถานะขัดแย้งกัน ในสถานการณ์พวกเราจำเป็นก่อให้เท่ากันในการแบ่งกันของข้อมูล Preemption กระทบการออกแบบของระบบปฏิบัติการส่วน kernel ในระหว่างของโปรเซส system call kernel อาจจะยุ่งจากกิจกรรมตัวแทนของโปรเซส เหมือนกิจกรรมอาจจะเกี่ยวพันกับการเปลี่ยนความสำคัญของkernelข้อมูล
5.1.4 ตัวส่งต่อ (Dispatcher) ส่วนประกอบอื่น ๆ ที่เกี่ยวข้องในฟังก์ชั่น CPU-scheduling เป็น dispactcher.Dispatcher นี้เป็นmodule ที่ควบคุมให้ของ CPU โปรเซสที่เลือกโดยตารางที่สั้น ฟังก์ชั่นนี้เกี่ยวข้องดังต่อไปนี้ 1. เปลี่ยนงาน (Swishing Context) 2. เปลี่ยนไปเป็นช่วงผู้ใช้ (User Mode) 3. ย้ายการควบคุมไปที่บรรทัดคำสั่งในโปรแกรมผู้ใช้ เพื่อรีสตาร์ทโปรแกรมนั้น
5.2การพิจารณาการจัดตารางเวลา (Scheduling Criteria) อัลกอริทึมการจัดตารางเวลาของซีพียูที่แตกต่างกัน ย่อมมีคุณสมบัติที่แตกต่างกัน ดังนั้นในการเลือกอัลกอริทึมมาใช้งาน เราต้องพิจารณาว่าอัลกอริทึมใดมีคุณสมบัติเหมาะสมกับงานนั้นที่สุด
เกณฑ์การพิจารณาที่ใช้สำหรับเปรียบเทียบอัลกอริทึมการจัดตารางเวลาของซีพียูมีหลายเกณฑ์ ซึ่งสามารถนำมาเปรียบเทียบเพื่อตัดสินว่าอัลกอริทึมใดดีที่สุดได้ เกณฑ์ดังกล่าวมีดังนี้ • การใช้งานซีพียู (CPU utilization) เกณฑ์นี้จะคิดอัตราการใช้งานของซีพียูเป็น % ซึ่งในระบบจริงมันจะอยู่ระหว่าง 40 เปอร์เซ็นต์ (กรณีที่ระบบถูกใช้งานเพียงเล็กน้อย) ถึง 90 เปอร์เซ็นต์ (กรณีที่ระบบถูกใช้งานอย่างหนัก) • ประมาณงาน (Throughput) เกณฑ์นี้จะพิจารณาที่จำนวนโปรเซสที่ทำงานเสร็จภายใน 1 หน่วยเวลา ถ้าโปรเซสใดยาวมาก 1 โปรเซสนั้นอาจทำงานเสร็จภายในเวลา 1 ชั่วโมง แต่โปรเซสที่สั้น 10 โปรเซสอาจทำงานเสร็จภายในเวลา 1 วินาที
เวลาโดยรวม (Turnaround time) เกณฑ์นี้จะพิจารณาเวลาตั้งแต่เริ่มต้นนำโปรเซสเข้าไปทำงานจนถึงโปรเซสจบการทำงาน เป็นผลรวมของระยะเวลาที่สูญเสียไปในการรอเข้าสู่หน่วยความจำ, การรอคอยใน Ready Queue, การประมวลผลใน CPU และการรับข้อมูลเข้าและแสดงผลข้อมูล • เวลาคอย (Waiting time) เกณฑ์นี้จะพิจารณาเวลาทั้งหมดที่โปรเซสใช้ไปในการรอคอยใน Ready Queue • เวลาตอบสนอง (Response time) เกณฑ์นี้จะพิจารณาเวลาตั้งแต่เริ่มต้นจนเกิดการตอบสนองเป็นครั้งแรก
อัลกอริทึมที่ดีควรมีการใช้งานซีพียู (CPU utilization) และการประมาณงาน (Throughput) สูงที่สุด ส่วนเวลาโดยรวม (Turnaround time), เวลาคอย (Waiting time) และเวลาตอบสนอง (Response time) ต่ำที่สุด ในกรณีส่วนใหญ่เราจะใช้ค่าเฉลี่ยที่เหมาะสม อย่างไรก็ตาม ภายใต้บางสถานการณ์อัลกอริทึมที่ดีควรใช้ค่าที่สูงที่สุดหรือค่าที่ต่ำที่สุดอย่างเหมาะสมแทนที่จะใช้ค่าเฉลี่ย ตัวอย่างเช่น รับประกันว่าผู้ใช้ทุกคนจะได้รับบริการที่ดี เราอาจต้องการลดเวลาการตอบสนองให้มากที่สุด
5.3อัลกอริทึมการจัดตารางการทำงาน (Scheduling Algorithm) ซีพียูจัดการตารางการทำงานเกี่ยวกับปัญหาการตัดสินใจของโปรเซสที่รออยู่ในสถานะพร้อมที่สุดซึ่งจะถูกจัดสรรในซีพียู มีหลายอัลกอริทึมการจัดตารางการทำงานที่แตกต่างกัน ในส่วนนี้จะอธิบายถึงอัลกอริทึมหลาย ๆ แบบ
5.3.1 การจัดตารางการทำงานแบบมาก่อนได้ก่อน (First-Come, First-Served Scheduling) อัลกอริทึมการกำหนดเวลาอย่างง่าย คือ อัลกอริทึมการจัดตารางการทำงานแบบ FCFS (First-Come, First-Served) เมื่อเริ่มทำงานโปรเซสไหนส่งคำร้องไปที่ซีพียูก่อน ซีพียูก็จะจัดสรรให้ก่อน วิธีการนี้ดำเนินการโดยมีนโยบาย FCFS ที่สะดวกกับการจัดการคิวแบบ FIFO เมื่อเข้าสู่โปรเซสและคิวพร้อมแล้ว PCB จะมีการเชื่อมโยงเข้าสู่ส่วนหางของคิว เมื่อซีพียูว่างจะจัดสรรโปรเซสเข้าสู่ส่วนหัวของคิว ทำการรันโปรเซสนี้แล้วลบออกจากคิว โค้ดสำหรับการเขียนการจัดตารางการทำงานแบบ FCFS นั้นง่ายและสามารถเขียนให้เข้าใจได้
นอกจากนี้จะพิจารณาประสิทธิภาพการจัดตารางการทำงานแบบ FCFS แบบไดนามิค สมมติว่าเรามีโปรเซส CPU-bond หนึ่งโปรเซสและมีโปรเซส I/O-bond หลายโปรเซส เนื่องจากโปรเซสได้ไหลไปรอบ ๆ ระบบ สถานการณ์เช่นนี้จะส่งผลที่ CPU-bond จะได้รับและถือซีพียู ในระหว่างนี้โปรเซสอื่น ๆ ที่มีการส่งค่าเข้าออกเสร็จสิ้น และจะเคลื่อนย้ายเข้าสู่คิวต้องรอซีพียูด้วย
5.3.2 การจัดตารางการทำงานแบบสั้นสุดได้ก่อน (Shortest-Job-First Scheduling) อีกวิธีในการกำหนดเวลาของ CPU คือ อัลกอริทึมการจัดตารางการทำงานแบบ SJF (shortest-job-first) อัลกอริทึมนี้แต่ละโปรเซสจะมีความยาวของโปรเซสครั้งถัดไปของซีพียูไว้ด้วย ถ้าซีพียูถัดไปมีสองโปรเซสเหมือนการจัดตารางการทำงานแบบ FCFS ที่ใช้การหยุดชั่วคราว (หมายเหตุ: วิธีการที่เหมาะสม คือ ใช้อัลกอริทึมแบบ shortest-nest-CPU-burst) เพราะการจัดตารางเวลาขึ้นอยู่กับความยาวของซีพียูตัวถัดไปของโปรเซสมาแทนที่ผลรวมของความยาว เราใช้คำว่า SJF เพราะว่าส่วนมากแล้วผู้คนและตำราต่าง ๆ มักใช้คำเหล่านี้อ้างถึงประเภทของการจัดตารางการทำงาน
ความยากที่แท้จริงของอัลกอริทึม SJF คือการรู้ว่าความยาวถัดไปหลังจากส่งคำขอไปที่ซีพียู สำหรับเวลาระยะยาว (งาน) การจัดตารางการทำงานในชุดโปรเซสที่เราสามารถใช้งานได้เป็นระยะ โปรเซสจำกัดเวลาที่ผู้ใช้งานระบุเมื่อเขาส่งงานมา ดังนั้นเมื่อผู้ใช้มีการประมาณโปรเซสของการจำกัดเวลาอย่างถูกต้อง ถ้ามันมีค่าต่ำอาจหมายความว่าจะตอบสนองได้เร็วกว่า (ค่าที่ต่ำเกินไปจะทำให้เวลาจำกัดเกิน จนเกิดข้อผิดพลาดและต้องทำการส่งใหม่) การจัดตารางการทำงานแบบ SJF มีการใช้บ่อยในการกำหนดเวลาระยะยาว
อัลกอริทึม SJF สามารถทั้งแทรกกลางคันได้หรือห้ามแทรกกลางคัน สำหรับตัวเลือกเมื่อเกิดโปรเซสใหม่ในคิวขณะที่โปรเซสก่อนหน้ายังคงรันอยู่ ซีพียูถัดไปของโปรเซสใหม่อาจจะสั้นกว่าโปรเซสที่รันอยู่ในขณะนี้ การแทรกกลางคันในอัลกอริทึม SJF นี้ โปรเซสทำงานในขณะที่อีกโปรเซสยังรันอยู่ได้ ในทางตรงกันข้ามการห้ามแทรกกลางคันในอัลกอริทึม SJF นี้ โปรเซสจะทำงานได้ก็ต่อเมื่อซีพียูทำการประมวลผลเสร็จแล้ว การแทรกกลางคันของการจัดตารางเวลาแบบ SJF บางครั้งเรียกว่า เวลาที่สั้นที่สุดจะทำก่อน (shortest-remaining-time-first scheduling)
5.3.3 การจัดเวลาตามลำดับความสำคัญ (Priority Scheduling) ขั้นตอนวิธี SJF เป็นกรณีพิเศษของขั้นตอนวิธีการจัดเวลาตามลำดับความสำคัญทั่วไป ความสำคัญจะมีส่วนเกี่ยวข้องแต่ละโปรเซส และซีพียูจะกำหนดโปรเซสที่มีความสำคัญมากที่สุด ส่วนโปรเซสที่มีความสำคัญที่เท่ากันจะจัดลำดับแบบ FCFS ขั้นตอนวิธี SJF เป็นขั้นตอนที่ตามลำดับความสำคัญ โดยที่ความสำคัญจะแปรผกผันกับ CPU Burst ถ้า CPU Burst มีขนาดใหญ่ความสำคัญก็จะน้อย
5.3.4 การจัดเวลาตามลำดับแบบวนรอบ (Round-Robin Scheduling) ขั้นตอนวิธีการจัดเวลาแบบวนรอบถูกออกแบบมาเพื่อระบบแบ่งเวลา ซึ่งมีลักษณะคล้ายกับการจัดเวลาแบบ FCFS แต่สิทธิจะเพิ่มระหว่างโปรเซส หน่วยของเวลา เรียกว่า time quantum หรือ time slice,time quantum จะมีช่วงระหว่าง 10 ถึง 100 มิลลิวินาที ready queue จะรักษา circular queue ตัวจัดการซีพียูจะไปกำหนดรอบ ๆ ready queue ซึ่งจะจัดสรรซีพียูให้กับแต่ละโปรเซสในเวลา 1 time quantum สิ่งที่สำคัญของการจัดเวลาแบบ RR เป็นการเรียงคิวแบบ FIFO ซึ่งโปรเซสใหม่จะต่อท้าย ready queue ตัวจัดการซีพียูเลือกโปรเซสแรกจาก ready queue จะตั้งเวลาหยุดหลังจาก 1 time quantum และจัดการโปรเซส
หนึ่งในสองสิ่งที่เกิดขึ้น โปรเซสต้องมี CPU Burst อย่างน้อย 1 time quantum ในกรณีนี้ โปรเซสจะปล่อยให้กับซีพียูเอง ตัวจัดการจะดำเนินการโปรเซสต่อไปใน ready queue อีกอย่างหนึ่ง ถ้า CPU Burst ของโปรเซสที่ทำงานอยู่นานเกิน 1 time quantum ตัวจับเวลาจะทำการออกและ หยุดการทำงานของระบบปฏิบัติการ context switch จะดำเนินการ และกระบวนจะวางไว้ท้าย ready queue ตัวจัดการซีพียูจะเลือกโปรเซสถัดไปใน ready queue
เวลาเฉลี่ยที่รอตามวิธีการ RR จะเริ่มเวลาที่ 0 ด้วยความยาวของ CPU Burst ในหน่วยเวลา มิลลิวินาที ProcessBurst Time P1 24 P2 3 P3 3 ถ้ากำหนดให้ 1 time quantum = 4 มิลลิวินาที โปรเซส P1ใช้ 4 มิลลิวินาทีแรก แต่เนื่อง P1 ยังต้องการอีก 20 มิลลิวินาที ซีพียูจึงต้องให้โปรเซส P2 แต่ P2 ใช้เวลาไม่ถึง เพราะ P2 ใช้เวลาเพียง 3 มิลลิวินาที ซีพียูจึงให้โปรเซส P3 แต่ P3 ใช้เวลาไม่ถึง โปรเซส P1จึงกลับมาใช้ซีพียูต่อได้ ค่าเฉลี่ยของการรอ คือ 17/3 = 5.66 มิลลิวินาที (คือ เวลา ( 0+7+10)/3)
การดำเนินการของขั้นตอนวิธีการจัดเวลาตามลำดับแบบ RR ขึ้นอยู่กับขนาดของ time quantum ถ้า time quantum มีขนาดใหญ่ หลักการ RR จะเหมือนกับหลักการ FCFS แต่ถ้า time quantum มีขนาดเล็ก (เช่น 1 มิลลิวินาที) วิธีการ RR เรียกว่า process sharing และ (ในทฤษฎี) สร้างลักษณะให้กับแต่ละโปรเซสในการรันแต่ละโปรเซสของมัน 1/n ความเร็วของตัวดำเนินการจริง วิธีการนี้ใช้ใน Control Data Corporation (CDC) ซึ่งมีความสำคัญ โดยที่ฮาร์ดแวร์หนึ่งตัวจะใช้ริจีสเตอร์ 10 ตัว
ในซอฟแวร์จะต้องพิจารณาผลกระทบของ context switch บนการจัดเวลาตามลำดับแบบ RR เริ่มที่โปรเซสหนึ่งใช้เวลา 10 หน่วยเวลา ถ้า quantum เท่ากับ 12 หน่วยเวลา โปรเซสจะเสร็จเร็วกว่า 1time quantum แต่อย่างไรก็ตามถ้า quantum เท่ากับ 6 หน่วยเวลา โปรเซสจะกำหนด 2 quanta จะทำให้มีผลกับ context switch ดังรูป
5.3.5 Multilevel Queue Scheduling คลาสอื่นของ อัลกอริทึมการกำหนดตารางเวลา มีการสร้างเพื่อสถานการณ์ในกระบวนการที่ง่ายดายในการจัดสิ่งที่แตกต่างลงในกลุ่ม หลาย ๆ ระดับคิวของอัลกอริทึมการกำหนดตารางเวลา ส่วนของคิวที่เตรียมพร้อมในหลาย ๆ คิวที่แยกกัน มีโปรเซสถาวรที่กำหนดหนึ่งคิว โดยทั่วไปตามบางคุณสมบัติของโปรเซส เช่น ขนาดหน่วยความจำ ความสำคัญของโปรเซสหรือชนิดของโปรเซส แต่ละคิวมีอัลกอริทึมการกำหนดตารางเวลาของตัวเอง ตัวอย่างเช่น การแบ่งแยกคิวอาจจะใช้สำหรับโปรเซสส่วนหน้าและโปรเซสส่วนหลัง คิวที่อยู่ส่วนหน้าอาจจะตั้งเวลาโดย RRอัลกอริทึม ในขณะที่คิวส่วนหลังเป็นการตั้งเวลาโดย FCFS อัลกอริทึม
ตัวอย่างของคิวในหลาย ๆ ระดับของอัลกอริทึมการกำหนดตารางเวลากับห้าคิว ที่แสดงด้านล่างตามลำดับของความสำคัญ • โปรเซสของระบบ (System processes) • โปรเซสโต้ตอบ (Interactive processes) • โปรเซสแก้ไขโต้ตอบ (Interactive editing processes) • โปรเซสที่เป็นชุด (Batch processes) • โปรเซสลูกศิษย์ (Student processes)
แต่ละคิวที่มีความสำคัญมากกว่าคิวที่มีความสำคัญต่ำกว่า ไม่มีโปรเซสในคิวที่เป็นชุด ตัวอย่างเช่น มันสามารถทำงานนอกเหนือจากคิวสำหรับโปรเซสของระบบ โปรเซสโต้ตอบและโปรเซสแก้ไขโต้ตอบว่างเปล่าทั้งหมด ถ้าโปรเซสแก้ไขโต้ตอบถูกป้อนพร้อมคิวในขณะที่ชุดของโปรเซสถูกประมวลผลชุดของโปรเซสจะได้รับสิทธิพิเศษ ทางอื่นที่เป็นไปได้คือเวลาถูกแบ่งในหมู่คิว แต่ละคิวจะได้รับเวลาบางส่วนของ CPU ซึ่งสามารถกำหนดโปรเซสในการทำงานต่าง ๆ ตัวอย่างเช่น ในกรณีของคิวส่วนหน้ากับคิวส่วนหลัง คิวส่วนหน้าสามารถได้รับ 80 เปอร์เซ็นต์ของเวลา CPU สำหรับการกำหนดแบบ RR ในกลุ่มของโปรเซสเหล่านี้ แต่ทว่าคิวส่วนหลังจะได้รับ 20 เปอร์เซ็นต์ของ CPU เพื่อโปรเซสดังกล่าวบนพื้นฐานของ FCFS
5.3.6 Multilevel Feedback-Oueue Scheduling โดยปกติเมื่ออัลกอริทึมในการกำหนดเวลาของคิวหลาย ๆ ระดับถูกใช้เป็นโปรเซสถาวรที่กำหนดคิวเมื่อเข้าไปในระบบ ถ้าแบ่งคิวเป็นโปรเซสส่วนหน้าและโปรเซสส่วนหลัง ตัวอย่างเช่น โปรเซสจะไม่เคลื่อนย้ายจากคิวหนึ่งไปยังคิวอื่น ตั้งแต่เป็นโปรเซสจะไม่เปลี่ยนธรรมชาติของส่วนหน้าหรือส่วนหลัง การติดตั้งนี้มีประโยชน์จากการตั้งเวลาที่ต่ำเหนือขึ้นไป แต่มันไม่ยืดหยุ่น
อัลกอริทึมการกำหนดเวลาแบบ feedback-queue หลายระดับ ตรงกันข้ามมันยอมให้โปรเซสสามารถเคลื่อนย้ายระหว่างคิว แนวคิดนี้ก็เพื่อแบ่งโปรเซสตามคุณลักษณะของการกระจาย CPU ถ้าโปรเซสใช้เวลา CPU มาก มันจะถูกย้ายไปเป็นคิวที่มีความสำคัญน้อย นี่เป็นเหตุการณ์ที่แยกจากการผูกพันกับอินพุต/เอาท์พุตและโปรเซสโต้ตอบในคิวที่มีความสำคัญสูง นอกจากนี้โปรเซสที่รอเป็นเวลานานในคิวที่มีความสำคัญต่ำอาจจะย้ายไปเป็นคิวที่มีความสำคัญสูงรูปแบบนี้เป็นการป้องกันการถูกละเลย
อัลกอริทึมการกำหนดตารางเวลานี้ให้ความสำคัญสูงสุดสำหรับโปรเซส ใด ๆ ที่แตกจาก CPU 8 มิลลิวินาทีหรือน้อยกว่านั้น โปรเซสดังกล่าวจะได้รับ CPU อย่างรวดเร็ว เสร็จสิ้นการที่ CPU แตกออกจะเป็นโปรเซสที่ต้องการมากกว่า 8 แต่ต่ำกว่า 24 มิลลิวินาที นอกจากนี้ยังมีการให้บริการได้อย่างรวดเร็ว ถึงแม้ว่าจะมีลำดับความสำคัญต่ำกว่าโปรเซสที่สั้นกว่า โปรเซสที่ยาวโดยอัตโนมัติต่ำลงเพื่อคิว 2 และทำงานใน FCFS ตามรายการกับวงจร CPU ใด ๆ ที่ตกค้างจาก คิว 0 และคิว 1
โดยทั่วไป การกำหนดตารางเวลาแบบ feedback-queue หลายระดับถูกกำหนดโดยพารามิเตอร์ ดังนี้ • จำนวนคิว • กลไกของการกำหนดตารางเวลาสำหรับแต่ละคิว • วิธีการที่ใช้เพื่อพิจารณาเมื่อปรับปรุงโปรเซสที่มีความสำคัญคิวสูงสุด • วิธีที่ใช้ในการตรวจสอบเมื่อใดที่มีการลดขั้นความสำคัญของคิว • วิธีการที่ใช้เพื่อตรวจสอบซึ่งโปรเซสจะถูกป้อนเมื่อโปรเซสนั้นต้องการบริการ
5.4การจัดตารางการทำงานสำหรับหลายหน่วยประมวลผล ที่ผ่านมาได้กล่าวถึงการจัดเวลาของระบบคอมพิวเตอร์ซึ่งมีซีพียูเพียงตัวเดียว แต่ถ้าจะต้องออกแบบระบบปฏิบัติการสำหรับคอมพิวเตอร์ซึ่งมีซีพียูหลายตัว การออกแบบต่าง ๆ ก็จะยิ่งเพิ่มความซับซ้อนไปอีกมาก จากอดีตถึงปัจจุบันก็ได้มีการทดลองวิธีการจัดเวลาหลาย ๆ แบบที่พอจะเป็นไปได้ แต่ก็ยังไม่สามารถสรุปได้วิธีไหนเป็นวิธีที่ดีที่สุด ซึ่งก็ไม่ต่างกับการหาวิธีที่ดีที่สุดสำหรับการจัดการระบบซึ่งมีซีพียูตัวเดียวเลย ดังนั้นในย่อหน้าต่อไป เราจะมาศึกษากันถึงวิธีการเป็นบางส่วนที่เป็นไปได้และใช้กันอย่างแพร่หลาย ในระบบที่มีซีพียูหลายตัวกันและเราก็จะจำกัดปัญหาของเราอยู่เพียงแค่ว่าซีพียูที่มีหลายตัวเป็นซีพียูที่มีลักษณะการทำงานเหมือนกันทุกประการ ซึ่งสำหรับระบบที่มีซีพียูที่แตกต่างกันนั้น ก็จะมีการกล่าวถึงในบทต่อไป
5.4.1 การเข้าถึงเพื่อที่จะจัดตารางการทำงานสำหรับหลายหน่วยประมวลผล ทางแรกในการเข้าถึงการจัดตารางการทำงานของซีพียูในระบบประมวลผลแบบหลากหลาย จะมีการใช้ซีพียูแยกต่างหากระหว่างงานภายในของระบบ เช่น พวกการจัดเวลาและการจัดระบบอื่น ๆ ออกจากพวกงานอินพุต/เอาต์พุตทั้งหลาย และกับงานที่เป็นของผู้ใช้ซึ่งการทำงานแยกกันของซีพียูแบบนี้ ทำให้การออกแบบระบบปฏิบัติการความซับซ้อนน้อยลงมาก เนื่องจากมีซีพียูเพียงตัวเดียวที่จะเข้าไปใช้ข้อมูลของระบบปฏิบัติการ เพราะว่าซีพียูอื่น ๆ ไม่ว่าจะมีกี่ตัวก็ตาม จะเข้าถึงได้เฉพาะข้อมูลของผู้ใช้ภายนอกเท่านั้นหรือที่เรียกว่า การประมวลผลแบบไม่สมมาตร (Asymmetric-multiprocessing) หมายถึงการมีโปรเซสเซอร์ตัวหนึ่งเป็นตัวควบคุม เข้าถึงโครงสร้างของข้อมูล ทำให้ช่วยลดการแบ่งปันข้อมูล
ทางที่ 2 โดยใช้ Symmetric Multiprocessing (SMP) ซึ่งแต่ละหน่วยประมวลผลจะมีตารางการทำงานของตนเองอยู่แล้ว ทุกโปรเซสจะถูกจัดลำดับมาเรียบร้อยแล้ว จากนั้นหน่วยประมวลผลก็จะทำการจัดลำดับคิวที่พร้อมและปฏิบัติการ ซึ่งเราจะได้เห็นในบทที่ 6 ถ้าเรามีหน่วยประมวลที่หลากหลายและพยายามเข้าถึงและอัพเดตโครงสร้างข้อมูล ตัวจัดตารางการทำงานก็จะรันโปรแกรมอย่างระมัดระวัง ทำให้มั่นใจได้ว่าทั้ง 2 หน่วยประมวลผลจะไม่เลือกโปรเซสที่เหมือนกันและในโปรเซสนั้น ๆ จะไม่มีลำดับที่สูญหาย ซึ่งระบบที่รองรับการทำงานแบบ SMP ได้แก่ Windows XP, Windows 2000, Solaris, Linux and Mac OS X
ถ้าหน่วยประมวลผลเป็นแบบเดียวกันหมด เราสามารถเฉลี่ยแบ่งงานกันทำได้ดีขึ้น โดยอาจให้มีแถวคอยแยกแต่ละหน่วยประมวลผล แต่วิธีนี้อาจทำให้หน่วยประมวลผลบางตัวว่างงาน ในขณะที่บางตัวงานหนัก เราจึงควรใช้แถวคอยร่วมแถวเดียวกันให้ทุก ๆ โปรเซสเข้าแถวคอยเดียวกันหมด เมื่อมีหน่วยประมวลผลใดว่าง ก็จะให้รับงานไปจากแถวคอยนี้ การจัดแถวคอยร่วมนี้ อาจแบ่งได้เป็น 2 วิธี • ให้หน่วยประมวลผลแต่ละตัวจัดตารางการทำงานเอง • กำหนดให้หน่วยประมวลผลหนึ่งมีหน้าที่จัดตารางการทำงานโดยเฉพาะ
5.4.2 Processor affinity เป็นการพิจารณาว่าจะเกิดอะไรกับ cache memory เมื่อโปรเซสถูกรันโดยหน่วยประมวลผลเฉพาะ ข้อมูลส่วนมากจะถูกป้อนโดยโปรเซสที่อยู่ภายใน cache ของหน่วยประมวลผลกลาง เนื่องจากการเข้าใช้หน่วยความจำอย่างต่อเนื่องนั้นจะถูกดำเนินการตามความพอใจของ cache memory ตอนนี้ก็จะมาพิจารณาถึงเหตุการณ์ที่จะเกิดขึ้นถ้าโปรเซสย้ายไปยังหน่วยประมวลผลอื่น ความจุของ cache memory จะต้องทำให้ใช้ไม่ได้สำหรับหน่วยประมวลผลที่ย้ายมา และ cache สำหรับหน่วยประมวลที่ย้ายมาใหม่นั้นจะถูกดึงออกมาใช้ เนื่องจากราคาที่แพงของ cache แบบ invalidating และ re-populating ทำให้ระบบ SMP พยายามหลีกเลี่ยงการย้ายโปรเซสจากหน่วยประมวลผลหนึ่งไปยังอีกหน่วยประมวลผลหนึ่งและพยายามรักษาการรันโปรเซสในหน่วยประมวลเดียวกันแทนและนี่ก็ทำให้เข้าใจว่า processor affinity คือการที่โปรเซสมีความสัมพันธ์กับหน่วยประมวลผลในขณะที่กำลังทำงานอยู่
5.4.3 Load Balancing บนระบบ SMP นั้น เป็นเรื่องสำคัญมากในการแบ่งจำนวนงานระหว่างหน่วยประมวลผล เพื่อให้สามารถทำงานได้อย่างเต็มประสิทธิภาพมากที่สุด ไม่เช่นนั้นแล้วหน่วยประมวลผลเพียงหนึ่งเดียวหรือมากกว่านั้นจะอยู่ว่างในขณะที่หน่วยประมวลผลอื่นๆทำงานอย่างหนักในขณะที่รอซีพียู Load balancing พยายามที่จะรักษาปริมาณงานและกระจายงานไปยังหน่วยประมวลผลอื่น ในระบบ SMP สิ่งสำคัญคือจะต้องมีการจดโน้ตว่า load balancing มีแบบฉบับเฉพาะที่จำเป็นสำหรับระบบที่แต่ละหน่วยประมวลผลจะมีลำดับของโปรเซสในการปฏิบัติการอยู่แล้ว การรันคิวของระบบนั้นไม่จำเป็นจะต้องทำ load balancing เพราะจะต้องมีหน่วยประมวลผลหนึ่งว่างงาน ซึ่งจะถูกแยกออกจากการรันลำดับตามปกติ และมันก็สำคัญเช่นกันที่จะต้องโน้ตไว้ แต่อย่างไรก็ตามระบบปฏิบัติการในปัจจุบันที่รองรับระบบ SMP จะทำการจัดลำดับคิวที่เหมาะสมสำหรับแต่ละโปรเซส
การเข้าถึง load balancing สามารถทำได้ 2 วิธี คือ push migration และ pull migration ซึ่ง push migration นั้นจะทำหน้าที่คอยตรวจสอบปริมาณงานในแต่ละหน่วยประมวลผลและหาจุดที่ไม่สมดุล เพื่อทำการกระจายงานโดยเคลื่อนย้ายโปรเซสจากหน่วยประมวลผลที่ทำงานเกินความสามารถไปยังหน่วยประมวลผลที่ยังว่างอยู่หรือยุ่งน้อยกว่า ส่วน pull migration จะเกิดขึ้นเมื่อหน่วยประมวลผลที่ว่างอยู่ทำการดึงดึงงานที่รออยู่จากหน่วยประมวลผลที่มีงานมาก ทั้ง push และ pullmigration ไม่ได้ทำงานสัมพันธ์กัน แต่ทำงานในลักษณะเส้นขนานในระบบ load balancing
สิ่งที่น่าสนใจคือ load balancing นั้นจะไปลดประโยชน์ของ processor affinity ที่ได้เคยกล่าวถึงในหัวข้อ 5.4.2 ก็คือประโยชน์ของการรักษาการทำงานของโปรเซสภายในหน่วยประมวลผลเดียวกันทำให้ข้อมูลจะคงอยู่ใน cache memory ของหน่วยประมวลผล แต่ pulling หรือ pushing เป็นโปรเซสจากหน่วยประมวลผลหนึ่งไปยังอีกหน่วยประมวลผลหนึ่ง ซึ่งตรงนี้ทำให้เราไม่ได้ประโยชน์ อย่างในกรณีระบบวิศวกรรม จะไม่มีกฎที่แน่นอนว่านโยบายไหนดีที่สุด ดังนั้นในบางระบบ หน่วยประมวลผลที่ว่างงานมักจะดึงโปรเซสมาจากหน่วยประมวลผลที่มีงานมาก และในบางระบบโปรเซสจะเคลื่อนย้ายก็ต่อเมื่อเกิดการไม่สมดุลของปริมาณงาน
5.4.4 Symmetric Multithreading ระบบ SMP จะมีหลาย ๆ งานที่เกิดขึ้นพร้อมกันโดยการทำงานของหน่วยประมวลผล ทางเลือกเดียวที่จะใช้คือการใช้หน่วยประมวลผลแบบ logical มากกว่า physical กลยุทธ์ที่เป็นที่รู้จักกันดีก็คือ symmetric multithreading (SMT) หรืออีกชื่อหนึ่งว่า hyper threading technology ใน Intel processor
5.5Thread Scheduling ในบทที่ 4 เป็นการแนะนำถึงรูปแบบจำลองการทำงานของ threads (เส้นการทำงาน) พวกเราแนะนำตัวเสื้อผ้าไปถึงแบบจำลองส่วนที่เจริญเติบโตจากโครงสร้างใหญ่ ซึ่งแยกแยะระหว่างระดับ-ผู้ใช้ (user-level) และระดับ-kernel (kernel-level) บนระบบปฏิบัติการ (operating system) ที่ให้ความช่วยเหลือ เส้นการทำงาน (thread) ในส่วนของ Kernel-level ไม่ใช่โปรเซส ซึ่งจะใช้ตารางเวลาโดยระบบปฏิบัติการเป็นตัวควบคุม ส่วนเส้นการทำงาน (thread) ของ User-level ถูกจัดการโดย thread library และ Kernel ซึ่งไม่รู้ตัวมาก่อนของการรันของซีพียู เส้นการทำงานของ user-level ต้องจับเข้ากับเส้นการทำงานของ Kernel-level ที่สัมพันธ์กัน ถึงแม้ว่า การจับเข้ากันนั้นอาจจะทำได้โดยอ้อม และอาจจะใช้ LWP (Lightweight Process) ในส่วนนี้ เราสำรวจการทำตารางเวลาที่เกี่ยวเส้นการทำงานของ ระดับ-ผู้ใช้ (User-level) และระดับ-kernel(Kernel-level) เสื้อผ้าระดับ-แก่นของเรื่อง และการจัดตารางเวลาตัวอย่างที่เฉพาะเจาะจงสำหรับ Pthreads
5.5.1 Contention Scope ความแตกต่างอย่างหนึ่งระหว่างเส้นการทำงาน (Thread) ของ User-level และ Kernel-level จัดตั้งอยู่ในตารางเวลาบนระบบการดำเนินการแบบ many-to-one (ในหัวข้อที่ 4.2.1) และMany-to-many (ในหัวข้อที่ 4.2.3) ตารางการจัดการเวลา Thread library เส้นการทำงานของ User-level สามารถรันบน LWP ได้ Scheme หนึ่ง เรียกว่า Process - Contention Scope (PCS) ตั้งแต่การแข่งขันเพื่อให้ ซีพียูเกิดพื้นที่เส้นการทำงาน (threads) ขึ้นซึ่งอยู่ในโปรเซสเดียวกัน
5.5.2 Pthread Scheduling ตัวอย่างโปรแกรม POSIX Pthread อย่างง่าย ในส่วนของหัวข้อ 4.3.1 เป็นไปตามคำแนะนำของการสร้างเส้นการทำงาน (thread) กับ Pthreads ในขณะนี้เราเน้นในส่วนของ POSIX Pthread API ที่ยินยอมให้ PCS หรือ SCS ระหว่างการสร้างเส้นการทำงาน (thread) Ptheads ระบุตามค่า contention scope ดังนี้ PTHREAD_SCOPE_PROCESS schedules threads using PCS scheduling. PTHREAD_SCOPE_SYSTEM schedules threads using SCS scheduling
5.6 ระบบปฏิบัติการตัวอย่าง เราจะอธิบายการจัดตารางงานของ Solaris (เป็นระบบปฏิบัติการคอมพิวเตอร์ แบบยูนิกซ์(Unix) ที่พัฒนาโดย Sun Micro system) ระบบปฏิบัติการ Windows XP และระบบปฏิบัติการ Linux ซึ่งเป็นสิ่งสำคัญที่จะต้องทราบในการอธิบายการจัดตารางงานของ Solaris และ Linux ซึ่งระบบปฏิบัติการ Linux ไม่ได้มีการแบ่งแยกระหว่างโปรเซสกับเส้นงาน ดังนั้นเราจะกำหนดเป็นรูปแบบของงานเมื่อเราอธิบายในส่วนของการจัดตารางงานของระบบปฏิบัติการ Linux
รูปที่ 5.10แสดงการจัดตารางงานของระบบปฏิบัติการ Solaris
5.6.1 ตัวอย่างการจัดตารางงานของระบบปฏิบัติการ Solaris ระบบปฏิบัติการ Solaris จะใช้ลำดับความสำคัญของเส้นงานในการจัดตารางงาน มีการกำหนดเป็น 4 ประเภทของการจัดตารางงาน ซึ่งจะเรียงลำดับความสำคัญดังต่อไปนี้ • การทำงานแบบทันที (Real –time) • ระบบ (System) • ระบบจัดแบ่งเวลา (Time sharing) • ระบบโต้ตอบ (Interactive)
5.6.2 ตัวอย่างการจัดตารางงานของวินโดว์เอ็กซ์พี (Windows XP Scheduling) วินโดว์เอ็กซ์พีจัดตารางเส้นงาน(threads)โดยใช้ฐานลำดับความสำคัญ,ขั้นตอนวิธีการจัดตารางการจอง ตัวจัดตารางของวินโดว์เอ็กซ์พีจะรับรองว่าเส้นงานที่มีลำดับความสำคัญสูงที่สุดจะได้ทำงานก่อนเสมอ ส่วนหนึ่งของเคอร์เนล(kernel) วินโดว์เอ็กซ์พีจะจัดการการจัดตารางเรียกว่า ตัวส่งต่อ (dispatcher) เส้นงานที่ถูกเลือกให้ทำงานโดยตัวส่งต่อ(dispatcher) จะทำงานจนกระทั่งมันถูกครอบครองโดยเส้นงานที่มีลำดับความสำคัญสูงกว่า,จนกระทั่งงานสิ้นสุด,จนกระทั่งหมดเวลาควอนตัม(quantum) หรือจนกระทั่งมันเรียก system calls อย่างเช่น I/O ถ้าเส้นงานที่มีลำดับความสำคัญสูงกว่าอยู่ในสภาพที่พร้อมในขณะที่เส้นงานที่มีลำดับความสำคัญน้อยกว่ากำลังทำงานอยู่ เส้นงานที่มีลำดับความสำคัญน้อยกว่าจะถูกครอบครอง การครอบครองนี้จะให้สิทธิพิเศษเข้าถึงซีพียูได้กลางครันเมื่อเส้นงานต้องการ
5.6.3 ตัวอย่างการจัดตารางของลีนุกซ์ (Linux Scheduling) ก่อนเวอร์ชัน 2.5 ลีนุกซ์เคอร์เนล(Linux kernel)ทำงานบนอัลกอริธึมการจัดตารางของยูนิกซ์แบบเก่าที่แตกต่างกัน มีปัญหา 2 อย่างกับตัวจัดตารางยูนิกซ์แบบเก่าคือมันไม่จัดเตรียมการสนับสนุนให้เพียงพอสำหรับระบบ SMPและมันไม่ดีกับจำนวนงานในระบบที่โตขึ้น เวอร์ชัน 2.5 ตัวจัดตารางถูกปรับปรุงใหม่และตอนนี้เคอร์เนลสามารถจัดหาอัลกอริธึมการจัดตารางที่ใช้เวลาคงที่แล้วรู้จักในชื่อ O(1) โดยไม่ใส่ใจกับจำนวนของงานบนระบบ ตัวจัดตารางใหม่นี้เพิ่มการสนับสนุนสำหรับ SMP รวมทั้งโปรเซสที่ใกล้ชิดกันและทำงานได้สมดุลและจัดเตรียมได้อย่างยุติธรรมและสนับสนุนงานที่มีการทำงานร่วมกัน
5.7 Algorithm Evaluation เราจะทำอย่างไรให้ให้ซีพียูทำงานตามขั้นตอนวิธีสำหรับระบบของเรา เราจะได้ไปศึกษาในหัวข้อ 5.3 ซึ่งมันจะมีหลายขั้นตอนวิธีในการจัดการซึ่งแต่ละขั้นตอนจะมีความยากเช่นกัน ปัญหาแรกในการกำหนดบรรทัดฐานของนิยามการเลือกขั้นตอนวิธีที่ต้องการ เราสามารถศึกษาได้ในหัวข้อที่ 5.2 ซีพียูจะใช้ประโยชน์จากการตอบสนองของเวลา การเลือกขั้นตอนวิธี เราจะต้องกำหนดความสำคัญของความสัมพันธ์ โดยเราจะสามารถวัดได้หลาย ๆ วิธี