520 likes | 823 Views
Interrupts. oslecture02. Interrupts. CPU มี interrupts pin สำหรับรับสัญญาณขัดจังหวะ ( interrupt signals ) จาก ฮาร์ดแวร์ โดยเมื่อมีอินเตอร์รัพท์เกิดขึ้นมาจากฮาร์ดแวร์ เข็มที่ซี พียูจะทำการเปลี่ยนค่า และบอกซีพียูว่ามีสัญญาณอินเตอร์รัพท์เกิดขึ้น ดังรูป. Interrupts (ต่อ).
E N D
Interrupts oslecture02
Interrupts • CPU มี interrupts pin สำหรับรับสัญญาณขัดจังหวะ ( interrupt signals ) จากฮาร์ดแวร์โดยเมื่อมีอินเตอร์รัพท์เกิดขึ้นมาจากฮาร์ดแวร์ เข็มที่ซีพียูจะทำการเปลี่ยนค่า และบอกซีพียูว่ามีสัญญาณอินเตอร์รัพท์เกิดขึ้นดังรูป
สาเหตุของการเกิดอินเตอร์รัพท์สาเหตุของการเกิดอินเตอร์รัพท์ • ดิสก์ทำงาน สมบูรณ์ • เมื่อกดคีย์บอร์ด • เคลื่อนย้ายหรือคลิกเมาส์ • การเปลี่ยนแปลงเวลาของนาฬิกา • การดำเนินการกับเครือข่าย • ฯลฯ
The IVT oslecture02
The IVT • ซีพียูจะมี interrupts pin เพียง 1 ขา แต่ในคอมพิวเตอร์นั้นมีสัญญาณอินเตอร์รัพท์จำนวนมาก • คอมพิวเตอร์จะรู้ได้อย่างว่ามีการเกิดอินเตอร์รัพท์ ?
The IVT(ต่อ) • คอมพิวเตอร์จะถาม PIC เนื่องจากอุปกรณ์ที่ส่งสัญญาณทุกตัวจะเชื่อมต่อกับ PIC โดยแต่ละตัวจะมีรีจิสเตอร์เพื่อใช้ตรวจสอบหาอุปกรณ์ตัวที่ส่งสัญญาณ และ PIC จะเชื่อมต่อกับขาซีพียูอีกทีหนึ่ง เมื่อซีพียูได้รับสัญญาณอินเตอร์รัพท์มันจะถาม PIC ว่า อุปกรณ์ตัวใดส่งสัญญาณอินเตอร์รัพท์เข้ามา ดังรูป
Running the ISR oslecture02
Running the ISR • สามารถรู้ได้อย่างไรว่าซีพียูหยุดการทำงาน ? • สามารถรู้ได้อย่างไรว่าซีพียูใช้อินเตอร์รัพท์ และจากนั้นก็ทำงานต่อจากเดิม?
Running the ISR (ต่อ) • เมื่อมีสัญญาณอินเตอร์รัพท์ ซีพียูจะทำการจดจำการทำงานครั้งสุดท้าย และเก็บใส่สแต็คไว้ หลังจากนั้นจะใช้หมายเลขอินเตอร์รัพท์จาก PIC เป็นตัวชี้ไปยัง IVT เพื่อที่จะโหลด ซีพียู IP กับตำแหน่ง ISR สำหรับการอินเตอร์รัพท์
Running the ISR (2) • ในกรณีที่มีการกดคีย์ ในตัวอย่างนี้จะแสดงถึงสาเหตุที่ได้รับจากการอินเตอร์รัพท์จากแหล่งกำเนิด 1 และจะเก็บค่า 1 ในอินเตอร์รัพท์รีจิสเตอร์และ บอกซีพียูว่ามีสัญญาณอินเตอร์รัพท์เข้ามา ซีพียูจะรับสัญญาณ และเก็บงานที่กำลังทำอยู่ในปัจจุบันลงในสแตก หลังจากนั้นมันจะรับค่าจากรีจิสเตอร์ที่อยู่ใน PIC (หมายเลข 1) และไปยัง IVT และรับแอดเดรสในช่องที่1 แล้วใส่ลงในรีจิสเตอร์ IP และISR สำหรับคีย์บอร์ดนั้นจะถูกเก็บอยู่ใน IVT ช่องที่ 1
Return to original program • ทำอย่างไรให้สามารถกลับไปยังโปรแกรมเดิม เมื่อ ISR เสร็จสิ้นการดำเนินการอินเตอร์รัพท์ ? • เมื่อรูทีนย่อยทำงานเสร็จแล้ว แทนที่จะใช้ RET แต่ ISRจะใช้ IRET เพื่อส่งค่ากลับ มันจะให้ซีพียูดึงค่าจากสแตกออกมาใช้ ในขณะนี้ซีพียูจะมีค่าทั้งหมดจากโปรแกรมเดิมก่อนที่จะถูกอินเตอร์รัพท์ โดยที่โปรแกรมเดิมจะไม่รู้เลยว่ามันถูกขัดจังหวะ
Vocabulary • ISR – interrupt service routine • IVT– interrupt vector table • IRET– interrupt return • RET– return (from normal subroutine) • PIC– programmable interrupt controller • IP– instruction pointer • CPU– central processing unit • RAM – random access memory
Summary of processing an interrupt (1) • ฮาร์ดแวร์ส่งสัญญาณไปยัง PIC • PIC ส่ง ID ของแหล่งสัญญาณอินเตอร์รัพท์ไปยัง รีจิสเตอร์ • PIC ส่งัญญาณไปยังซีพียูCPU ว่าเกิดสัญญาณอินเตอร์รัพท์ • CPU หยุดการทำงานของโปรแกรมปัจจุบัน
Summary of processing an interrupt (1) • CPU เก็บสถานะการทำงานปัจจุบันลงในสแตก • CPU เรียก ID ของตัวที่ส่งสัญญาณอินเตอร์รัพท์ (จำนวน IRQ) จาก PICจาก PIC • CPU จะคำนวณ IP = IVT [IRQ]
Summary of processing an interrupt (2) • ISR จะทำการรันและ ทำงานตามอินเตอร์รัพท์ • ISR ส่งข้อมูลออกทาง IRET • CPU ดึงข้อมูลออกมาจากสแตค • โปรแกรมเดิมจะดำเนินการต่อไป โดยที่โปรแกรมไม่รู้เลยว่าถูกขัดจังหวะการทำงาน
Dual-Mode Operation oslecture02
Dual-Mode Operation • ในซีพียูจะสนับสนุนการประมวลผลแบบหลายโหมด อย่างน้อยที่สุด 2 โหมด เพื่อสนับสนุนการทำงานอย่างมีประสิทธิภาพของระบบปฏิบัติการ คือ privileged mode กับ user mode โดยที่ระบบปฏิบัติการจะรันใน privileged mode ซึ่งเป็นโหมดที่ไม่จำกัด และจะรันทุกคำสั่ง • ส่วนโปรแกรมประยุกต์จะรันใน user mode ซึ่งจะไม่อนุญาตให้เปลี่ยนแปลงตารางเพจ ไม่ให้ทำงานกับ I/O โดยตรง, หรือเปลี่ยนโหมดการทำงาน และคำสั่งพิเศษอื่นๆ
Dual-Mode Operation(ต่อ) • เมื่อมีการส่งสัญญาณอินเตอร์รัพจากฮาร์ดแวร์ เครื่องจะเข้าสู่การทำงานแบบ privileged mode โดยอัตโนมัติ • เมื่อ ISR ทำงานเสร็จ มันจะส่งค่าไปให้ ซีพียู แล้วกลับเข้าสู่ user mode ถ้าเราใช้คำสั่งพิเศษใน user mode มันจะเกิดการขัดจังหวะ ซึ่งมันจะส่งค่าที่ใช้ควบคุมไปให้ระบบปฏิบัติการ และระบบปฏิบัติการจะทำการทำลายโปรแกรมที่รันอยู่
Software Interrupts oslecture02
Software Interrupts • การเพิ่มขึ้นของฮาร์ดแวร์อินเตอร์รัพท์ ทำให้ซีพียูสมัยใหม่นั้นสนับสนุนอินเตอร์รัพท์ของซอร์ฟแวร์ด้วย การทำงานของซอร์ฟแวร์อินเตอร์รัพท์นั้น เกือบจะเหมือนกันการทำงานของ ฮาร์ดแวร์อินเตอร์รัพท์ แต่แทนที่จะมีขาที่ใช้รับสัญญาณอินเตอร์รัพท์ และดึงข้อมูลจาก PIC คำสั่งในการดำเนินการซึ่งประกอบด้วยหมายเลขอินเตอร์รัพท์ ตัวอย่างที่จะกล่าวถึงคืออินเตอร์รัพท์ 21 ซึ่งเป็นการติดต่อกับ system call ของ MS-DOS
Software Interrupts(ต่อ) • ซอร์ฟแวร์อินเตอร์รัพท์บางครั้งถูกเรียกว่า traps ในระบบปฎิบัติการมีการเตรียมเครื่องมือให้ system call เพื่อสร้างอินเตอร์รัพท์ โดย system call มีตัวอย่างเช่น open(), read(), write(), close(), seek(), ioctl(), kill(), fork(), ฯลฯ โปรแกรมประยุกต์นั้นโดยปกติแล้วจะเรียกใช้บางอย่างเช่น c library, และที่จริงแล้วมันจะไปเรียก system call เพื่อสร้าง อินเตอร์รัพท์
CPU Hogs • โดยปกติระบบปฏิบัติการจะรันโปรแกรมผู้ใช้จนกว่าจะเกิดฮาร์ดแวร์หรือซอร์ฟแวร์อินเตอร์รัพท์ จากนั้นมันจะทำการสลับโปรแกรมอื่นขึ้นมารัน หรือเรียกว่า context switch ปัญหาหนึ่งที่เกิดขึ้นเมื่อกำลังทำการคำนวณอยู่ และไม่สามารถใช้ system call ได้ ถ้าไม่เกิดฮาร์ดแวร์อินเตอร์รัพท์ จะไม่มีโปรแกรมใดเลยที่สามารถรันบนซีพียูได้ ระบบปฏิบัติการแก้ไข้ปัญหานี้โดยใช้เวลาของระบบ
CPU Hogs(ต่อ) • เมนบอร์ดจะมีชิปควบคุมการทำงานของเวลา และจะส่งอินเตอร์รัพท์หลายครั้งในหนึ่งวินาที ระบบปฏิบัติการจะเพิ่ม ISR ซึ่งทำหน้าที่รับอินเตอร์รัพท์, และจะมีการนับเวลาถอยหลังสำหรับการรันโปรแกรมปัจจุบัน แต่ละครั้งที่ ISR เรียกใช้ตัวจับเวลา เวลาจะค่อยๆลดลง และเมื่อถึง 0 ระบบปฏิบัติการจะสลับโปรแกรมอื่นขึ้นมาทำงาน และตั้งค่าตัวนับเวลาใหม่ วิธีนี้จะแน่ใจได้ว่า CPU สามารถแบ่งเวลาทำงานโปรแกรมทั้งหมด และไม่ถูกแย่งใช้โดยโปรแกรมเดียว
Processes • โปรเซสคือโปรแกรมที่กำลังรัน โดยที่มันจะใช้โค้ด สถานะซีพียู, ตารางเพจ, การเปิดไฟล์ เป็นต้น ข้อมูลทั้งหมดนี้จะถูกจัดการโดยระบบปฏิบัติการ แต่ละโปรแกรมที่กำลังรันอยู่คือโปรเซส และบางครั้งจะมีโปรเซสพิเศษ ซึ่งทำงานให้กับระบบปฏิบัติการ โดยแต่ละโปรเซสจะมีพื้นที่สำหรับบันทึกการทำงาน เรียกว่า Process Control Block(PCB)
Context Switch oslecture02
Context Switch • context switch คือชื่อของกระบวนการ ซึ่งซีพียูใช้อินเตอร์รัพท์ในการสลับโปรเซสที่กำลังรันอยู่ มันจะทำงานโดยการเปลี่ยนสถานะซีพียู แล้วทำการบันทึกค่าที่ซีพียูกำลังทำอยู่ในปัจจุบันลงในสแตกสำหรับ context switch นั้น ISR จะทำการคัดลอกข้อมูลเข้าสู่พื้นที่พิเศษที่เรียกว่า PCB หลังจากนั้นมันจะเรียกโปรแกรมอื่นขึ้นมาทำงาน ซึ่งพร้อมสำหรับการรันและคัดลอกข้อมูลลง PCB
Context Switch(ต่อ) • จากนั้นจะเก็บในสแตค และเปลี่ยนสถานะซีพียู ซึ่งวิธีการนี้จะทำเมื่อได้รับค่า IRET และเครื่องเปลี่ยนไปเป็น user mode และเพิ่มลงในสถานะซีพียูในกรณีที่ต่างกัน ระบบปฎิบัติการจะสามารถเปลี่ยนได้อย่างไร ว่าจะให้โปรแกรมใดมารันต่อ? โดยที่การสลับโปรเซสนั้นสามารถทำได้ตลอด เมื่อตัวจับเวลาเป็น 0 หรือเมื่อโปรเซสไม่สามารถดึงข้อมูลจาก I/O ได้
โปรเซส1 กำลังทำงานอยู่ในขณะนี้
มีการเกิดอินเตอร์รัพท์ บันทึกค่าสถานะของซีพียูลง สแตก
ISR คัดลอกสถานะของซีพียูเก็บใน โปรเซสที่ 1 ของ PCB
Scheduler chooses new process • ตารางซีพียูจะมองหาโปรเซส ซึ่งพร้อมสำหรับการรัน เพื่อที่จะเลือกมารัน ในตัวอย่างที่กล่าวมา ระบบปฏิบัติการจะตัดสินใจเลือกรันโปรเซส 2 ISR จะคัดลอกข้อมูลของ โปรเซส2 จาก PCB เข้ามา ในสแตกและทำงานแทน โปรเซส 1
เมื่อ ISR ส่งค่า IRET ออกมา ซีพียูจะดึงค่าสถานะซีพียูที่เก็บไว้ในสแตค และจะรันโปรเซส2 ถ้ามันไม่หยุดการทำงาน
Process Scheduling • เมื่อ system call หยุดการทำงานของ I/O หรือหมดเวลาการทำงาน ระบบปฏิบัติการจะทำการสลับการทำงานเพื่อเรียกโปรเซสอื่นมารัน มันจะรู้ได้อย่างไรว่าจะเลือกโปรเซสไหนขึ้นมารัน? ซึ่งมีหลายวิธีในการทำงานและแนวคิดที่จะเลือกโปรเซสใหม่ขึ้นมาทำงาน เรียกว่า ตารางโปรเซส ซึ่งการเลือกโปรเซสนี้มีความซับซ้อนมากบนเมนเฟรม แต่ระบบปฏิบัติการส่วนใหญ่จะใช้ FIFO
Concepts • Hardware Interrupt & PIC • Software Interrupt • Process & PCB • Context switch • System call • Dual-mode operation • CPU state
Process States oslecture02
Process States • โปรเซสจะมี 1 ฟิลด์ใน PCB ที่เรียกว่า สถานะโปรเซส ซึ่งจะชี้ให้เห็นว่าโปรเซสกำลังทำอะไรในขณะนี้ สถานะที่เป็นไปได้ คือ • Running – ขณะนี้โปรเซสกำลังรันบนซีพียู • Blocked for I/O – โปรเซสต้องการเรียกใช้ I/O และโปรเซสกำลังทำงานกับ I/O • Ready to run – ตอนนี้เป็นตอนที่โปรเซสไม่ได้รัน แต่พร้อมที่จะรัน
Process State Diagram(ต่อ) • ในแผนภาพแสดงให้เห็นกลุ่มของโปรเซส ซึ่งไม่ใช่แค่หนึ่งโปรเซส ถ้าคุณมีซีพียูที่มีหลายหน่วยประมวลผล มันก็จะสามารถรันได้มากกว่าหนึ่งโปรเซสในเวลาเดียวกัน ถ้าคุณมีมากกว่าหนึ่งโปรเซสที่รอดึงข้อมูลจาก I/O มันจะทำการบล็อกการทำงานของโปรเซส ท้ายที่สุด ถ้าหลายโปรเซสที่รอการประมวลผลจากซีพียู มันจะกำหนดสถานะโปรเซสให้มีสถานะเป็น ready คือพร้อมที่จะรัน ในระบบส่วนใหญ่ในปัจจุบัน โปรเซสที่พร้อมสำหรับการรัน จะถูกเก็บในโครงสร้างแบบคิวที่มีหลายระดับ
Priority queues oslecture02
Priority queues • สำหรับตัวอย่างนี้เราจะแสดงให้เห็น 3 ระดับความสำคัญโดยมี ระดับสูง ระดับปานกลาง และระดับต่ำ โดยแต่ละระดับความสำคัญจะมีแถวของข้อมูล โดยใช้หลักการของ FIFO โดยเมื่อถ้าระบบต้องการจะเลือกโปรเซสใหม่ขึ้นมารันนั้น มันจะเลือกโปรเซสแรกที่อยู่ในระดับความสำคัญสูง แต่ถ้าคิวนั้นว่าง ก็จะเลือกระดับความสำคัญปานกลาง
Priority queues(ต่อ) • แต่ถ้าระดับความสำคัญสูงและปานกลางนั้นว่าง ระดับความสำคัญระดับต่ำจะถูกเลือกขึ้นมาทำงาน ซึ่งงวิธีนี้ก็เป็นวิธีที่ดีพอสำหรับระบบส่วนใหญ่ อย่างไรก็ตามถ้าคุณตั้งค่างานทั้งหมดให้เป็นระดับสูงมันก็จะแย่งการทำงานของซีพียู โดยการทำงานปกติ มันจะทำงานในระดับความสำคัญปานกลาง สำหรับความสำคัญระดับต่ำจะ ทำงานบางอย่าง โดยแบ่งเวลาที่เหลือจากการทำงานของซีพียู และจะใช้ซีพียู
Priority queues(ต่อ) • เมื่อโปรเซสที่มีระดับความสำคัญปานกลางไม่ได้ใช้ซีพียูแล้ว ซึ่งโปรเซสระดับต่ำเหล่านี้จะใช้เวลาที่เหลือของซีพียู ถ้างานที่มีระดับความสำคัญระดับสูงก็จะถูกเลือกมาประมวลผลก่อน ซึ่งสามารถลดการทำงานของงานที่มีระดับความสำคัญปานกลางของซีพียู
Priority queues(ต่อ) • การจัดกลุ่มของโปรเซส I/O จะทำให้สามารถจัดกลุ่มคิวได้ โดยปกติจะมี 1 คิวต่อหนึ่งอุปกรณ์ จะมีคิวที่ใช้ทั่วไปอยู่ 1คิว แต่มันไม่ได้ถูกใช้ตั้งแต่เราสามารถทำฮาร์ดดิสก์แบบคู่ขนาน เนื่องจากเวอร์ชั่นก่อนๆของ MS-Windows ยังไม่สามารถทำงานแบบคู่ขนานได้ แต่ในปัจจุบัน ระบบปฏิบัติการสมัยใหม่นั้นสามารถทำงานแบบคู่ขนานได้ ซึ่งในเครื่องเมนเฟรมนั้นจัดระดับความสำคัญของอุปกรณ์ I/O ไว้ดีมากซึ่งเก็บไว้ใน ready queue, แต่ว่าเครื่องทั่วๆไปนั้นไม่จำเป็นต้องมี
Logical view of a process • ในโปรเซสจะมีมุมมองทางตรรกะ และมุมมองทางกายภาพ ในมุมมองทางตรรกะนั้นโดยปกติจะแสดงให้เห็นบางอย่างเช่น ภาพที่อยู่ทางด้านล่าง โดยมี code segment, data segment, stack segment และ heap segment ซึ่งเซกเมนต์เหล่านี้จำเป็นต่อการรันโปรแกรม ซึ่งอยู่ใน PCB
Logical view of a process (ต่อ) • The code segment (CS) เก็บ รหัสเลขฐานสอง สำหรับเครื่อง เพื่อให้ซีพียูใช้ในการเอ็คซิคิวซ์โปรเซส • The data segment (DS) เก็บตัวแปรทั่วๆไป สำหรับโปรเซส เพื่อใช้สถิติคำนวณพื้นที่ต่างๆ • The stack segment (SS) เก็บ สแต็ค เพื่อให้ซีพียูใช้ในขณะรันโปรแกรม และนอกจากนี้ยังใช้เก็บตัวแปรหลักที่ใช้ส่งค่า เก็บตำแหน่งของโปรแกรมย่อย ฯลฯ
Logical view of a process (ต่อ) • Heap segment (HS) จะเก็บพื้นที่หน่วยความจำที่จะถูกใช้โดยโปรเซส • Process control block (PCB) คือโครงสร้างข้อมูลของระบบปฏิบัติการ และจะไม่เหมือนกับ 4 เซกเมนต์ก่อนหน้านี้ คือมันจะไม่จองพื้นที่หน่วยความจำของโปรเซส บางครั้งPCB นั้นใช้ใน linked list ที่อยู่ใน เคอร์เนล ของระบบปฏิบัติการ แต่นั่นเป็นแค่รายละเอียด • ในซีพียูรุ่นเก่าๆ มีการแบ่งพื้นที่สำหรับเซกเมนต์ แต่ในระบบใหม่จะใช้หน่วยความจำภายนอก โดยแต่ละเซกเมนต์จะแยกกันอยู่ แต่อาจจะมี base address เดียวกัน
Old-style segmentation • ซีพียูสมัยก่อนนั้นใช้การแบ่งออกเป็นส่วนๆ และยังมีข้อจำกัดในเรื่องของการจัดการหน่วยความจำ เครื่อง 808x นั้นมีหน่วยความจำขนาด 1MB แต่หลังจากคุณลบออกด้วย BIOS, การ์ดจอ IVT ฯลฯ คุณจะมีหน่วยความจำเพียง 640 KB อย่างไรตาม ในชิปหนึ่งตัวจะใช้หน่วยความจำแค่ 64KB เพื่อเก็บตำแหน่ง ซึ่งจะต้องเหลือหน่วยความจำไว้ให้ segment register อีก 64 KB หลังจากนั้นเราก็จะใช้ ตำแหน่งในรีจิสเตอร์ เพื่อหาข้อมูลใน
Old-style segmentation(ต่อ) • การใช้ระบบ memory segment นั้นจะต้องใช้คู่กันระหว่าง segment กับ offset โดยที่ segment จะบอกว่ามีจำนวน segment เท่าไหร่ที่อยู่ในหน่วยความจำ และ offset จะบอกว่าตำแหน่งที่เราต้องการนั้นอยู่ตรงส่วนใดของใน segment นั้น ให้คุณคิดเหมือนกับว่ามันเป็น array 2มิติ