ึ
โครงสร้างระบบคอมพิวเตอร์
2.1
Computer-System Operation
ระบบคอมพิวเตอร์ยุคใหม่จะมี
CPU,
device controller ซึ่งเชื่อมโยงกันผ่าน common bus ซึ่ง share memory ร่วมกัน ดังรูป
- Device controller แต่ละตัวรับผิดชอบ device ของตัวเอง
- CPU และ device
controller สามารถทำงานพร้อมกันได้
- มี memory controller เพื่อจัดลำดับการ share memory
เมื่อคอมพิวเตอร์เริ่ม
running
ตัวอย่างเช่น เมื่อเปิดสวิตช์ หรือ reboot ก็จำเป็นที่จะต้อง
run โปรแกรมเริ่มต้น (initial program) หรือ boot strap program ซึ่งเป็นการนำ register
ของ CPU และ device controller เข้าสู่หน่วยความจำ bootstrap program ต้องถูก load
ไปไว้ใน kernel ของระบบปฏิบัติการ
ระบบปฏิบัติการจึงจะเริ่ม execute โปรแกรมแรก เช่น “init”
และรอผลลัพธ์ ผลที่ได้มักเป็นสัญญาณขัดจังหวะ
จากฮาร์ดแวร์หรือซอฟแวร์ ฮาร์ดแวร์อาจขัดจังหวะโดยส่งสัญญาณผ่านทาง system
bus มาที่ CPU โดยซอฟแวร์
ขัดจังหวะโดยการปฏิบัติการบางอย่างที่พิเศษเรียกว่า system call หรือ monitor call
เมื่อ
CPU
ถูกขัดจังหวะ ก็จะหยุดทำงานที่กำลังทำอยู่
แล้วหันไปทำงานตามสัญญาณขัดจังหวะนั้นทันที
โดยย้ายไปทำงานยังตำแหน่งในหน่วยความจำที่บรรจุโปรแกรมสำหรับดำเนินการกับสัญญาณนั้น
(interrupt service routine) เมื่อดำเนินการเสร็จ CPU
ก็จะกลับไปทำงานเดิมที่ค้างไว้
หน้าที่โดยทั่วไปของสัญญาณขัดจังหวะ
- สัญญาณขัดจังหวะจะส่งการควบคุมไปยัง
interrupt
service routine ผ่านทาง ตารางสัญญาณขัดจังหวะ (interrupt
vector) (array ของ address ของ service
routine ต่าง ๆ)
- สถาปัตยกรรมของสัญญาณขัดจังหวะ
จะต้องบันทึกตำแหน่งของชุดคำสั่งที่ถูกขัดจังหวะไว้
- สัญญาณขัดจังหวะที่เข้าสู่ระบบจะถูก
disable ถ้ามีการทำงานของสัญญาณขัดจังหวะตัวอื่นอยู่ก่อนแล้ว
เพื่อป้องกันการสูญหายของสัญญาณขัดจังหวะ (lost interrupt)
- ในระบบที่ซับซ้อนขึ้นอาจยอมให้มีการขัดจังหวะซ้อน
ๆ กันได้โดยเรียงตามศักดิ์(Priority) สัญญาณที่มีศักดิ์สูงกว่าอาจขัดจังหวะสัญญาณที่มีศักดิ์ต่ำกว่า
แต่ถ้ามีศักดิ์เท่ากันต้องรอ interrupt พร้อมกันไม่ได้
- ระบบปฏิบัติการยุคใหม่
ใช้ ตัวขับสัญญาณขัดจังหวะ (interrupt driver) ถ้าไม่มีการ
process , ไม่มีการเรียกใช้อุปกรณ์รับส่งข้อมูล
ไม่มีการตอบสนองผู้ใช้ ระบบปฏิบัติการก็ไม่ต้องทำอะไร
นั่นเป็นสัญญาณบอกเหตุว่าเกิด interrupt หรือ trap
(กับดัก)
- trap คือ software-generated
interrupt (การเกิดการขัดจังหวะของซอฟแวร์) ซึ่งเกิด error
หรือไม่ก็เกิดจาก การร้องขอของโปรแกรมของผู้ใช้
การจัดการสัญญาณขัดจังหวะ
1.
ระบบปฏิบัติการจะรักษาสถานภาพ (state) ของ CPU ด้วยการเก็บ registers
และ program counter ไว้
2.
ตรวจสอบดูว่าเกิดสัญญาณขัดจังหวะชนิดไหน
- อาจเป็น polling (การร้องขอของอุปกรณ์รับส่งข้อมูล)
- หรือ vectored interrupt system (การระบุตำแหน่ง (address) ผิด)
3.
แยกส่วนของ code เพื่อกำหนดว่าควรทำอะไรกับแต่ละชนิดของการขัดจังหวะนั้น
2.2
I/O Structure
2.2.1 I/O
Interrupts
เมื่อ
I/O
เริ่มทำงาน CPU จะ load register ที่จำเป็นมาไว้ใน device controller ซึ่ง device
controller จะทำการตรวจสอบ register เหล่านั้น
เพื่อกำหนดว่าจะทำงานอะไร เช่น ถ้าพบร้องขอให้อ่านข้อมูล controller จะเริ่มโอนย้ายข้อมูลจาก device ไปไว้ที่ local
buffer เมื่อโอนย้ายข้อมูลเสร็จ device controller จะบอก CPU ว่าทำงานเสร็จแล้ว
การติดต่อสื่อสารนี้จะสำเร็จได้โดยสัญญาณขัดจังหวะ
Synchronous
I/O
- เมื่อการรับส่งข้อมูลเริ่มขึ้น
การจะโยกย้ายการควบคุมให้กับโปรแกรมของผู้ใช้
จะทำได้หลังจากเสร็จสิ้นการรับส่งข้อมูลเท่านั้น
- ในการรอรับส่งข้อมูลเสร็จ
มี 2 วิธี
1.
คอมพิวเตอร์บางเครื่องมีชุดคำสั่ง wait พิเศษ
ซึ่งปล่อยให้ CPU ว่าง จนกระทั่งเกิดสัญญาณขัดจังหวะถัดไป
2.
เครื่องจักที่ไม่มีชุดคำสั่งดังกล่าวอาจจะมี wait loop
loop : jmp loop
loop
นี้จะวนรอบไปเรื่อย ๆ จนกระทั่งเกิดสัญญาณขัดจังหวะก็จะโอนย้ายการควบคุมไปส่วนอื่น
ๆ ของระบบปฏิบัติการ
- ถ้า CPU ต้องรอให้รับส่งข้อมูลเสร็จงานก่อนเสมอ
แสดงว่าต้องมีการร้องขอของ I/O อยู่หนึ่งตัวที่เด่นอยู่ตลอดเวลา
ดังนั้นเมื่อเกิดสัญญาณการขัดจังหวะการรับส่งข้อมูล
ระบบปฏิบัติการจะรู้ทันทีว่า device กำลังถูกขัดจังหวะ
แต่ไม่สามารถประมวลผล I/O device หลาย ๆ ตัวพร้อมกันได้
- ตัวอย่างของระบบนี้คือ
ระบบปฏิบัติการ MS-DOS เวลาสั่งพิมพ์ ต้องรอเสร็จงานก่อนถึงจะทำงานต่อไปได้
Asynchronous
I/O
- เมื่อการรับส่งข้อมูลเริ่มขึ้นการโยกย้ายการควบคุมให้กับโปรแกรมของผู้ใช้ทำได้โดยไม่ต้องรอให้การรับส่งข้อมูลเสร็จ
- System call (คำสั่งของขอระบบปฏิบัติการ)
อนุญาตให้โปรแกรมของผู้ใช้รอคอยให้รับส่งข้อมูลเสร็จ
- ตารางที่ระบบปฏิบัติการใช้เก็บบันทึกของอุปกรณ์รับส่งข้อมูลแต่ละตัว
คือ device-status
table ซึ่งใช้แสดงชนิดของอุปกรณ์ ที่อยู่(address) และ สถานภาพ(state) (ว่าง , กำลังทำงาน หรือเสีย) ดังรูป
เมื่อเกิดสัญญาณขัดจังหวะ
ระบบปฏิบัติการจะตรวจสอบดูว่าสัญญาณขัดจังหวะมาจากอุปกรณ์รับส่งข้อมูลตัวไหน
แล้วชี้ไปยังตารางของอุปกรณ์รับส่งข้อมูลนั้นเพื่อตรวจสอบสถานะของอุปกรณ์นั้น
เพื่อปรับปรุงค่าในตารางให้ถูกต้องตามสัญญาณขัดจังหวะนั้น ถ้ามีคิวของอุปกรณ์อยู่
ระบบปฏิบัติการก็จะทำงานตามการร้องขอถัดไป
เมื่อเสร็จก็จะคืนการควบคุมไปทำงานเดิมที่ถูกขัดจังหวะ เช่น
โปรแกรมกำลังรอผลลัพธ์จากอุปกรณ์รับส่งข้อมูลอยู่ก็จะทำงานต่อไปได้เลย
- ข้อดีของ asynchronous I/O คือ
การเพิ่มประสิทธิภาพของระบบ
- ตัวอย่างของระบบนี้
เช่น Windows เวลากำลังพิมพ์งาน เราจะทำการยกเลิกงานที่พิมพ์อยู่ทันทีได้
2.2
DMA Structure
ถ้าผู้ใช้ป้อนข้อมูลผ่านทางแป้นพิมพ์ซึ่งมีอัตรารับ
9600
baud (9600 สัญญาณต่อวินาที) การส่งอักษร 1 ตัวจะใช้เวลาประมาณ
1 มิลลิวินาที หรือ 1000 ไมโครวินาที
โปรแกรมสำหรับดำเนินการกับสัญญาณขัดจังหวะ (interrupt service routine) จะอ่านอักษรไปเก็บไว้ที่ที่พักข้อมูล (buffer) อาจใช้เวลาทำการประมาณ
2 ไมโครวินาที/ตัวอักษร
ดังนั้นหน่วยประมวลผลกลางเมื่อถูกขัดจังหวะด้วยโปรแกรมนี้จะยังคงมีเวลาเหลืออีก 1000
– 2 = 998 ไมโครวินาที ต่อทุก ๆ 1000 ไมโครวินาที
(เวลาที่เหลืออาจใช้ทำงานอื่น ๆ หรือตอบสนองการขัดจังหวะอื่นได้) สัญญาณที่มาจากอุปกรณ์รับส่งข้อมูลประเภทนี้จึงมักถูกกำหนดให้มีศักดิ์
(priority) ต่ำ เพื่อให้สัญญาณประเภทอื่นได้มีโอกาสทำก่อน
สำหรับอุปกรณ์รับส่งข้อมูลที่มีความเร็วสูง (high-speed device) เช่น เทป , จานแม่เหล็ก (disk) หรือ ข่ายงานสื่อสาร (communication network) อาจมีความเร็วในการส่งข้อมูลได้ใกล้เคียงกับความเร็วของหน่วยความจำ
CPU อาจต้องใช้เวลา 2 ไมโครวินาทีในการตอบสนองสัญญาณที่มาขัดจังหวะ
1 ครั้ง แต่สัญญาณที่มาถึงอาจมีความเร็ว 4 ไมโครวินาทีต่อครั้งก็ได้ ซึ่งก็จะเกิดปัญหาทันที
จึงมีการใช้
Direct
Memory Access (การเข้าถึงหน่วยความจำโดยตรง)
มาแก้ปัญหาสำหรับอุปกรณ์ที่มีความเร็วสูงเหล่านี้ ตัวควบคุมอุปกรณ์จะส่งข้อมูลจาก buffer
ของตนมายังหน่วยความจำหลักโดยตรงทีละชุด (ไม่ใช่ทีละ 1 อักษร) โดยไม่ได้อาศัยหน่วยประมวลผลกลางเลย สัญญาณก็จะลดลงเหลือเพียง 1
ครั้งต่อชุด ไม่เหมือนอุปกรณ์ความเร็วต่ำที่ส่งสัญญาณ 1 ครั้ง/อักษร
การทำงานก็เหมือนเดิม
คือ เมื่อโปรแกรมของผู้ใช้ต้องการรับส่งข้อมูลไปยังอุปกรณ์เหล่านี้ ระบบก็จะจัด buffer (อาจเป็น empty
buffer ในกรณีรับ input หรือเป็น full
buffer ในกรณีต้องการส่ง output) ขนาดของ buffer
โดยทั่วไปจะอยู่ระหว่าง 128 – 4096 ไบต์
ทั้งนี้ขึ้นอยู่กับชนิดของอุปกรณ์นั้น ๆ จากนั้นส่วนของระบบปฏิบัติการที่เรียกว่า device
driver จะ set ตัวควบคุมหน่วยความจำ (DAM
controller) ให้เก็บค่าตำแหน่งที่รับ , ส่ง
และขนาดของข้อมูลไว้ใน register ของตน
แล้วส่งสัญญาณไปยังอุปกรณ์ที่ต้องการผ่าน register ควบคุม
(โดยใช้บิตควบคุม (control bit)) เพื่อให้อ่านข้อมูลเข้ามาที่
buffer ของตน
แล้วตัวควบคุมก็จะส่งข้อมูลต่อไปที่หน่วยความจำหลัก หลังจากส่งข้อมูลเรียบร้อยแล้ว
ตัวควบคุมจะส่งสัญญาณไปยังหน่วยประมวลผลกลาง
2.3
Storage Structures
ในอุดมคติ
เราต้องการให้โปรแกรมและข้อมูลอาศัยอยู่ใน main memory อย่างถาวร แต่ทำไม่ได้ด้วยเหตุผล 2
ประการ
1.
Main
Memory เล็กเกินไปที่จะเก็บโปรแกรมและข้อมูลที่จำเป็นทั้งหมดอย่างถาวร
2.
Main
Memory เป็นอุปกรณ์ที่ใช้เก็บข้อมูลแบบชั่วขณะ
เพราะเมื่อปิดเครื่องข้อมูลก็หาย
ดังนั้นคอมพิวเตอร์จึงต้องมี secondary storage (หน่วยเก็บข้อมูลสำรอง)
เพื่อเก็บข้อมูลมาก ๆ ได้อย่างถาวร
ในเรื่อง storage
structures เราจะพูดถึง main memory, จานแม่เหล็ก
(magnetic disk) และ magnetic tape
2.3.1
Main Memory
- เป็นสื่อที่ใช้เก็บข้อมูลขนาดใหญ่ที่อยู่ใน
CPU ซึ่ง CPU สามารถจะเข้าถึงได้โดยตรง
- คำสั่งและข้อมูลต้องอยู่ใน
memory ก่อนที่จะทำงาน ถ้าข้อมูลไม่อยู่ใน memory จะต้องย้ายเข้ามาก่อนที่
CPU จะดำเนินการกับข้อมูลเหล่านั้น
- Memory-mapped I/O (ใช้เพื่ออำนวยความสะดวกในการเข้าถึง I/O device) คือช่วงของที่อยู่(address) ของ memory ที่ใช้ map ไปยัง device register
การอ่าน/เขียน
address
ของ memory เป็นเหตุให้ข้อมูลถูกโยกย้ายไป/กลับจาก
device register วิธีนี้ใช้ได้ดีกับอุปกรณ์ที่ตอบสนองได้รวดเร็ว
เช่น video controller
2.3.2
Magnetic Disks
คือโลหะแข็งหรือ
แผ่นเสียงแก้ว (platter)
ที่ปกคลุมไปด้วยสารแม่เหล็ก (ดูรูปประกอบ)
- แต่ละจานแผ่นเสียงมีรูปร่างกลมแบนเหมือน
CD เส้นผ่านศูนย์กลางประมาณ 1.8 – 5.25 นิ้ว
พื้นผิวทั้ง 2 หน้า ปกคลุมไปด้วยสารแม่เหล็ก
เหมือนเทปแม่เหล็ก (magnetic tape)
เราเก็บข้อมูลข่าวสาร
(Information)
โดยบันทึกบน platter
- หัวอ่าน-เขียนอยู่เหนือแต่ละพื้นผิวของทุก
ๆ platter และ หัวอ่าน-เขียนอยู่บน disk arm
- เราแบ่งพื้นผิวของ
platter เป็นวงกลมเรียกว่า track ซึ่งแบ่งเป็นส่วน ๆ
เรียกว่า sector
- ตั้ง
(กลุ่ม) ของ track ซึ่งตรงกับตำแหน่ง arm เดียวกัน เรียกว่า cylinder
- หน่วยความจุของ
disk drive
คือ gigabyte
- 1 kilobyte = 1024 bytes
- 1 megabyte = 10242 bytes
- 1 gigabyte = 10243 bytes
แต่โรงงานมักปัดเศษทิ้งดังนั้น
1
megabyte = 1 ล้านไบต์ 1 gigabyte = 1 พันล้านไบต์
- ความเร็วในการหมุนประมาณ
60 – 150 รอบ/วินาที
- ความเร็วของ
disk มี 2 ส่วน
- transfer rate คือ
อัตราการไหลของข้อมูลระหว่าง drive และ คอมพิวเตอร์
- positioning time (เวลาในการระบุตำแหน่ง) บางครั้งเรียกว่า random access time (เวลาในการเข้าถึงข้อมูลอย่างสุ่ม)
ประกอบไปด้วยเวลาในการเคลื่อน
disk
arm ไปสู่ cylinder ที่ต้องการ ซึ่งเรียกว่า seek
time และเวลาที่ใช้ในการหมุน sector ที่ต้องการไปสู่หัวอ่าน-เขียน
เรียกว่า rotational latency
- head crash คือ
อุบัติเหตุที่เกิดจากหัวอ่าน-เขียนไปถูกพื้นผิวของ disk
- disk controller เป็นตัวประสานระหว่าง
device กับคอมพิวเตอร์
2.3.3
Magnetic Tapes
- เก็บข้อมูลได้มาก
ถาวร
- เวลาในการเข้าถึงข้อมูลช้าเมื่อเทียบกับเวลาที่
main
memory ใช้
- random access time ช้ากว่า magnetic disk
- มักใช้ back up information ที่ใช้ไม่ค่อยบ่อย
- ความจุของเทปมากกว่า
disk 20 เท่า
- ความกว้างของเทปมีหลายขนาด
คือ 4 , 8 , 9 มิลลิเมตร และ ¼ , ½ นิ้ว
2.4
Storage Hierarchy (ลำดับขั้นของหน่วยเก็บข้อมูล)
แบ่งตาม
speed
ราคา และ Volatility (ความเปลี่ยนแปลงได้ง่าย)
ระดับบนสุดก็แพงแต่ทำงานได้รวดเร็ว ข้อมูลในหน่วยเก็บข้อมูลแบบชั่วขณะ (volatile
storage) จะหายไปเมื่อปิดเครื่อง
main
memory , cache และ registers คือ volatile
storage แต่ magnetic disk , optical disk ,magnetic tapes เป็น nonvolatile storage (หน่วยเก็บข้อมูลแบบถาวร)
ส่วน
electronic
disk เป็นแบบชั่วขณะและถาวร
ในการปฏิบัติการปกติ
electronic
disk จะเก็บข้อมูลใน array ของ DRAM ซึ่งเป็นแบบชั่วขณะ แต่ electronic disk device จะมี
magnetic hard disk ซ่อนอยู่และมี battery สำหรับ backup power ถ้าไฟดับ disk
controller จะคัดลอกข้อมูลจาก RAM ไปไว้ใน magnetic
disk เมื่อไฟมา controller จะคัดลอกข้อมูลกลับไปยัง
RAM
2.4.1
Caching
ปกติ
information
จะถูกเก็บไว้ใน storage (เช่น main
memory) เมื่อถูกเรียกใช้ มันจะถูกคัดลอกไปไว้ใน storage ที่เร็วกว่า นั่นคือ cache เมื่อเราต้องการ information
ซักชิ้น เริ่มต้นเราควรหาใน cache ถ้าเจอเราก็จะใช้มันได้เลย
จาก cache ถ้าไม่เจอ ค่อยไปหาจาก main storage แล้วเก็บสำเนาไว้ใน cache ภายใต้สมมติฐานที่ว่า
มีความน่าจะเป็นสูงที่มันจำเป็นจะต้องนำมาใช้อีก
Main
memory ก็เหมือนเป็น cache อย่างเร็วสำหรับหน่วยความจำสำรอง
เพราะข้อมูลต้องถูกคัดลอกจากหน่วยเก็บข้อมูลสำรองไปยัง main memory เพื่อใช้ และข้อมูลต้องอยู่ใน main memory ก่อนจะถูกย้ายไปยังหน่วยเก็บข้อมูลสำรองเพื่อเก็บ
2.4.2
Coherency and Consistency (ความสอดคล้อง)
ถ้าต้องการเพิ่มค่าของ
A ซึ่งอยู่ในไฟล์ B อีก 1 ซึ่งไฟล์
B อยู่ในเทปแม่เหล็ก
การเพิ่มค่านี้ทำได้โดยเริ่มจากการปฏิบัติการของ I/O จะคัดลอก
disk block ที่ A อยู่ไปไว้ใน main
memory และทำสำเนาของ A ไปยัง cache และยังไว้ใน internal register อีก ดังนั้น สำเนาของ
A ก็มีอยู่หลายที่ เมื่อเพิ่มค่าของ A ใน
internal register ค่าของ A ก็จะแตกต่างกันในอีกหลาย
ๆ ที่ ค่าของ A จะมาเหมือนกันหลังจากค่าใหม่ของ A ถูกเขียนกลับไปยัง magnetic disk
ในสิ่งแวดล้อมแบบมี
1 งาน ในเวลาหนึ่ง การทำงานก็ไม่ยาก เพราะการเข้าถึง A ก็เพียงทำสำเนาไปยังระดับที่สูงที่สุดของ hierarchy แต่ในสิ่งแวดล้อมแบบ
multitasking ซึ่ง CPU ต้อง switch
ไป switch มา 4 งาน
ต้องระวัง ถ้าหลาย ๆ กระบวนการต่างต้องการเข้าถึง A ซึ่งแต่ละ
process จะได้รับค่าของ A ที่ update
ที่สุด ในสิ่งแวดล้อมของ multiprocessor สำเนาของ
A อาจมีในหลาย ๆ cache ซึ่ง CPU
หลายตัวสามารถทำงานได้พร้อมกัน เราต้องทำให้มั่นใจว่า ค่าของ A
ที่ update ใน 1 cache จะสะท้อนไปทุก
ๆ caches ที่ A อยู่อย่างทันที
ปัญหานี้เรียกว่า cache coherency
ในสิ่งแวดล้อมของ
distributed
สำเนาของไฟล์เดียวกันสามารถเก็บในคอมพิวเตอร์ต่าง ๆ
สำเนาเหล่านั้นอาจถูก access และ update ได้ในเวลาเดียวกัน เราต้องทำให้แน่ใจว่าเมื่อสำเนาถูก update ในที่หนึ่ง ในที่อื่น ๆ ทั้งหมดก็ต้อง update ด้วย
ในทันที
2.5
Hardware Protection
ข้อผิดพลาดหลายอย่างมักจะตรวจสอบได้โดยฮาร์ดแวร์
ซึ่งสามารถควบคุมได้โดยระบบปฏิบัติการ เช่น
ถ้างานหนึ่งอ่านหรือเขียนข้อมูลออกนอกขอบเขตของตน หรือร้องขอคำสั่งที่ไม่ถูกต้อง
ฮาร์ดแวร์ก็จะส่งสัญญาณไปขัดจังหวะ แล้วย้ายการควบคุมไปที่ระบบปฏิบัติการ
ซึ่งจะทำการจัดการข้อผิดพลาดเหล่านั้น
ระบบอาจหยุดการทำงานของโปรแกรมที่มีข้อผิดพลาดนั้นไปเลย
และแสดงข้อความบอกความผิดพลาด พร้อมกับพิมพ์ค่าต่าง ๆ ในหน่วยความจำให้ดู
ข้อผิดพลาดที่อยู่ในหน่วยความจำมักเก็บไว้เป็นไฟล์ เพื่อให้ผู้ใช้ตรวจสอบหรือแก้ไขเพื่อเริ่มโปรแกรมใหม่
2.5.1
Dual-Mode Operation (การทำงานแบบ 2 ช่วง)
ระบบที่ดีต้องสามารถป้องกันตัวระบบเอง
โปรแกรมอื่นและข้อมูลจากโปรแกรมอื่น ๆ ไม่ให้เกิดข้อผิดพลาด
การป้องกันนี้ต้องอาศัยฮาร์ดแวร์ให้สามารถแยกความแตกต่างของ ช่วงการทำงาน (mode of operation) ออกเป็น
2 ช่วง คือ user mode และ monitor
mode (บางทีเรียกว่า supervisor mode, system mode หรือ privileged mode (ช่วงสงวน)) อาจกำหนดบิตขึ้นมา
1 บิต เรียกว่า บิตแสดงช่วง (mode bit) ในฮาร์ดแวร์ เพื่อให้ทราบว่าขณะนี้เป็นการทำงานใน mode ใด monitor(bit=0) หรือ user (bit=1)
เมื่อเริ่ม
boot
เครื่อง ฮาร์ดแวร์จะเริ่มด้วย monitor mode ระบบปฏิบัติการจะถูก
load มา และเริ่มการทำงานของผู้ใช้ใน user mode เมื่อเกิดสัญญาณ interrupt ฮาร์ดแวร์จะ switch
จาก user mode มาเป็น monitor mode
(bit จาก 1 เป็น 0) ดังนั้นเมื่อระบบปฏิบัติการได้การควบคุมมาจากคอมพิวเตอร์
มันก็อยู่ใน monitor mode และก่อนที่จะย้ายการควบคุมไปให้ผู้ใช้หรือโปรแกรม
ระบบก็จะสั่งให้ฮาร์ดแวร์เปลี่ยนเป็น user mode (bit เป็น 1)
การทำงานแบบ
Dual-Mode
นี้ สามารถป้องกันระบบหรืองานอื่น ๆ จากงานบางงานซึ่งมีข้อผิดพลาดได้
โดยการกำหนดให้คำสั่งฮาร์ดแวร์ (machine instruction) บางคำสั่งเป็นคำสั่งสงวน
(privileged instruction) ซึ่งฮาร์ดแวร์จะยอมให้ทำงานตามคำสั่งสงวนนี้ได้
เมื่ออยู่ใน monitor mode เท่านั้น
ถ้ามีการใช้คำสั่งสงวนนี้ใน user mode ฮาร์ดแวร์ก็จะไม่ปฏิบัติตามและถือว่าเป็นข้อผิดพลาด
ซึ่งจะทำให้เกิดการส่งสัญญาณขัดจังหวะไปยังระบบปฏิบัติการ
2.5.2
I/O Protection
โปรแกรมของผู้ใช้บางคนอาจก่อกวนระบบโดยใช้คำสั่งร้องขออุปกรณ์อย่างผิด
ๆ หรือ อ้างอิงตำแหน่งในหน่วยความจำที่อยู่ในส่วนของระบบปฏิบัติการ หรือ
ไม่ยอมคืนการควบคุม CPU
มาสู่ระบบ
ในหัวข้อนี้เราจะได้กล่าวถึงวิธีป้องกันสิ่งเหล่านี้
เพื่อป้องกันอุปกรณ์รับส่งข้อมูล
(I/O)
ต่าง ๆ เรากำหนดให้คำสั่งสำหรับร้องขออุปกรณ์ทุกชนิดเป็นคำสั่งสงวน
(Privileged instruction) ดังนั้นผู้ใช้จะไม่สามารถสั่งไปยังอุปกรณ์ได้โดยตรง
แต่ต้องร้องขอผ่านระบบปฏิบัติการเสมอ
ต้องทำให้แน่ใจว่า
โปรแกรมของผู้ใช้จะไม่มีทางทำงานใน monitor mode ได้ ขณะที่โปรแกรมของผู้ใช้ทำงานอยู่ใน user
mode เมื่อเกิดข้อผิดพลาด ระบบจะเปลี่ยนบิต เป็น monitor
mode แล้วย้ายการทำงานไป ณ ตำแหน่งที่กำหนดจากตารางสัญญาณ (interrupt
vector) สมมติว่าผู้ใช้แก้ไขค่าในตารางสัญญาณเพื่อให้ชี้ไปที่ตำแหน่งใหม่
ซึ่งเป็นโปรแกรมของผู้ใช้เอง แล้วปล่อยให้เกิดข้อผิดพลาด เพื่อให้ระบบเปลี่ยนเป็น monitor
mode แล้วย้ายการทำงานไป ณ ตำแหน่งในตาราง
(ซึ่งขณะนี้ชี้ไปที่โปรแกรมของผู้ใช้) ดังนั้นโปรแกรมของผู้ใช้จะสามารถทำงานใน monitor
mode ได้
2.5.3
Memory Protection
เราต้องป้องกันตารางสัญญาณ
(interrupt
vector) ไม่ให้ผู้ใช้เข้ามาแก้ไขได้
รวมทั้งโปรแกรมของระบบปฏิบัติการ (interrupt service routine) ก็ต้องมีการป้องกันด้วย
วิธีการป้องกันหน่วยความจำ
คือ ต้องแบ่งแยกหน่วยความจำสำหรับงานแต่ละงาน
และป้องกันไม่ให้งานหนึ่งเข้าไปอ่านหรือแก้ไขข้อมูลในส่วนของงานอื่นได้ การป้องกันนี้ทำได้โดย
register
2 ตัว เรียกว่า ฐาน (base) และ ขอบเขต (limit)
ดังรูปประกอบ
Base
register จะเก็บค่าตำแหน่งสุดท้ายที่ยอมให้ใช้ได้ใน memory
Limit
register จะเก็บขนาดของเนื้อที่ทั้งหมดของงาน ตัวอย่างเช่น ถ้า base
register เก็บค่า 300040 และ limit
register เก็บค่า 120900 โปรแกรมสามารถใช้หน่วยความจำในตำแหน่งตั้งแต่
300040 ถึง 420940
วิธีการป้องกันแบบนี้
ฮาร์ดแวร์ของ CPU
จะต้องตรวจสอบค่าตำแหน่งทุกครั้งที่มีการอ้างอิงหน่วยความจำ
เมื่ออยู่ใน user mode ถ้ามีการอ้างอิงนอกขอบเขตที่กำหนด
ก็จะเกิดการส่งสัญญาณขัดจังหวะไปสู่ระบบปฏิบัติการ
ซึ่งถือว่าเป็นข้อผิดพลาดอย่างรุนแรง (fatal error) ดังรูป
2.5.4
CPU Protection
ในการประกันว่า
การควบคุมจะย้ายกลับมายังระบบเสมอ
แม้ว่าจะมีงานบางงานทำงานวนรอบอย่างไม่มีที่สิ้นสุด (infinite loop) เราสามารถทำได้โดยการใช้นาฬิกาจับเวลา
(timer) นาฬิกานี้จะส่งสัญญาณไปขัดจังหวะฮาร์ดแวร์
เมื่อถึงช่วงเวลาที่กำหนด ซึ่งอาจมีค่าคงที่ (เช่น 1/60 วินาที)
หรือมีค่าเปลี่ยนแปลงได้ (เช่น จาก 1 มิลลิวินาที ถึง 1
วินาที โดยเพิ่มทีละ 1 มิลลิวินาที)
โดยปกติแล้วเราใช้นาฬิกาจริง (ในฮาร์ดแวร์) ร่วมกับตัวนับ (counter) เพื่อสร้างนาฬิกาจับเวลา ระบบปฏิบัติการจะเป็นผู้กำหนดค่าให้กับตัวนับ
เมื่อนาฬิกาจริงเดินไป 1 ติ๊ก ตัวนับก็จะนับถอยหลังลง 1
จนกระทั่งตัวนับมีค่าเป็น 0 ก็จะส่งสัญญาณไปขัดจังหวะฮาร์ดแวร์
ก่อนที่ระบบจะส่งการควบคุมไปยังโปรแกรมของผู้ใช้
ระบบก็จะตั้งนาฬิกาจับเวลาไว้ เมื่อถึงช่วงเวลาที่กำหนด นาฬิกาจับเวลาจะส่งสัญญาณมาขัดจังหวะฮาร์ดแวร์
ทำให้การควบคุมย้ายกลับมาที่ระบบปฏิบัติการ ซึ่งระบบอาจจะแก้ไขข้อผิดพลาด (fatal error) หรือต่อเวลาให้กับโปรแกรมผู้ใช้อีกก็ได้
คำสั่งในการกำหนดค่านาฬิกาจับเวลานี้ต้องเป็นคำสั่งสงวนด้วย
จะเห็นว่า
นาฬิกาจับเวลาสามารถป้องกันเวลาสามารถป้องกันไม่ให้โปรแกรมของผู้ใช้ทำงานหรือใช้ CPU นานเกินไปได้
วิธีง่าย ๆ ก็คือ กำหนดตัวนับเป็นค่าเวลาสูงสุดที่งานนั้น ๆ ต้องการใช้ เช่น
โปรแกรมงานซึ่งมีกำหนดเวลาไม่เกิน 7 นาที
เราอาจตั้งตัวนับให้เท่ากับ 420 และนาฬิกาจับเวลาก็ตั้งไว้ที่
1 วินาที ดังนั้นทุก ๆ 1 วินาที
นาฬิกาจับเวลาจะส่งสัญญาณไปขัดจังหวะการทำงานของโปรแกรม เราก็เพียงแต่นับถอยหลังไป
1 ตราบใดที่ค่าตัวนับยังเป็นบวก
การควบคุมก็จะถูกส่งกลับให้โปรแกรมผู้ใช้ เมื่อตัวนับมีค่าติดลบ
การควบคุมจะไม่ถูกส่งไป แต่ระบบจะหยุดการทำงานของโปรแกรมผู้ใช้ เนื่องจากทำงานเกินกว่าเวลาที่ได้รับอนุญาต
ปกติแล้วนาฬิกาจับเวลา จะใช้ระบบปันส่วน (time sharing) โดยอาจกำหนดให้ส่งสัญญาณทุก
ๆ N มิลลิวินาที N คือ ค่าส่วนแบ่งเวลา
(time slice) ที่ให้ผู้ใช้แต่ละคนทำงานก่อนคนอื่น
ระบบปฏิบัติการจะได้การควบคุมทุกครั้งที่นาฬิกาจับเวลานี้ส่งสัญญาณไปขัดจังหวะการทำงาน
ระบบก็จะจัด , เก็บ กำหนดค่าใน register , buffer , ตัวแปรภายใน , ปรับค่าอื่น ๆ
ที่จำเป็นสำหรับการย้ายให้งานอื่นได้มาใช้ CPU บ้าง
โดยทำงานต่อจากจุดที่หยุด (ถูก interrupt เพราะหมดเวลาตามส่วนแบ่ง
(time slice)) ครั้งก่อน
2.6
General System Architecture
เนื่องจากคำสั่งเกี่ยวกับการรับส่งข้อมูลเป็นคำสั่งสงวน
ดังนั้นผู้ที่จะทำคำสั่งนี้ได้ก็คือ ระบบปฏิบัติการเท่านั้น
โปรแกรมผู้ใช้งานไม่สามารถใช้คำสั่งรับส่งข้อมูลได้เอง
ไม่ว่าจะเป็นการใช้อย่างถูกต้องหรือไม่ก็ตาม ปัญหานี้แก้ไขได้โดย ถ้าผู้ใช้ต้องการใช้อุปกรณ์รับส่งข้อมูล
ก็ต้องร้องขอให้ผู้ควบคุม (monitor) ทำแทนจึงจะสามารถใช้ได้
ระบบคอมพิวเตอร์ส่วนใหญ่ในปัจจุบัน
จะมีคำสั่งพิเศษ เรียกว่า คำสั่งเรียกระบบ (system call) (หรือ คำสั่งเรียกผู้ควบคุม (monitor
call)) เมื่อมีการใช้คำสั่งเรียกระบบ (system call) ฮาร์ดแวร์จะทำเสมือนว่าเกิดการขัดจังหวะโดยโปรแกรม
และจะย้ายการควบคุมไปยังระบบตามตำแหน่งในตารางสัญญาณ (interrupt vector) พร้อมด้วยการเปลี่ยนบิตกำหนดช่วง (mode bit) เป็น monitor
mode โปรแกรมดำเนินงานตามคำสั่งเรียกระบบ (system-call
service routine) (ซึ่งนับเป็นส่วนหนึ่งของระบบปฏิบัติการ)
จะตรวจดูการขัดจังหวะนั้นว่าเป็นคำสั่งเรียกระบบให้ทำอะไร โดยดูจาก parameter
ที่มาร้องขอ parameter เหล่านี้อาจส่งผ่านมาทาง
register หรือหน่วยความจำ (ซึ่งถูกกำหนดตำแหน่งโดย register)
ระบบก็จะทำงานตามคำร้องขอนั้น ๆ และส่งการควบคุมกลับไปที่ system
call
ในการรับส่งข้อมูล
ผู้ใช้ต้องใช้คำสั่งเรียกระบบ (system call) ให้ระบบปฏิบัติการทำงานรับส่งข้อมูลแทนตัวผู้ใช้
ดังรูปถัดไป
ระบบซึ่งทำงานใน
monitor
mode ก็จะตรวจดูคำร้องขอว่าถูกต้องหรือไม่ และทำงานตามคำร้องของนั้น
แล้วส่งการควบคุมกลับคืนให้ผู้ใช้ต่อไป
ไม่มีความคิดเห็น:
แสดงความคิดเห็น