สาระการเรียนรู้ 1. องค์ประกอบของโปรเซส 2. สถานะของโปรเซส 3. การจัดเวลาโปรเซส 4. การปฏิบัติการบนโปรเซส 5. โปรเซสสื่อประสาน 6. การสื่อสารในโปรเซส 7. แบบของการประมวลผล
จุดประสงค์การสอน 1. สามารถเขียนตารางแสดงองค์ประกอบของโปรเซสได้ 2. สามารถเขียนภาพแสดงสถานะของโปรเซสได้ 3. เข้าใจการจัดเวลาโปรเซส 4. เข้าใจการปฏิบัติการบนโปรเซส 5. สามารถบอกได้ว่าเหตุที่ทำให้เกิดโปรเซสสื่อประสานได้ 6. สามารถบอกได้ว่าเรื่องที่ต้องพิจารณาเกี่ยวกับการสื่อสารในโปรเซสมีอะไรบ้าง 7. เข้าใจแบบของการประมวลผล 8. สามารถเขียนภาพแสดงแบบของการประมวลผลแต่ละแบบ
แนะนำบทเรียน เมื่อโปรแกรมถูกเรียกขึ้นมาประมวลผลก็จะต้องสร้างโปรเซส (Process) และเรียกใช้ข้อมูล (Data) มีอะไรอีกมากมายในแต่ละโปรเซส ใน windows สามารถกดปุ่ม ctrl-alt-del เพื่อเปิด Task manager, Processes และจัดการโปรเซสได้ เช่น ปิด หรือกำหนด CPU ที่ให้โปรเซสประมวลผล ใน DOS ก็สามารถใช้คำสั่ง tasklist ดูรายการทั้งหมด และ tasklist /m ก็จะแสดงโมดูล (Module) ที่โปรเซสเรียกใช้ ใน Linux ก็สามารถใช้ top หรือ ps เพื่อดูโปรเซสได้เช่นกัน
การกีดกั้นซึ่งกันและกันด้วยการคอยตอนยุ่ง [4].p69 (Mutual Exclusion with busy waiting) 1. ยกเลิกอินเทอร์รัพต์ (Disable Interrupt) ใส่คำสั่ง Disable Interrupt ทำให้ process ประมวลผลใน CPU จนแล้วเสร็จ โดยไม่สนใจ interrupt ที่ส่งเข้าไป เป็นผลให้ process ที่เข้า CPU ได้ทำงานจนเสร็จ 2. ตัวแปรล็อก (Lock Variable) เขียนโปรแกรมตรวจสอบการเข้าสู่ critical_region โดยใช้ตัวแปรมาตรวจสอบ ถ้าตัวแปรชื่อ lock มีค่าเป็นแสดงว่าเข้าพื้นที่วิกฤตได้ ถ้าเข้าได้ก็ต้องกำหนดเป็น 1 ป้องกัน process อื่นเข้าใช้พื้นที่วิกฤตชนกัน if lock = 0 then set lock = 1 call critical_region else wait until lock = 0 set lock = 1 call critical_region end if set lock = 0 3. ทางเลือกที่จำกัด (Strict Alternation) คิดค้นการแก้ปัญหา Mutual exclusion โดย Dekker เป็นการผลัดกันเข้า CPU ของ process a และ b เหมาะกับ 2 process ที่ผลัดกัน และมีเวลาประมวลผลเท่า ๆ กัน แต่ข้อเสียคือเกิด busy waiting โดยเปล่าประโยชน์ procedure a while (TRUE) { while(turn !=0) { } // รอจนกว่า turn เป็น 0 critical_region(); turn = 1; nocritical_region(); } procedure b while (TRUE) { while(turn !=1) { } // รอจนกว่า turn เป็น 1 critical_region(); turn = 0; nocritical_region(); } ! http://siber.cankaya.edu.tr/ OperatingSystems/ceng328/node139.html 4. การแก้ปัญหาของพีเตอร์สัน (Peterson' solution) วิธีนี้เพิ่มเติมของ Strict Alternation แต่สามารถรับได้หลาย process ก่อนเข้า critical region ให้เรียกใช้ enter_region() ก่อน เพื่อรับค่า turn จากหมายเลข process และรอให้ process 0 ว่าง เมื่อเสร็จแล้วก็เรียกใช้ leave_region() ที่ทำให้ process 0 ว่างนั่นเอง --- อธิบายได้ว่า ถ้า process 1 หรือ interested[0] ขอเข้า critical_region จะต้องรอให้ interested[0] เป็น False จึงจะเข้าไปได้ แปลว่า รอต่อไป "รอในขณะนี้ turn=process และ interest[0] เป็น true" แต่เลิกรอ และเข้าได้ต่อเมื่อ interest[0] เป็น false while(turn == process && interested[other] == TRUE); // wait --- ประกอบด้วย 2 procedure defind N 2; // number of process int turn; int interested[N]; void enter_region(int process) { int other; other = 1 - process; interested[process] = TRUE; turn = process; while(turn == process && interested[other] == TRUE) {} } void leave_region(int process) { interested[process] = FALSE; } http://www.cs.nott.ac.uk/~gxk/ courses/g53ops/Processes/proc07-peterson.html 5. คำสั่งทีเอสแอล (TSL Instruction) Test Set Lock Instruction ใช้ตัวแปร Lock เหมือนกับ Lock variable cr = critical region แต่กรณีนี้เป็นภาษา Assembly และใช้คำสั่ง TSL Instruction enter_cr_region: TSL RX, Lock ;คัดลอกค่าเดิมของ Lock ไว้ใน RX และทำให้ Lock เป็น 1 CMP RX,#0 JNE enter_region ;หากไม่ใช่ 0 ก็ให้เรียกใช้ enter_region ใหม่ จนกว่าจะเป็น 0 RET ;กลับไปยังผู้เรียก และได้ใช้ critical_region leave_cr_region: MOVE Lock,#0 RET ;กลับไปยังผู้เรียก http://www.moreprocess.com/process-2/ mutual-exclusion-by-test-and-set-lock-tsl-xchg-instruction