lOMoARcPSD| 58833082
13.1 Overview
- Trình điều khuyển (device drivers) cung cấp một giao diện truy cập thiết bị thống nhất cho hệ
thống con I/O, giống như cách các lệnh gọi hệ thống (system calls) cung cấp một giao diện tiêu
chuẩn giữa ứng dụng và hệ điều hành.
13.2 I/O Hardware
- Máy tính sử dụng nhiều loại thiết bị I/O khác nhau, bao gồm thiết bị lưu trữ (đĩa, băng từ),
thiếtbị truyền dữ liệu (mạng, Bluetooth), và thiết bị giao tiếp với con người (màn hình, bàn
phím, chuột, âm thanh)
- Các thiết bị này kết nối với máy tính qua cổng (port) hoặc bus, trong đó bus là tập hợp các dây
dẫn và giao thức truyền dữ liệu. Một số thiết bị được kết nối theo chuỗi daisy chain, hoạt động
như một bus.
- Bộ điều khiển (controller) là mạch điện tử dùng để vận hành cổng, bus hoặc thiết bị.
- Bộ xử lý giao tiếp với bộ điều khiển thông qua thanh ghi (register) chứa dữ liệu và tín hiệu
điềukhiển. Có hai phương pháp chính:
- Lệnh I/O đặc biệt: Bộ xử lý sử dụng các lệnh đặc biệt để gửi dữ liệu qua địa chỉ cổng I/O.
- I/O ánh xạ bộ nhớ (Memory-mapped I/O): Thanh ghi điều khiển được ánh xạ vào không gianbộ
nhớ, cho phép CPU đọc/ghi dữ liệu như với bộ nhớ thông thường. Phương pháp này nhanh hơn
nhưng có rủi ro do lỗi ghi sai địa chỉ.
- Mỗi cổng I/O thường có bốn thanh ghi chính:
- Data-in register: Nhận dữ liệu đầu vào.
- Data-out register: Gửi dữ liệu đầu ra.
- Status register: Báo trạng thái thiết bị (hoàn thành lệnh, lỗi, v.v.).
- Control register: Thiết lập chế độ hoạt động của thiết bị.
13.2.1 Polling
- Giao thức tương tác giữa bộ điều khiển và máy chủ có thể phức tạp, nhưng nguyên tắc cơ bản
của handshaking rất đơn giản. Bộ điều khiển sử dụng busy bit trong thanh ghi trạng thái để báo
hiệu trạng thái của nó (1 là bận, 0 là sẵn sàng), trong khi máy chủ sử dụng command-ready bit
trong thanh ghi lệnh để gửi yêu cầu.
- Quá trình truyền dữ liệu diễn ra như sau:
- Máy chủ kiểm tra busy bit cho đến khi nó bằng 0 (sẵn sàng).
- Máy chủ đặt write bit và ghi dữ liệu vào thanh ghi data-out.
lOMoARcPSD| 58833082
- Máy chủ đặt command-ready bit để báo lệnh sẵn sàng.
- Bộ điều khiển phát hiện command-ready bit, sau đó đặt busy bit.
- Bộ điều khiển đọc lệnh, lấy dữ liệu từ data-out và thực hiện I/O.
- Bộ điều khiển xóa command-ready bit, xóa lỗi (nếu có), và xóa busy bit.
- Chu trình này lặp lại với mỗi byte dữ liệu.
- Ban đầu, máy chủ sử dụng polling (bận chờ) bằng cách kiểm tra liên tục busy bit.
- Nếu bộ điều khiển nhanh, phương pháp này hợp lý. Tuy nhiên, nếu thời gian chờ lâu, polling
gây lãng phí tài nguyên CPU. Đặc biệt, với thiết bị như bàn phím hoặc cổng nối tiếp, dữ liệu có
thể bị mất nếu không được xử lý kịp thời.
- Thay vì polling, hệ thống có thể sử dụng interrupt (ngắt). Khi thiết bị sẵn sàng, bộ điều khiển
sẽgửi tín hiệu ngắt đến CPU, giúp giảm lãng phí tài nguyên và cải thiện hiệu suất hệ thống.
13.2.2 Interupt
- Cơ chế ngắt giúp CPU phản ứng với các sự kiện bất đồng bộ, chẳng hạn khi một bộ điều khiển
thiết bị sẵn sàng phục vụ. Ngắt hoạt động như sau:
- Phát hiện ngắt: CPU kiểm tra interrupt-request line sau mỗi lệnh thực thi. Khi có tín hiệu, CPU
lưu trạng thái và nhảy đến trình xử lý ngắt (interrupt handler).
- Xử lý ngắt: Trình xử lý xác định nguyên nhân ngắt, thực hiện xử lý cần thiết, khôi phục
trạngthái CPU và tiếp tục chương trình trước đó.
- Các hệ thống hiện đại cần những tính năng xử lý ngắt nâng cao:
- Hoãn xử lý ngắt khi CPU đang thực thi các tác vụ quan trọng.
- Xác định nhanh nguồn ngắt mà không cần kiểm tra tuần tự tất cả thiết bị.
- Phân cấp độ ưu tiên ngắt để xử lý các ngắt quan trọng trước.
1. Phần cứng hỗ trợ ngắt
CPU có hai loại ngắt:
- Ngắt không thể che (Non-maskable interrupt - NMI): Dành cho lỗi nghiêm trọng như lỗi
bộ nhớ không thể khôi phục.
- Ngắt có thể che (Maskable interrupt): Được sử dụng bởi các bộ điều khiển thiết bị và có
thể bị vô hiệu hóa tạm thời.
Cơ chế vectored interrupt giúp CPU nhanh chóng tìm đúng trình xử lý bằng bảng vector ngắt,
thay vì kiểm tra tuần tự tất cả các thiết bị. Nếu số lượng thiết bị vượt quá số phần tử trong bảng
vector, hệ thống sử dụng interrupt chaining để xử lý.
lOMoARcPSD| 58833082
Hệ thống cũng hỗ trợ mức ưu tiên ngắt, cho phép CPU trì hoãn ngắt mức thấp và ưu tiên xử lý
các ngắt quan trọng hơn.
2. Ngắt trong hệ điều hành
- Khởi động (Booting): Hệ điều hành dò tìm phần cứng và thiết lập trình xử lý ngắt trong bảng
vector.
- Xử lý I/O: Các thiết bị kích hoạt ngắt khi hoàn tất nhập/xuất hoặc phát hiện lỗi.
- Quản lý ngoại lệ: Ngắt được sử dụng để xử lý lỗi như chia cho 0 hoặc truy cập bộ nhớ không
hợp lệ.
- Hỗ trợ bộ nhớ ảo: Ngắt trang (page fault) giúp hệ điều hành tải trang bộ nhớ vào RAM khi cần.
- Lời gọi hệ thống (System calls): Một chương trình thực hiện trap (ngắt phần mềm) để yêu cầu
dịch vụ từ hệ điều hành.
3. Quản lý ngắt trong hệ điều hành hiện đại
- Tối ưu hóa hiệu suất: Hệ điều hành ưu tiên xử lý các ngắt quan trọng trước, chẳng hạn ưu
tiên khởi động một yêu cầu I/O mới hơn là sao chép dữ liệu vào bộ nhớ ứng dụng.
- Kiến trúc nhân đa luồng: Trong Solaris, các trình xử lý ngắt chạy như luồng nhân (kernel
threads), cho phép xử lý nhiều ngắt đồng thời trên hệ thống đa bộ xử lý.
13.2.3 Direct Memory Access
1. Bộ điều khiển DMA và cơ chế truyền dữ liệu
- Trong các thiết bị thực hiện truyền dữ liệu lớn như ổ đĩa, việc sử dụng CPU để giám sát trạng
thái và truyền từng byte qua bộ điều khiển thiết bị (Programmed I/O - PIO) là không hiệu quả.
Thay vào đó, hầu hết máy tính hiện đại sử dụng bộ điều khiển truy cập trực tiếp vào bộ nhớ
(Direct Memory Access – DMA) để giảm tải cho CPU.
2. Cách hoạt động của DMA
- CPU tạo một khối lệnh DMA trong bộ nhớ, chứa:
- Địa chỉ nguồn dữ liệu cần truyền.
- Địa chỉ đích để lưu dữ liệu.
-Số byte cần truyền.
- CPU gửi địa chỉ của khối lệnh này đến bộ điều khiển DMA, sau đó tiếp tục thực hiện các tác
vụkhác.
- Bộ điều khiển DMA trực tiếp thao tác trên bus bộ nhớ để thực hiện truyền dữ liệu mà không
cần sự can thiệp của CPU.
- Sau khi truyền xong, DMA gửi tín hiệu ngắt để báo CPU biết quá trình hoàn tất.
lOMoARcPSD| 58833082
- DMA sử dụng hai tín hiệu để giao tiếp với bộ điều khiển thiết bị:
-DMA-request: Bộ điều khiển thiết bị gửi tín hiệu này khi dữ liệu sẵn sàng.
- DMA-acknowledge: Bộ điều khiển DMA phản hồi, bắt đầu truyền dữ liệu vào bộ nhớ.
3. Ưu điểm DMA
- Tăng hiệu suất hệ thống: CPU không cần tham gia trực tiếp vào quá trình truyền dữ liệu, giảm
tải cho bộ xử lý chính.
- Giảm độ trễ I/O: DMA giúp truyền dữ liệu nhanh hơn PIO, đặc biệt với khối lượng dữ liệu lớn.
4. Nhược điểm DMA
- Chu kỳ đánh cắp (Cycle Stealing): Khi DMA chiếm quyền điều khiển bộ nhớ, CPU bị chặn tạm
thời, gây giảm hiệu suất xử lý của CPU.
5. DMA và bảo mật hệ thống
- Trong các hệ điều hành bảo vệ bộ nhớ, hệ điều hành kiểm soát quyền truy cập thiết bị để
ngăn chặn truy cập trái phép hoặc lỗi có thể gây sập hệ thống.
- Một số hệ điều hành không có bảo vệ bộ nhớ cho phép tiến trình truy cập trực tiếp thiết bị
để tăng hiệu suất nhưng tiềm ẩn rủi ro bảo mật và mất ổn định.
13.2.4 I/O Hardware Summary
Mặc dù phần cứng I/O có thể rất phức tạp ở mức thiết kế điện tử chi tiết, nhưng một số khái
niệm chính đủ để hiểu các tính năng I/O của hệ điều hành:
1. Bus: Hệ thống giao tiếp giữa CPU, bộ nhớ và thiết bị ngoại vi.
2. Bộ điều khiển (Controller): Bộ phận trung gian giữa thiết bị và hệ thống máy tính, giúp quản
lý quá trình truyền dữ liệu.
3. Cổng I/O và các thanh ghi (I/O Port & Registers): Dùng để lưu trữ dữ liệu và trạng thái thiết
bị.
4. Cơ chế bắt tay (Handshaking) giữa máy chủ và bộ điều khiển thiết bị: Quá trình trao đổi tín
hiệu để đồng bộ dữ liệu.
5.Cách thực hiện bắt tay:
- Polling: CPU liên tục kiểm tra trạng thái thiết bị.
- Interrupts: Thiết bị gửi tín hiệu ngắt khi sẵn sàng, giúp CPU tiết kiệm tài nguyên.
6. Bộ điều khiển DMA: Giảm tải công việc truyền dữ liệu lớn cho CPU.
lOMoARcPSD| 58833082
Thách thức trong thiết kế hệ điều hành
- Mỗi loại thiết bị có đặc điểm và giao thức khác nhau → Không thể viết mã riêng cho
từng thiết bị.
- Cần một giao diện I/O thống nhất cho ứng dụng → Hệ điều hành phải cung cấp cơ chế
trừu tượng hóa để các ứng dụng có thể sử dụng I/O mà không quan tâm đến chi tiết phần cứng.
-> Giải pháp: Hệ điều hành sử dụng các lớp trừu tượng và giao diện thống nhất để hỗ trợ nhiều
thiết bị khác nhau mà không cần chỉnh sửa hệ thống.
13.3 Application I/O Interface
Mục tiêu: Chuẩn hóa cách hệ điều hành làm việc với thiết bị I/O, để ứng dụng không cần
biếtchi tiết phần cứng.
Cách tiếp cận:
Trừu tượng hóa (Abstraction)
Đóng gói (Encapsulation)
Phân tầng phần mềm (Software layering)
Trình điều khiển thiết bị (Device Driver):
Ẩn sự khác biệt giữa các thiết bị.
Giao tiếp với hệ điều hành thông qua giao diện chuẩn.
Lợi ích:
Hệ điều hành dễ phát triển hơn.
Thiết bị mới dễ tích hợp hơn nếu hỗ trợ giao diện phổ biến hoặc có driver phù hợp.
Khó khăn:
Mỗi hệ điều hành có tiêu chuẩn driver khác nhau → thiết bị cần nhiều driver cho từng hệ
điều hành.
Đặc điểm thiết bị I/O:
Luồng ký tự (character) vs Thiết bị khối (block)
Truy cập tuần tự vs Ngẫu nhiên
Đồng bộ vs Bất đồng bộ
Dùng riêng vs Dùng chung
Tốc độ: Từ chậm (bàn phím) đến rất nhanh (ổ SSD)
Hướng dữ liệu: Chỉ đọc, chỉ ghi hoặc cả hai
lOMoARcPSD| 58833082
Các kiểu truy cập I/O phổ biến:
Block I/O
Character-stream I/O
Memory-mapped files
Network sockets
Lệnh đặc biệt:
ioctl() trong UNIX: Cho phép ứng dụng gửi lệnh tùy chỉnh đến driver.
13.1.1 Block and Character Devices
1. Giao diện thiết bị khối (Block-device interface)
Dành cho các thiết bị lưu trữ như ổ đĩa, hoạt động theo từng khối dữ liệu.
Các lệnh cơ bản gồm: o read() – đọc dữ liệu o write() – ghi dữ liệu
o seek() – di chuyển đến khối cụ thể (với thiết bị truy cập ngẫu
nhiên)
Ứng dụng thường truy cập thiết bị khối thông qua hệ thống tập tin, giúp ẩn đi sự khác biệt
phần cứng.
2. Raw I/O (Truy cập thô)
Dành cho hệ điều hành hoặc ứng dụng đặc biệt như hệ quản trị cơ sở dữ liệu.
Truy cập trực tiếp thiết bị như một mảng tuyến tính các khối, bỏ qua hệ thống tập tin.
Giúp tránh trùng lặp hoặc xung đột về bộ đệm (buffering) và khóa (locking). Tuy
nhiên, hệ điều hành không cung cấp dịch vụ gì khi dùng chế độ này.
3. Direct I/O (I/O trực tiếp)
Là sự thỏa hiệp: hệ điều hành cho phép vô hiệu hóa bộ đệm và khóa khi truy cập tập tin.
Giúp ứng dụng kiểm soát thiết bị tốt hơn mà vẫn giữ được một số chức năng hệ điều
hành.
4. Memory-mapped file access (Truy cập tập tin ánh xạ bộ nhớ)
Dữ liệu trên đĩa được ánh xạ vào không gian bộ nhớ ảo của tiến trình.
Truy cập dữ liệu như đọc/ghi bộ nhớ, thay vì dùng read() hay write().
Hiệu quả vì dùng cơ chế như nhu cầu phân trang (demand paging).
Dễ dùng cho lập trình viên và thường được hệ điều hành sử dụng nội bộ, ví dụ:
o Thực thi chương trình: ánh xạ file thực thi vào bộ nhớ. o Truy
cập vùng swap trong kernel.
5. Giao diện luồng ký tự (Character-stream interface)
lOMoARcPSD| 58833082
Ví dụ thiết bị: bàn phím, chuột, modem, máy in, card âm thanh.
Truy cập dữ liệu theo từng ký tự một, với lệnh như get()put().
Phù hợp cho thiết bị nhập dữ liệu không định kỳ, không thể đoán trước.
Có thể xây dựng thư viện bên trên hỗ trợ nhập theo dòng, có bộ đệm và xử lý phím xoá,
v.v.
13.3.2 Network Devices
I/O mạng có đặc điểm rất khác so với I/O đĩa, nên hệ điều hành thường cung cấp một
giao diện riêng thay vì dùng chung read()write()seek() như với thiết bị lưu trữ.
1. Giao diện socket (socket interface)
Phổ biến trên UNIX, Windows.
Tương tự ổ cắm điện: bất kỳ ứng dụng nào cũng có thể "cắm vào". Cho phép ứng
dụng:
o Tạo socket
o Kết nối socket địa phương với socket từ xa
o Lắng nghe kết nối đến o Gửi và nhận dữ liệu (packet)
2. Hàm select()
Quản lý nhiều socket cùng lúc.
Giúp kiểm tra socket nào sẵn sàng nhận/gửi dữ liệu.
Tránh được việc polling (thăm dò liên tục) hoặc busy waiting (vòng lặp chờ tốn tài
nguyên).
3. Lợi ích
Trừu tượng hóa hành vi mạng.
Cho phép ứng dụng phân tán hoạt động hiệu quả trên bất kỳ phần cứng mạng hoặc giao
thức nào.
4. Giao diện khác
Windows: Có giao diện riêng cho card mạng và giao thức mạng.
UNIX: Hỗ trợ nhiều mô hình giao tiếp:
o Ống nửa song công (pipes)
o FIFO song công
o STREAMS
o Hàng đợi thông điệp (message queues) o Socket
lOMoARcPSD| 58833082
13.3.3 Clocks and Timers
1. Chức năng cơ bản của đồng hồ và bộ định thời phần cứng:
Cung cấp thời gian hiện tại
Đo thời gian đã trôi qua
Cài đặt hẹn giờ để thực hiện một tác vụ tại thời điểm cụ thể (T)
Các chức năng này rất quan trọng với hệ điều hành và ứng dụng cần xử lý theo thời gian.
2. Bộ định thời có thể lập trình được (programmable interval timer):
Cài đặt để tạo ngắt (interrupt) sau một khoảng thời gian.
Có thể cài đặt để chạy một lần hoặc lặp lại định kỳ.
Ứng dụng: o Bộ lập lịch (scheduler) dùng để ngắt tiến trình khi hết thời gian CPU (time
slice). o Hệ thống I/O dùng để ghi bộ đệm (cache) ra đĩa định kỳ.
o Mạng dùng để hủy tác vụ chậm (do tắc nghẽn mạng...).
3. Hỗ trợ từ hệ điều hành:
Cho phép tiến trình người dùng sử dụng hẹn giờ.
Giả lập đồng hồ ảo (virtual clocks) để phục vụ nhiều yêu cầu hẹn giờ hơn số kênh phần
cứng.
o Kernel duy trì danh sách các sự kiện cần ngắt, sắp xếp theo thời gian gần nhất.
o Mỗi khi ngắt xảy ra, kernel xử lý yêu cầu và nạp lại thời gian hẹn tiếp theo.
4. Độ phân giải và độ chính xác:
Tốc độ ngắt đồng hồ thường từ 18–60 lần/giây → khá thô, không phù hợp với hệ thống
xử lý nhanh hiện nay.
Độ chính xác bị giới hạn bởi độ phân giải thấp và chi phí mô phỏng đồng hồ ảo.
Clock drift (trôi thời gian) có thể xảy ra nếu dùng ngắt định kỳ để duy trì đồng hồ hệ
thống.
5. Đồng hồ tần số cao (high-frequency counter):
Có trong nhiều máy tính hiện đại.
Có thể đọc trực tiếp từ thanh ghi phần cứng → đo thời gian chính xác cao, dù không tạo
ra ngắt.
13.3.4 Nonblocking and Asynchronous I/O
1. Blocking I/O (Gọi hệ thống đồng bộ – chặn):
Khi ứng dụng gọi hàm I/O blocking, chương trình tạm dừng thực thi và chuyển sang hàng
đợi chờ (wait queue).
lOMoARcPSD| 58833082
Sau khi I/O hoàn tất, tiến trình được đưa lại vào hàng đợi thực thi (run queue).
Dễ lập trình, vì xử lý tuyến tính và rõ ràng. Phù hợp với phần lớn ứng dụng đơn giản.
2. Nonblocking I/O (Gọi không chặn):
Lệnh gọi trả về ngay lập tức, không chờ I/O hoàn tất.
Trả về số byte đã chuyển (có thể là đầy đủ, một phần, hoặc 0).
Phù hợp với ứng dụng cần xử lý song song I/O và tính toán, ví dụ: giao diện người dùng,
phát video.
Có thể được sử dụng cùng với đa luồng (multithreading) để luồng này đợi I/O, luồng
khác tiếp tục xử lý.
3. Asynchronous I/O (Gọi bất đồng bộ):
Lệnh gọi I/O trả về ngay, và việc truyền dữ liệu diễn ra ngầm, hoàn tất vào thời điểm
trong tương lai.
Kết quả được thông báo qua:
o Biến được gán trong vùng nhớ ứng dụng, o Tín hiệu (signal), o Ngắt phần mềm
(software interrupt), o Callback function.
Khác với nonblocking ở chỗ: asynchronous luôn thực hiện toàn bộ yêu cầu, còn
nonblocking có thể thực hiện một phần hoặc không có gì.
4. Hệ điều hành và I/O bất đồng bộ:
Nhiều hoạt động I/O bất đồng bộ được ẩn bên trong hệ điều hành:
o Ghi đĩa, gửi mạng có thể được ghi bộ đệm và xử lý sau.
o Dữ liệu chưa ghi có thể bị mất nếu máy tắt đột ngột.
UNIX có thể flush dữ liệu mỗi 30 giây để giảm rủi ro mất dữ liệu.
Dữ liệu đọc từ bộ đệm có thể không nhất quán nếu nhiều luồng truy cập cùng file → cần
có cơ chế khóa (locking).
5. Ví dụ điển hình – select() và biến thể: select() dùng để kiểm tra socket có sẵn để
đọc/ghi hay không.
Nếu thời gian chờ đặt bằng 0, ứng dụng sẽ poll thiết bị (kiểm tra liên tục mà không chặn).
Dùng select() cần gọi thêm read() hoặc write() → tốn thêm chi phí xử lý.
lOMoARcPSD| 58833082
Mach OS có biến thể là gọi đọc nhiều thiết bị, chặn cho đến khi một trong các yêu cầu
hoàn tất.
13.3.5 Vectored I/O
Vectored I/O là một kiểu gọi hệ thống I/O đặc biệt, cho phép một lệnh hệ thống duy nhất
thực hiện nhiều thao tác I/O liên quan đến nhiều vùng bộ nhớ khác nhau.
Ví dụ: Hàm readv trong UNIX có thể đọc dữ liệu từ nguồn vào một tập hợp các bộ đệm
(vector), hoặc ghi dữ liệu từ các bộ đệm này ra thiết bị đích.
Lợi ích của vectored I/O:
1. Giảm chi phí hệ thống:
o Thay vì nhiều lần gọi hệ thống (system calls), chỉ cần một lần gọi duy nhất →
giảm thời gian chuyển ngữ cảnh (context switching) và overhead hệ thống.
2. Tăng hiệu suất (throughput):
o Không cần phải gộp dữ liệu lại thành một bộ đệm lớn trước khi truyền.
o Truyền dữ liệu từ nhiều vùng nhớ riêng biệt một cách trực tiếp và hiệu quả hơn.
3. Hỗ trợ tính nguyên tử (atomicity):
o Một số hệ điều hành hỗ trợ scatter–gather I/O với tính nguyên tử, đảm bảo toàn
bộ thao tác I/O được thực hiện liền mạch, không bị gián đoạn → tránh lỗi dữ liệu
khi nhiều luồng cùng thao tác I/O.
Kết luận:
Vectored I/O là kỹ thuật mạnh mẽ, giúp tối ưu hiệu năng hệ thống I/O, được sử dụng phổ
biến trong các hệ điều hành hiện đại khi làm việc với nhiều vùng nhớ phân tán.
13.4 Kernel I/O Subsystem
13.4.1 I/O Scheduling
Lập lịch I/O là quá trình sắp xếp thứ tự thực hiện các yêu cầu I/O sao cho hiệu quả, giảm
thời gian chờ trung bình, và chia sẻ tài nguyên công bằng giữa các tiến trình.
Ví dụ minh họa:
Nếu đầu đọc của đĩa đang ở đầu đĩa, ba tiến trình yêu cầu đọc:
o Tiến trình 1: đọc ở cuối đĩa. o Tiến trình 2: đọc ở đầu
đĩa.
o Tiến trình 3: đọc ở giữa.
Lập lịch tối ưu là xử lý theo thứ tự: 2 → 3 → 1, để giảm tối đa khoảng di chuyển của đầu
đọc.
lOMoARcPSD| 58833082
Cơ chế hoạt động:
Mỗi thiết bị có một hàng đợi chờ (wait queue) để lưu các yêu cầu I/O.
Bộ lập lịch I/O của hệ điều hành sẽ tái sắp xếp hàng đợi để tối ưu hiệu suất hoặc đảm bảo
công bằng (ví dụ ưu tiên truy xuất từ bộ nhớ ảo hơn là từ ứng dụng).
Bảng trạng thái thiết bị (Device-Status Table)
Kernel quản lý một bảng trạng thái cho các thiết bị đang được sử dụng (xem hình 13.9).
Mỗi mục trong bảng ghi: o Loại thiết bị (ví dụ: chuột, bàn phím, ổ đĩa...). o Trạng thái:
nhàn rỗi, bận, hoặc không hoạt động. o Thông tin yêu cầu I/O hiện tại (loại thao tác, địa
chỉ, kích thước...).
Khi nào cần bảng này:
Với I/O bất đồng bộ (asynchronous I/O), hệ điều hành cần theo dõi nhiều yêu cầu cùng
lúc → phải có cách lưu trạng thái từng thiết bị và yêu cầu liên quan.
Ngoài ra:
I/O subsystem cũng nâng cao hiệu suất bằng các kỹ thuật như:
o Buffering (bộ đệm), o Caching (bộ nhớ
đệm), o Spooling (xếp hàng đệm, ví dụ in tài
liệu).
13.4.2 Buffering
1. Giải quyết sự chênh lệch tốc độ giữa nguồn phát và nguồn nhận
Ví dụ: Khi tải file từ modem (rất chậm) và lưu vào đĩa cứng (rất nhanh).
Giải pháp: Dùng hai bộ đệm (double buffering):
o Modem ghi dữ liệu vào bộ đệm 1.
o Sau khi bộ đệm 1 đầy, hệ thống ghi nó ra đĩa, trong khi modem tiếp tục ghi vào
bộ đệm 2.
o Quá trình này lặp lại, giúp tách biệt tốc độ giữa modem và ổ đĩa. Giúp giảm
yêu cầu về đồng bộ thời gian giữa thiết bị nhanh và chậm.
2. Thích nghi với sự khác biệt về kích thước dữ liệu giữa các thiết bị
Ví dụ: Trong mạng máy tính:
o Tin nhắn lớn từ ứng dụng được chia nhỏ (fragmentation) thành các gói tin.
o Các gói tin được lưu vào bộ đệm để tái hợp (reassembly buffer) tại phía nhận để
tái tạo lại dữ liệu ban đầu.
lOMoARcPSD| 58833082
3. Hỗ trợ cơ chế "copy semantics" trong I/O của ứng dụng
Copy semantics đảm bảo rằng dữ liệu được ghi ra thiết bị là đúng tại thời điểm gọi
system call, ngay cả khi sau đó ứng dụng thay đổi nội dung bộ đệm của mình.
Thực hiện bằng cách:
o Hệ điều hành sao chép dữ liệu từ bộ đệm của ứng dụng sang bộ đệm của kernel,
sau đó mới ghi ra thiết bị.
o Điều này tránh bị ảnh hưởng bởi các thay đổi sau đó của ứng dụng.
Tuy việc sao chép có thể gây tốn tài nguyên, nhưng nó mang lại tính nhất quán và an toàn
dữ liệu.
Có thể tối ưu hơn bằng cách sử dụng kỹ thuật ánh xạ bộ nhớ ảo (virtual memory
mapping) và copy-on-write.
13.4.3 Caching
Cache là một vùng bộ nhớ nhanh dùng để lưu bản sao của dữ liệu từ nơi lưu trữ chậm
hơn, giúp truy cập dữ liệu hiệu quả hơn. o Ví dụ: Lệnh của tiến trình đang chạy được lưu
trên đĩa, sau đó được cache vào bộ nhớ chính (RAM), rồi lại được cache thêm trong bộ
nhớ đệm của CPU (L1, L2).
Buffer là nơi tạm lưu dữ liệu gốc khi chuyển giữa các thiết bị hoặc giữa thiết bị và ứng
dụng.
Sự khác biệt chính:
Buffer có thể chứa bản gốc duy nhất của dữ liệu.
Cache luôn chứa bản sao của dữ liệu từ nơi khác.
Sử dụng kết hợp:
Trong nhiều trường hợp, một vùng nhớ có thể vừa làm buffer vừa làm cache.
o Ví dụ: Hệ điều hành dùng buffer trong RAM để lưu dữ liệu đĩa tạm thời nhằm
đảm bảo tính toàn vẹn dữ liệu (copy semantics) và lập lịch ghi đĩa hiệu quả.
o Những vùng nhớ này cũng hoạt động như cache, giúp các ứng dụng chia sẻ tệp
hoặc đọc/ghi tệp nhanh chóng hơn nếu dữ liệu đã được lưu sẵn trong bộ đệm.
Lợi ích:
Nếu dữ liệu đã có trong buffer cache, hệ điều hành có thể tránh hoặc trì hoãn việc truy
xuất đĩa, từ đó nâng cao hiệu năng I/O.
Các ghi đĩa được tập hợp lại trong buffer cache trong vài giây để tối ưu hóa hiệu quả ghi
và giảm số lần ghi.
lOMoARcPSD| 58833082
13.4.4 Spooling and device reservation
Spooling – Bộ đệm hàng đợi thiết bị I/O
Spool là một bộ đệm (buffer) dùng để giữ dữ liệu đầu ra cho các thiết bị không thể xử lý
song song nhiều luồng dữ liệu, như máy in.
Ví dụ: Nhiều ứng dụng cùng lúc muốn in, nhưng máy in chỉ phục vụ một tác vụ tại một
thời điểm.
Cách hoạt động:
Hệ điều hành chặn dữ liệu in từ các ứng dụng và ghi chúng vào các file tạm trên đĩa
(spool files).
Sau khi một ứng dụng hoàn tất việc in, hệ thống spooling sẽ đưa file tương ứng vào hàng
đợi và lần lượt in từng file.
Hệ thống spooling có thể được quản lý bởi:
o Một tiến trình daemon (chạy nền), hoặc o
Một luồng (thread) trong nhân hệ điều hành.
Chức năng quản lý spool:
Hiển thị hàng đợi in.
Hủy lệnh in chưa in.
Tạm dừng in để bảo trì thiết bị, v.v.
Xử lý truy cập thiết bị độc quyền (Exclusive Device Access)
Một số thiết bị như máy in, ổ băng (tape drives) không thể dùng chung cho nhiều ứng
dụng cùng lúc.
Hệ điều hành cung cấp các cách để điều phối truy cập độc quyền:
Các phương pháp:
1. Spooling (như đã nói ở trên).
2. Cấp phát và thu hồi thiết bị:
o Ví dụ: Hệ điều hành VMS cho phép tiến trình yêu cầu quyền sở hữu thiết bị rảnh
và trả lại thiết bị sau khi dùng xong.
3. Giới hạn số lượng tay cầm (file handle): o Chỉ cho phép một ứng dụng mở thiết bị tại
một thời điểm.
4. Hỗ trợ đồng bộ hóa giữa các tiến trình:
o Ví dụ: Windows cung cấp lệnh đợi thiết bị sẵn sàng, và tham số trong OpenFile()
để xác định quyền truy cập được chia sẻ hay không.
lOMoARcPSD| 58833082
Trong các hệ điều hành này, ứng dụng cần tự tránh deadlock khi chia sẻ thiết bị.
13.4.5 Error Handling
Bảo vệ bộ nhớ và xử lý lỗi trong hệ điều hành
Hệ điều hành sử dụng bộ nhớ được bảo vệ (protected memory) để ngăn chặn lỗi phần
cứng hoặc lỗi ứng dụng gây ra sự cố toàn hệ thống.
Các thiết bị và thao tác I/O có thể gặp lỗi do:
lOMoARcPSD| 58833082
o Lỗi tạm thời (transient): ví dụ mạng bị quá tải, mất kết nối tạm thời. o Lỗi vĩnh
viễn: ví dụ bộ điều khiển đĩa bị hỏng.
Cách hệ điều hành xử lý lỗi:
Lỗi tạm thời thường có thể được xử lý tự động:
o Ví dụ: đọc đĩa lỗi → hệ điều hành thử đọc lại (retry).
o Gửi dữ liệu mạng thất bại → hệ thống gửi lại (resend) nếu giao thức hỗ trợ.
Lỗi nghiêm trọng (vĩnh viễn) như thiết bị hỏng hóc phần cứng → hệ điều hành khó hoặc
không thể khôi phục.
Cách báo lỗi trong hệ điều hành
Gọi hệ thống I/O thường chỉ trả về 1 bit thông tin: thành công hay thất bại.
Trong UNIX: o Biến errno được dùng để ghi mã lỗi (khoảng 100 mã lỗi phổ biến), như:
Đối số không hợp lệ.
Con trỏ sai.
Tập tin chưa mở...
Thông tin lỗi phần cứng chi tiết (ví dụ: thiết bị SCSI)
Một số phần cứng (như thiết bị SCSI) có thể cung cấp thông tin lỗi rất chi tiết, nhưng hệ
điều hành thường không truyền hết thông tin này cho ứng dụng.
Ví dụ thiết bị SCSI báo lỗi với 3 mức:
1. Sense key – loại lỗi chung (như lỗi phần cứng, yêu cầu không hợp lệ).
2. Additional sense code – loại lỗi cụ thể hơn (tham số sai, tự kiểm lỗi).
3. Qualifier – mô tả chi tiết hơn nữa (tham số nào sai, bộ phận nào hỏng).
Ngoài ra, thiết bị SCSI còn có nhật ký lỗi bên trong, nhưng hiếm khi được hệ thống truy
vấn đến.
13.4.6 I/O Protection
1. Lỗi và bảo vệ hệ thống
Lỗi trong hệ thống I/O có thể xảy ra do vô tình hoặc cố ý từ phía người dùng, ví dụ:
o Cố gắng gửi lệnh I/O bất hợp pháp để phá vỡ hoạt động bình thường của hệ
thống.
2. Cơ chế bảo vệ
Lệnh I/O là lệnh đặc quyền (privileged instructions):
Người dùng không được phép thực hiện lệnh I/O trực tiếp.
lOMoARcPSD| 58833082
Thay vào đó, chương trình người dùng phải gọi system call để yêu cầu hệ điều hành thực
hiện I/O thay mặt họ.
Thực hiện I/O qua hệ điều hành:
Hệ điều hành chạy ở chế độ giám sát (monitor mode) sẽ:
o Kiểm tra yêu cầu I/O có hợp lệ không. o Nếu hợp lệ → tiến hành I/O → sau đó
trả quyền điều khiển lại cho chương trình người dùng.
3. Bảo vệ bộ nhớ liên quan đến thiết bị
Vùng nhớ ánh xạ thiết bị (memory-mapped I/O) và cổng I/O cần được bảo vệ khỏi truy
cập trái phép từ người dùng.
Tuy nhiên, không thể cấm hoàn toàn người dùng truy cập, vì:
o Một số ứng dụng đồ họa, game, chỉnh sửa video… cần truy cập trực tiếp bộ nhớ
đồ họa để đạt hiệu năng cao.
Trong các trường hợp đó, kernel có thể cung cấp cơ chế khóa (locking) để:
Cấp quyền kiểm soát vùng bộ nhớ đồ họa cho một tiến trình tại một thời điểm.
13.4.7 Kernel Data Structures
1. Kernel theo dõi hoạt động I/O thông qua các cấu trúc dữ liệu nội bộ:
Ví dụ: bảng tệp mở (open-file table) để theo dõi file đang được truy cập.
Ngoài ra còn có cấu trúc để quản lý: o Kết nối mạng
o Giao tiếp thiết bị kiểu ký tự o Các hoạt động I/O khác
2. UNIX xử lý I/O qua một cấu trúc thống nhất (object-oriented style):
UNIX hỗ trợ nhiều loại thực thể như: o Tệp người dùng o Thiết bị thô (raw devices) o
Không gian địa chỉ của tiến trình
Dù tất cả hỗ trợ lệnh read(), nhưng ngữ nghĩa hoạt động sẽ khác nhau:
o Với tệp người dùng → kiểm tra bộ đệm (buffer cache) trước khi
truy cập đĩa. o Với đĩa thô → kiểm tra kích thước & căn chỉnh dữ
liệu theo sector. o Với tiến trình → chỉ cần sao chép dữ liệu từ bộ
nhớ.
UNIX xử lý sự khác biệt này bằng cách dùng bảng phân phối hàm (dispatch table) bên trong
cấu trúc tệp mở – chứa các con trỏ hàm phù hợp cho từng loại đối tượng.
3. Windows sử dụng hình hướng đối tượng mạnh hơn:
I/O được xử lý như thông điệp (message):
lOMoARcPSD| 58833082
o Yêu cầu I/O được chuyển thành thông điệp gửi qua kernel → I/O
manager → device driver.
o Với ghi dữ liệu: thông điệp chứa dữ liệu để ghi. o Với đọc dữ liệu:
thông điệp chứa bộ đệm để nhận dữ liệu.
Ưu điểm:
Tăng tính linh hoạt, dễ mở rộng hệ thống.
Nhược điểm:
Có thể tăng chi phí xử lý do có thêm overhead so với cách tiếp cận chia sẻ bộ nhớ. 13.4.8
Kernel I/O Subsystem Summary
Chức năng của hệ thống con I/O:
Quản lý không gian tên (namespace) của tệp và thiết bị
Kiểm soát quyền truy cập vào tệp và thiết bị
Kiểm soát thao tác phù hợp với từng loại thiết bị o (Ví dụ: modem không thể thực hiện
thao tác "seek")
Quản lý phân bổ không gian trong hệ thống tệp (file-system space)
Phân bổ thiết bị (device allocation)
Thực hiện đệm (buffering), bộ đệm trung gian (caching), và xếp hàng in (spooling)
Lập lịch I/O (I/O scheduling) để tối ưu hiệu suất
Theo dõi trạng thái thiết bị, xử lý lỗi, khôi phục khi xảy ra sự cố
Cấu hình và khởi tạo các trình điều khiển thiết bị (device drivers)

Preview text:

lOMoAR cPSD| 58833082 13.1 Overview
- Trình điều khuyển (device drivers) cung cấp một giao diện truy cập thiết bị thống nhất cho hệ
thống con I/O, giống như cách các lệnh gọi hệ thống (system calls) cung cấp một giao diện tiêu
chuẩn giữa ứng dụng và hệ điều hành. 13.2 I/O Hardware
- Máy tính sử dụng nhiều loại thiết bị I/O khác nhau, bao gồm thiết bị lưu trữ (đĩa, băng từ),
thiếtbị truyền dữ liệu (mạng, Bluetooth), và thiết bị giao tiếp với con người (màn hình, bàn phím, chuột, âm thanh)
- Các thiết bị này kết nối với máy tính qua cổng (port) hoặc bus, trong đó bus là tập hợp các dây
dẫn và giao thức truyền dữ liệu. Một số thiết bị được kết nối theo chuỗi daisy chain, hoạt động như một bus.
- Bộ điều khiển (controller) là mạch điện tử dùng để vận hành cổng, bus hoặc thiết bị.
- Bộ xử lý giao tiếp với bộ điều khiển thông qua thanh ghi (register) chứa dữ liệu và tín hiệu
điềukhiển. Có hai phương pháp chính:
- Lệnh I/O đặc biệt: Bộ xử lý sử dụng các lệnh đặc biệt để gửi dữ liệu qua địa chỉ cổng I/O.
- I/O ánh xạ bộ nhớ (Memory-mapped I/O): Thanh ghi điều khiển được ánh xạ vào không gianbộ
nhớ, cho phép CPU đọc/ghi dữ liệu như với bộ nhớ thông thường. Phương pháp này nhanh hơn
nhưng có rủi ro do lỗi ghi sai địa chỉ.
- Mỗi cổng I/O thường có bốn thanh ghi chính:
- Data-in register: Nhận dữ liệu đầu vào.
- Data-out register: Gửi dữ liệu đầu ra.
- Status register: Báo trạng thái thiết bị (hoàn thành lệnh, lỗi, v.v.).
- Control register: Thiết lập chế độ hoạt động của thiết bị. 13.2.1 Polling
- Giao thức tương tác giữa bộ điều khiển và máy chủ có thể phức tạp, nhưng nguyên tắc cơ bản
của handshaking rất đơn giản. Bộ điều khiển sử dụng busy bit trong thanh ghi trạng thái để báo
hiệu trạng thái của nó (1 là bận, 0 là sẵn sàng), trong khi máy chủ sử dụng command-ready bit
trong thanh ghi lệnh để gửi yêu cầu.
- Quá trình truyền dữ liệu diễn ra như sau:
- Máy chủ kiểm tra busy bit cho đến khi nó bằng 0 (sẵn sàng).
- Máy chủ đặt write bit và ghi dữ liệu vào thanh ghi data-out. lOMoAR cPSD| 58833082
- Máy chủ đặt command-ready bit để báo lệnh sẵn sàng.
- Bộ điều khiển phát hiện command-ready bit, sau đó đặt busy bit.
- Bộ điều khiển đọc lệnh, lấy dữ liệu từ data-out và thực hiện I/O.
- Bộ điều khiển xóa command-ready bit, xóa lỗi (nếu có), và xóa busy bit.
- Chu trình này lặp lại với mỗi byte dữ liệu.
- Ban đầu, máy chủ sử dụng polling (bận chờ) bằng cách kiểm tra liên tục busy bit.
- Nếu bộ điều khiển nhanh, phương pháp này hợp lý. Tuy nhiên, nếu thời gian chờ lâu, polling
gây lãng phí tài nguyên CPU. Đặc biệt, với thiết bị như bàn phím hoặc cổng nối tiếp, dữ liệu có
thể bị mất nếu không được xử lý kịp thời.
- Thay vì polling, hệ thống có thể sử dụng interrupt (ngắt). Khi thiết bị sẵn sàng, bộ điều khiển
sẽgửi tín hiệu ngắt đến CPU, giúp giảm lãng phí tài nguyên và cải thiện hiệu suất hệ thống. 13.2.2 Interupt
- Cơ chế ngắt giúp CPU phản ứng với các sự kiện bất đồng bộ, chẳng hạn khi một bộ điều khiển
thiết bị sẵn sàng phục vụ. Ngắt hoạt động như sau:
- Phát hiện ngắt: CPU kiểm tra interrupt-request line sau mỗi lệnh thực thi. Khi có tín hiệu, CPU
lưu trạng thái và nhảy đến trình xử lý ngắt (interrupt handler).
- Xử lý ngắt: Trình xử lý xác định nguyên nhân ngắt, thực hiện xử lý cần thiết, khôi phục
trạngthái CPU và tiếp tục chương trình trước đó.
- Các hệ thống hiện đại cần những tính năng xử lý ngắt nâng cao:
- Hoãn xử lý ngắt khi CPU đang thực thi các tác vụ quan trọng.
- Xác định nhanh nguồn ngắt mà không cần kiểm tra tuần tự tất cả thiết bị.
- Phân cấp độ ưu tiên ngắt để xử lý các ngắt quan trọng trước.
1. Phần cứng hỗ trợ ngắt CPU có hai loại ngắt: -
Ngắt không thể che (Non-maskable interrupt - NMI): Dành cho lỗi nghiêm trọng như lỗi
bộ nhớ không thể khôi phục. -
Ngắt có thể che (Maskable interrupt): Được sử dụng bởi các bộ điều khiển thiết bị và có
thể bị vô hiệu hóa tạm thời.
Cơ chế vectored interrupt giúp CPU nhanh chóng tìm đúng trình xử lý bằng bảng vector ngắt,
thay vì kiểm tra tuần tự tất cả các thiết bị. Nếu số lượng thiết bị vượt quá số phần tử trong bảng
vector, hệ thống sử dụng interrupt chaining để xử lý. lOMoAR cPSD| 58833082
Hệ thống cũng hỗ trợ mức ưu tiên ngắt, cho phép CPU trì hoãn ngắt mức thấp và ưu tiên xử lý
các ngắt quan trọng hơn.
2. Ngắt trong hệ điều hành
- Khởi động (Booting): Hệ điều hành dò tìm phần cứng và thiết lập trình xử lý ngắt trong bảng vector.
- Xử lý I/O: Các thiết bị kích hoạt ngắt khi hoàn tất nhập/xuất hoặc phát hiện lỗi.
- Quản lý ngoại lệ: Ngắt được sử dụng để xử lý lỗi như chia cho 0 hoặc truy cập bộ nhớ không hợp lệ.
- Hỗ trợ bộ nhớ ảo: Ngắt trang (page fault) giúp hệ điều hành tải trang bộ nhớ vào RAM khi cần.
- Lời gọi hệ thống (System calls): Một chương trình thực hiện trap (ngắt phần mềm) để yêu cầu
dịch vụ từ hệ điều hành.
3. Quản lý ngắt trong hệ điều hành hiện đại -
Tối ưu hóa hiệu suất: Hệ điều hành ưu tiên xử lý các ngắt quan trọng trước, chẳng hạn ưu
tiên khởi động một yêu cầu I/O mới hơn là sao chép dữ liệu vào bộ nhớ ứng dụng. -
Kiến trúc nhân đa luồng: Trong Solaris, các trình xử lý ngắt chạy như luồng nhân (kernel
threads), cho phép xử lý nhiều ngắt đồng thời trên hệ thống đa bộ xử lý.
13.2.3 Direct Memory Access
1. Bộ điều khiển DMA và cơ chế truyền dữ liệu
- Trong các thiết bị thực hiện truyền dữ liệu lớn như ổ đĩa, việc sử dụng CPU để giám sát trạng
thái và truyền từng byte qua bộ điều khiển thiết bị (Programmed I/O - PIO) là không hiệu quả.
Thay vào đó, hầu hết máy tính hiện đại sử dụng bộ điều khiển truy cập trực tiếp vào bộ nhớ
(Direct Memory Access – DMA) để giảm tải cho CPU.
2. Cách hoạt động của DMA
- CPU tạo một khối lệnh DMA trong bộ nhớ, chứa:
- Địa chỉ nguồn dữ liệu cần truyền.
- Địa chỉ đích để lưu dữ liệu. -Số byte cần truyền.
- CPU gửi địa chỉ của khối lệnh này đến bộ điều khiển DMA, sau đó tiếp tục thực hiện các tác vụkhác.
- Bộ điều khiển DMA trực tiếp thao tác trên bus bộ nhớ để thực hiện truyền dữ liệu mà không
cần sự can thiệp của CPU.
- Sau khi truyền xong, DMA gửi tín hiệu ngắt để báo CPU biết quá trình hoàn tất. lOMoAR cPSD| 58833082
- DMA sử dụng hai tín hiệu để giao tiếp với bộ điều khiển thiết bị:
-DMA-request: Bộ điều khiển thiết bị gửi tín hiệu này khi dữ liệu sẵn sàng.
- DMA-acknowledge: Bộ điều khiển DMA phản hồi, bắt đầu truyền dữ liệu vào bộ nhớ. 3. Ưu điểm DMA
- Tăng hiệu suất hệ thống: CPU không cần tham gia trực tiếp vào quá trình truyền dữ liệu, giảm
tải cho bộ xử lý chính.
- Giảm độ trễ I/O: DMA giúp truyền dữ liệu nhanh hơn PIO, đặc biệt với khối lượng dữ liệu lớn. 4. Nhược điểm DMA
- Chu kỳ đánh cắp (Cycle Stealing): Khi DMA chiếm quyền điều khiển bộ nhớ, CPU bị chặn tạm
thời, gây giảm hiệu suất xử lý của CPU.
5. DMA và bảo mật hệ thống -
Trong các hệ điều hành bảo vệ bộ nhớ, hệ điều hành kiểm soát quyền truy cập thiết bị để
ngăn chặn truy cập trái phép hoặc lỗi có thể gây sập hệ thống. -
Một số hệ điều hành không có bảo vệ bộ nhớ cho phép tiến trình truy cập trực tiếp thiết bị
để tăng hiệu suất nhưng tiềm ẩn rủi ro bảo mật và mất ổn định.
13.2.4 I/O Hardware Summary
Mặc dù phần cứng I/O có thể rất phức tạp ở mức thiết kế điện tử chi tiết, nhưng một số khái
niệm chính đủ để hiểu các tính năng I/O của hệ điều hành:
1. Bus: Hệ thống giao tiếp giữa CPU, bộ nhớ và thiết bị ngoại vi.
2. Bộ điều khiển (Controller): Bộ phận trung gian giữa thiết bị và hệ thống máy tính, giúp quản
lý quá trình truyền dữ liệu.
3. Cổng I/O và các thanh ghi (I/O Port & Registers): Dùng để lưu trữ dữ liệu và trạng thái thiết bị.
4. Cơ chế bắt tay (Handshaking) giữa máy chủ và bộ điều khiển thiết bị: Quá trình trao đổi tín
hiệu để đồng bộ dữ liệu.
5.Cách thực hiện bắt tay:
- Polling: CPU liên tục kiểm tra trạng thái thiết bị.
- Interrupts: Thiết bị gửi tín hiệu ngắt khi sẵn sàng, giúp CPU tiết kiệm tài nguyên.
6. Bộ điều khiển DMA: Giảm tải công việc truyền dữ liệu lớn cho CPU. lOMoAR cPSD| 58833082
Thách thức trong thiết kế hệ điều hành -
Mỗi loại thiết bị có đặc điểm và giao thức khác nhau → Không thể viết mã riêng cho từng thiết bị. -
Cần một giao diện I/O thống nhất cho ứng dụng → Hệ điều hành phải cung cấp cơ chế
trừu tượng hóa để các ứng dụng có thể sử dụng I/O mà không quan tâm đến chi tiết phần cứng.
-> Giải pháp: Hệ điều hành sử dụng các lớp trừu tượng và giao diện thống nhất để hỗ trợ nhiều
thiết bị khác nhau mà không cần chỉnh sửa hệ thống.
13.3 Application I/O Interface
• Mục tiêu: Chuẩn hóa cách hệ điều hành làm việc với thiết bị I/O, để ứng dụng không cần
biếtchi tiết phần cứng. • Cách tiếp cận:
• Trừu tượng hóa (Abstraction)
• Đóng gói (Encapsulation)
• Phân tầng phần mềm (Software layering)
• Trình điều khiển thiết bị (Device Driver):
• Ẩn sự khác biệt giữa các thiết bị.
• Giao tiếp với hệ điều hành thông qua giao diện chuẩn. • Lợi ích:
• Hệ điều hành dễ phát triển hơn.
• Thiết bị mới dễ tích hợp hơn nếu hỗ trợ giao diện phổ biến hoặc có driver phù hợp. • Khó khăn:
• Mỗi hệ điều hành có tiêu chuẩn driver khác nhau → thiết bị cần nhiều driver cho từng hệ điều hành.
• Đặc điểm thiết bị I/O:
• Luồng ký tự (character) vs Thiết bị khối (block)
• Truy cập tuần tự vs Ngẫu nhiên
• Đồng bộ vs Bất đồng bộ
• Dùng riêng vs Dùng chung
• Tốc độ: Từ chậm (bàn phím) đến rất nhanh (ổ SSD)
• Hướng dữ liệu: Chỉ đọc, chỉ ghi hoặc cả hai lOMoAR cPSD| 58833082
• Các kiểu truy cập I/O phổ biến: • Block I/O • Character-stream I/O • Memory-mapped files • Network sockets • Lệnh đặc biệt:
• ioctl() trong UNIX: Cho phép ứng dụng gửi lệnh tùy chỉnh đến driver.
13.1.1 Block and Character Devices
1. Giao diện thiết bị khối (Block-device interface) •
Dành cho các thiết bị lưu trữ như ổ đĩa, hoạt động theo từng khối dữ liệu. •
Các lệnh cơ bản gồm: o read() – đọc dữ liệu o write() – ghi dữ liệu
o seek() – di chuyển đến khối cụ thể (với thiết bị truy cập ngẫu nhiên) •
Ứng dụng thường truy cập thiết bị khối thông qua hệ thống tập tin, giúp ẩn đi sự khác biệt phần cứng. 2. Raw I/O (Truy cập thô) •
Dành cho hệ điều hành hoặc ứng dụng đặc biệt như hệ quản trị cơ sở dữ liệu. •
Truy cập trực tiếp thiết bị như một mảng tuyến tính các khối, bỏ qua hệ thống tập tin. •
Giúp tránh trùng lặp hoặc xung đột về bộ đệm (buffering) và khóa (locking).  Tuy
nhiên, hệ điều hành không cung cấp dịch vụ gì khi dùng chế độ này.
3. Direct I/O (I/O trực tiếp) •
Là sự thỏa hiệp: hệ điều hành cho phép vô hiệu hóa bộ đệm và khóa khi truy cập tập tin. •
Giúp ứng dụng kiểm soát thiết bị tốt hơn mà vẫn giữ được một số chức năng hệ điều hành.
4. Memory-mapped file access (Truy cập tập tin ánh xạ bộ nhớ) •
Dữ liệu trên đĩa được ánh xạ vào không gian bộ nhớ ảo của tiến trình. •
Truy cập dữ liệu như đọc/ghi bộ nhớ, thay vì dùng read() hay write(). •
Hiệu quả vì dùng cơ chế như nhu cầu phân trang (demand paging). •
Dễ dùng cho lập trình viên và thường được hệ điều hành sử dụng nội bộ, ví dụ:
o Thực thi chương trình: ánh xạ file thực thi vào bộ nhớ. o Truy
cập vùng swap trong kernel.
5. Giao diện luồng ký tự (Character-stream interface) lOMoAR cPSD| 58833082 •
Ví dụ thiết bị: bàn phím, chuột, modem, máy in, card âm thanh. •
Truy cập dữ liệu theo từng ký tự một, với lệnh như get() và put(). •
Phù hợp cho thiết bị nhập dữ liệu không định kỳ, không thể đoán trước. •
Có thể xây dựng thư viện bên trên hỗ trợ nhập theo dòng, có bộ đệm và xử lý phím xoá, v.v. 13.3.2 Network Devices
I/O mạng có đặc điểm rất khác so với I/O đĩa, nên hệ điều hành thường cung cấp một
giao diện riêng thay vì dùng chung read()–write()–seek() như với thiết bị lưu trữ.
1. Giao diện socket (socket interface) •
Phổ biến trên UNIX, Windows. •
Tương tự ổ cắm điện: bất kỳ ứng dụng nào cũng có thể "cắm vào".  Cho phép ứng dụng: o Tạo socket
o Kết nối socket địa phương với socket từ xa
o Lắng nghe kết nối đến o Gửi và nhận dữ liệu (packet) 2. Hàm select() •
Quản lý nhiều socket cùng lúc. •
Giúp kiểm tra socket nào sẵn sàng nhận/gửi dữ liệu. •
Tránh được việc polling (thăm dò liên tục) hoặc busy waiting (vòng lặp chờ tốn tài nguyên). 3. Lợi ích •
Trừu tượng hóa hành vi mạng. •
Cho phép ứng dụng phân tán hoạt động hiệu quả trên bất kỳ phần cứng mạng hoặc giao thức nào. 4. Giao diện khác •
Windows: Có giao diện riêng cho card mạng và giao thức mạng. •
UNIX: Hỗ trợ nhiều mô hình giao tiếp:
o Ống nửa song công (pipes) o FIFO song công o STREAMS
o Hàng đợi thông điệp (message queues) o Socket lOMoAR cPSD| 58833082
13.3.3 Clocks and Timers
1. Chức năng cơ bản của đồng hồ và bộ định thời phần cứng: •
Cung cấp thời gian hiện tại •
Đo thời gian đã trôi qua •
Cài đặt hẹn giờ để thực hiện một tác vụ tại thời điểm cụ thể (T)
Các chức năng này rất quan trọng với hệ điều hành và ứng dụng cần xử lý theo thời gian.
2. Bộ định thời có thể lập trình được (programmable interval timer): •
Cài đặt để tạo ngắt (interrupt) sau một khoảng thời gian. •
Có thể cài đặt để chạy một lần hoặc lặp lại định kỳ. •
Ứng dụng: o Bộ lập lịch (scheduler) dùng để ngắt tiến trình khi hết thời gian CPU (time
slice). o Hệ thống I/O dùng để ghi bộ đệm (cache) ra đĩa định kỳ.
o Mạng dùng để hủy tác vụ chậm (do tắc nghẽn mạng...).
3. Hỗ trợ từ hệ điều hành: •
Cho phép tiến trình người dùng sử dụng hẹn giờ. •
Giả lập đồng hồ ảo (virtual clocks) để phục vụ nhiều yêu cầu hẹn giờ hơn số kênh phần cứng.
o Kernel duy trì danh sách các sự kiện cần ngắt, sắp xếp theo thời gian gần nhất.
o Mỗi khi ngắt xảy ra, kernel xử lý yêu cầu và nạp lại thời gian hẹn tiếp theo.
4. Độ phân giải và độ chính xác: •
Tốc độ ngắt đồng hồ thường từ 18–60 lần/giây → khá thô, không phù hợp với hệ thống xử lý nhanh hiện nay. •
Độ chính xác bị giới hạn bởi độ phân giải thấp và chi phí mô phỏng đồng hồ ảo. •
Clock drift (trôi thời gian) có thể xảy ra nếu dùng ngắt định kỳ để duy trì đồng hồ hệ thống.
5. Đồng hồ tần số cao (high-frequency counter): •
Có trong nhiều máy tính hiện đại. •
Có thể đọc trực tiếp từ thanh ghi phần cứng → đo thời gian chính xác cao, dù không tạo ra ngắt.
13.3.4 Nonblocking and Asynchronous I/O
1. Blocking I/O (Gọi hệ thống đồng bộ – chặn): •
Khi ứng dụng gọi hàm I/O blocking, chương trình tạm dừng thực thi và chuyển sang hàng đợi chờ (wait queue). lOMoAR cPSD| 58833082 •
Sau khi I/O hoàn tất, tiến trình được đưa lại vào hàng đợi thực thi (run queue). •
Dễ lập trình, vì xử lý tuyến tính và rõ ràng.  Phù hợp với phần lớn ứng dụng đơn giản.
2. Nonblocking I/O (Gọi không chặn): •
Lệnh gọi trả về ngay lập tức, không chờ I/O hoàn tất. •
Trả về số byte đã chuyển (có thể là đầy đủ, một phần, hoặc 0). •
Phù hợp với ứng dụng cần xử lý song song I/O và tính toán, ví dụ: giao diện người dùng, phát video. •
Có thể được sử dụng cùng với đa luồng (multithreading) để luồng này đợi I/O, luồng khác tiếp tục xử lý.
3. Asynchronous I/O (Gọi bất đồng bộ): •
Lệnh gọi I/O trả về ngay, và việc truyền dữ liệu diễn ra ngầm, hoàn tất vào thời điểm trong tương lai. •
Kết quả được thông báo qua:
o Biến được gán trong vùng nhớ ứng dụng, o Tín hiệu (signal), o Ngắt phần mềm
(software interrupt), o Callback function. •
Khác với nonblocking ở chỗ: asynchronous luôn thực hiện toàn bộ yêu cầu, còn
nonblocking có thể thực hiện một phần hoặc không có gì.
4. Hệ điều hành và I/O bất đồng bộ: •
Nhiều hoạt động I/O bất đồng bộ được ẩn bên trong hệ điều hành:
o Ghi đĩa, gửi mạng có thể được ghi bộ đệm và xử lý sau.
o Dữ liệu chưa ghi có thể bị mất nếu máy tắt đột ngột. •
UNIX có thể flush dữ liệu mỗi 30 giây để giảm rủi ro mất dữ liệu. •
Dữ liệu đọc từ bộ đệm có thể không nhất quán nếu nhiều luồng truy cập cùng file → cần
có cơ chế khóa (locking).
5. Ví dụ điển hình – select() và biến thể:  select() dùng để kiểm tra socket có sẵn để đọc/ghi hay không. •
Nếu thời gian chờ đặt bằng 0, ứng dụng sẽ poll thiết bị (kiểm tra liên tục mà không chặn). •
Dùng select() cần gọi thêm read() hoặc write() → tốn thêm chi phí xử lý. lOMoAR cPSD| 58833082 
Mach OS có biến thể là gọi đọc nhiều thiết bị, chặn cho đến khi một trong các yêu cầu hoàn tất. 13.3.5 Vectored I/O
Vectored I/O là một kiểu gọi hệ thống I/O đặc biệt, cho phép một lệnh hệ thống duy nhất
thực hiện nhiều thao tác I/O liên quan đến nhiều vùng bộ nhớ khác nhau. •
Ví dụ: Hàm readv trong UNIX có thể đọc dữ liệu từ nguồn vào một tập hợp các bộ đệm
(vector), hoặc ghi dữ liệu từ các bộ đệm này ra thiết bị đích.
Lợi ích của vectored I/O:
1. Giảm chi phí hệ thống:
o Thay vì nhiều lần gọi hệ thống (system calls), chỉ cần một lần gọi duy nhất →
giảm thời gian chuyển ngữ cảnh (context switching) và overhead hệ thống.
2. Tăng hiệu suất (throughput):
o Không cần phải gộp dữ liệu lại thành một bộ đệm lớn trước khi truyền.
o Truyền dữ liệu từ nhiều vùng nhớ riêng biệt một cách trực tiếp và hiệu quả hơn.
3. Hỗ trợ tính nguyên tử (atomicity):
o Một số hệ điều hành hỗ trợ scatter–gather I/O với tính nguyên tử, đảm bảo toàn
bộ thao tác I/O được thực hiện liền mạch, không bị gián đoạn → tránh lỗi dữ liệu
khi nhiều luồng cùng thao tác I/O. Kết luận: 
Vectored I/O là kỹ thuật mạnh mẽ, giúp tối ưu hiệu năng hệ thống I/O, được sử dụng phổ
biến trong các hệ điều hành hiện đại khi làm việc với nhiều vùng nhớ phân tán.
13.4 Kernel I/O Subsystem 13.4.1 I/O Scheduling
Lập lịch I/O là quá trình sắp xếp thứ tự thực hiện các yêu cầu I/O sao cho hiệu quả, giảm
thời gian chờ trung bình, và chia sẻ tài nguyên công bằng giữa các tiến trình. Ví dụ minh họa: •
Nếu đầu đọc của đĩa đang ở đầu đĩa, ba tiến trình yêu cầu đọc:
o Tiến trình 1: đọc ở cuối đĩa. o Tiến trình 2: đọc ở đầu đĩa.
o Tiến trình 3: đọc ở giữa. •
Lập lịch tối ưu là xử lý theo thứ tự: 2 → 3 → 1, để giảm tối đa khoảng di chuyển của đầu đọc. lOMoAR cPSD| 58833082  Cơ chế hoạt động:
Mỗi thiết bị có một hàng đợi chờ (wait queue) để lưu các yêu cầu I/O. •
Bộ lập lịch I/O của hệ điều hành sẽ tái sắp xếp hàng đợi để tối ưu hiệu suất hoặc đảm bảo
công bằng (ví dụ ưu tiên truy xuất từ bộ nhớ ảo hơn là từ ứng dụng).
Bảng trạng thái thiết bị (Device-Status Table)
Kernel quản lý một bảng trạng thái cho các thiết bị đang được sử dụng (xem hình 13.9). •
Mỗi mục trong bảng ghi: o Loại thiết bị (ví dụ: chuột, bàn phím, ổ đĩa...). o Trạng thái:
nhàn rỗi, bận, hoặc không hoạt động. o Thông tin yêu cầu I/O hiện tại (loại thao tác, địa chỉ, kích thước...). Khi nào cần bảng này: •
Với I/O bất đồng bộ (asynchronous I/O), hệ điều hành cần theo dõi nhiều yêu cầu cùng
lúc → phải có cách lưu trạng thái từng thiết bị và yêu cầu liên quan. Ngoài ra: •
I/O subsystem cũng nâng cao hiệu suất bằng các kỹ thuật như:
o Buffering (bộ đệm), o Caching (bộ nhớ
đệm), o Spooling (xếp hàng đệm, ví dụ in tài liệu). 13.4.2 Buffering
1. Giải quyết sự chênh lệch tốc độ giữa nguồn phát và nguồn nhận •
Ví dụ: Khi tải file từ modem (rất chậm) và lưu vào đĩa cứng (rất nhanh). •
Giải pháp: Dùng hai bộ đệm (double buffering):
o Modem ghi dữ liệu vào bộ đệm 1.
o Sau khi bộ đệm 1 đầy, hệ thống ghi nó ra đĩa, trong khi modem tiếp tục ghi vào bộ đệm 2.
o Quá trình này lặp lại, giúp tách biệt tốc độ giữa modem và ổ đĩa.  Giúp giảm
yêu cầu về đồng bộ thời gian giữa thiết bị nhanh và chậm.
2. Thích nghi với sự khác biệt về kích thước dữ liệu giữa các thiết bị •
Ví dụ: Trong mạng máy tính:
o Tin nhắn lớn từ ứng dụng được chia nhỏ (fragmentation) thành các gói tin.
o Các gói tin được lưu vào bộ đệm để tái hợp (reassembly buffer) tại phía nhận để
tái tạo lại dữ liệu ban đầu. lOMoAR cPSD| 58833082 
3. Hỗ trợ cơ chế "copy semantics" trong I/O của ứng dụng
Copy semantics đảm bảo rằng dữ liệu được ghi ra thiết bị là đúng tại thời điểm gọi
system call, ngay cả khi sau đó ứng dụng thay đổi nội dung bộ đệm của mình. • Thực hiện bằng cách:
o Hệ điều hành sao chép dữ liệu từ bộ đệm của ứng dụng sang bộ đệm của kernel,
sau đó mới ghi ra thiết bị.
o Điều này tránh bị ảnh hưởng bởi các thay đổi sau đó của ứng dụng. •
Tuy việc sao chép có thể gây tốn tài nguyên, nhưng nó mang lại tính nhất quán và an toàn dữ liệu. •
Có thể tối ưu hơn bằng cách sử dụng kỹ thuật ánh xạ bộ nhớ ảo (virtual memory mapping) và copy-on-write. 13.4.3 Caching
Cache là một vùng bộ nhớ nhanh dùng để lưu bản sao của dữ liệu từ nơi lưu trữ chậm
hơn, giúp truy cập dữ liệu hiệu quả hơn. o Ví dụ: Lệnh của tiến trình đang chạy được lưu
trên đĩa, sau đó được cache vào bộ nhớ chính (RAM), rồi lại được cache thêm trong bộ
nhớ đệm của CPU (L1, L2). •
Buffer là nơi tạm lưu dữ liệu gốc khi chuyển giữa các thiết bị hoặc giữa thiết bị và ứng dụng. Sự khác biệt chính: •
Buffer có thể chứa bản gốc duy nhất của dữ liệu. •
Cache luôn chứa bản sao của dữ liệu từ nơi khác. Sử dụng kết hợp: •
Trong nhiều trường hợp, một vùng nhớ có thể vừa làm buffer vừa làm cache.
o Ví dụ: Hệ điều hành dùng buffer trong RAM để lưu dữ liệu đĩa tạm thời nhằm
đảm bảo tính toàn vẹn dữ liệu (copy semantics) và lập lịch ghi đĩa hiệu quả.
o Những vùng nhớ này cũng hoạt động như cache, giúp các ứng dụng chia sẻ tệp
hoặc đọc/ghi tệp nhanh chóng hơn nếu dữ liệu đã được lưu sẵn trong bộ đệm. Lợi ích: •
Nếu dữ liệu đã có trong buffer cache, hệ điều hành có thể tránh hoặc trì hoãn việc truy
xuất đĩa, từ đó nâng cao hiệu năng I/O. •
Các ghi đĩa được tập hợp lại trong buffer cache trong vài giây để tối ưu hóa hiệu quả ghi và giảm số lần ghi. lOMoAR cPSD| 58833082 
13.4.4 Spooling and device reservation
Spooling – Bộ đệm hàng đợi thiết bị I/O •
Spool là một bộ đệm (buffer) dùng để giữ dữ liệu đầu ra cho các thiết bị không thể xử lý
song song nhiều luồng dữ liệu, như máy in.
Ví dụ: Nhiều ứng dụng cùng lúc muốn in, nhưng máy in chỉ phục vụ một tác vụ tại một thời điểm. Cách hoạt động: •
Hệ điều hành chặn dữ liệu in từ các ứng dụng và ghi chúng vào các file tạm trên đĩa (spool files). •
Sau khi một ứng dụng hoàn tất việc in, hệ thống spooling sẽ đưa file tương ứng vào hàng
đợi và lần lượt in từng file. •
Hệ thống spooling có thể được quản lý bởi:
o Một tiến trình daemon (chạy nền), hoặc o
Một luồng (thread) trong nhân hệ điều hành.
Chức năng quản lý spool: • Hiển thị hàng đợi in. • Hủy lệnh in chưa in. •
Tạm dừng in để bảo trì thiết bị, v.v.
Xử lý truy cập thiết bị độc quyền (Exclusive Device Access) •
Một số thiết bị như máy in, ổ băng (tape drives) không thể dùng chung cho nhiều ứng dụng cùng lúc. •
Hệ điều hành cung cấp các cách để điều phối truy cập độc quyền: Các phương pháp:
1. Spooling (như đã nói ở trên).
2. Cấp phát và thu hồi thiết bị:
o Ví dụ: Hệ điều hành VMS cho phép tiến trình yêu cầu quyền sở hữu thiết bị rảnh
và trả lại thiết bị sau khi dùng xong.
3. Giới hạn số lượng tay cầm (file handle): o Chỉ cho phép một ứng dụng mở thiết bị tại một thời điểm.
4. Hỗ trợ đồng bộ hóa giữa các tiến trình:
o Ví dụ: Windows cung cấp lệnh đợi thiết bị sẵn sàng, và tham số trong OpenFile()
để xác định quyền truy cập được chia sẻ hay không. lOMoAR cPSD| 58833082 
Trong các hệ điều hành này, ứng dụng cần tự tránh deadlock khi chia sẻ thiết bị. 13.4.5 Error Handling
Bảo vệ bộ nhớ và xử lý lỗi trong hệ điều hành •
Hệ điều hành sử dụng bộ nhớ được bảo vệ (protected memory) để ngăn chặn lỗi phần
cứng hoặc lỗi ứng dụng gây ra sự cố toàn hệ thống. •
Các thiết bị và thao tác I/O có thể gặp lỗi do: lOMoAR cPSD| 58833082
o Lỗi tạm thời (transient): ví dụ mạng bị quá tải, mất kết nối tạm thời. o Lỗi vĩnh
viễn: ví dụ bộ điều khiển đĩa bị hỏng.
Cách hệ điều hành xử lý lỗi: •
Lỗi tạm thời thường có thể được xử lý tự động:
o Ví dụ: đọc đĩa lỗi → hệ điều hành thử đọc lại (retry).
o Gửi dữ liệu mạng thất bại → hệ thống gửi lại (resend) nếu giao thức hỗ trợ. •
Lỗi nghiêm trọng (vĩnh viễn) như thiết bị hỏng hóc phần cứng → hệ điều hành khó hoặc không thể khôi phục.
Cách báo lỗi trong hệ điều hành •
Gọi hệ thống I/O thường chỉ trả về 1 bit thông tin: thành công hay thất bại. •
Trong UNIX: o Biến errno được dùng để ghi mã lỗi (khoảng 100 mã lỗi phổ biến), như: 
Đối số không hợp lệ.  Con trỏ sai.  Tập tin chưa mở...
Thông tin lỗi phần cứng chi tiết (ví dụ: thiết bị SCSI) •
Một số phần cứng (như thiết bị SCSI) có thể cung cấp thông tin lỗi rất chi tiết, nhưng hệ
điều hành thường không truyền hết thông tin này cho ứng dụng.
Ví dụ thiết bị SCSI báo lỗi với 3 mức:
1. Sense key – loại lỗi chung (như lỗi phần cứng, yêu cầu không hợp lệ).
2. Additional sense code – loại lỗi cụ thể hơn (tham số sai, tự kiểm lỗi).
3. Qualifier – mô tả chi tiết hơn nữa (tham số nào sai, bộ phận nào hỏng).
 Ngoài ra, thiết bị SCSI còn có nhật ký lỗi bên trong, nhưng hiếm khi được hệ thống truy vấn đến. 13.4.6 I/O Protection
1. Lỗi và bảo vệ hệ thống •
Lỗi trong hệ thống I/O có thể xảy ra do vô tình hoặc cố ý từ phía người dùng, ví dụ:
o Cố gắng gửi lệnh I/O bất hợp pháp để phá vỡ hoạt động bình thường của hệ thống. 2. Cơ chế bảo vệ
Lệnh I/O là lệnh đặc quyền (privileged instructions): •
Người dùng không được phép thực hiện lệnh I/O trực tiếp. lOMoAR cPSD| 58833082 •
Thay vào đó, chương trình người dùng phải gọi system call để yêu cầu hệ điều hành thực hiện I/O thay mặt họ.
Thực hiện I/O qua hệ điều hành: •
Hệ điều hành chạy ở chế độ giám sát (monitor mode) sẽ:
o Kiểm tra yêu cầu I/O có hợp lệ không. o Nếu hợp lệ → tiến hành I/O → sau đó
trả quyền điều khiển lại cho chương trình người dùng.
3. Bảo vệ bộ nhớ liên quan đến thiết bị •
Vùng nhớ ánh xạ thiết bị (memory-mapped I/O) và cổng I/O cần được bảo vệ khỏi truy
cập trái phép từ người dùng. •
Tuy nhiên, không thể cấm hoàn toàn người dùng truy cập, vì:
o Một số ứng dụng đồ họa, game, chỉnh sửa video… cần truy cập trực tiếp bộ nhớ
đồ họa để đạt hiệu năng cao.
 Trong các trường hợp đó, kernel có thể cung cấp cơ chế khóa (locking) để: •
Cấp quyền kiểm soát vùng bộ nhớ đồ họa cho một tiến trình tại một thời điểm.
13.4.7 Kernel Data Structures
1. Kernel theo dõi hoạt động I/O thông qua các cấu trúc dữ liệu nội bộ: •
Ví dụ: bảng tệp mở (open-file table) để theo dõi file đang được truy cập. •
Ngoài ra còn có cấu trúc để quản lý: o Kết nối mạng
o Giao tiếp thiết bị kiểu ký tự o Các hoạt động I/O khác
2. UNIX xử lý I/O qua một cấu trúc thống nhất (object-oriented style): •
UNIX hỗ trợ nhiều loại thực thể như: o Tệp người dùng o Thiết bị thô (raw devices) o
Không gian địa chỉ của tiến trình •
Dù tất cả hỗ trợ lệnh read(), nhưng ngữ nghĩa hoạt động sẽ khác nhau:
o Với tệp người dùng → kiểm tra bộ đệm (buffer cache) trước khi
truy cập đĩa. o Với đĩa thô → kiểm tra kích thước & căn chỉnh dữ
liệu theo sector. o Với tiến trình → chỉ cần sao chép dữ liệu từ bộ nhớ.
UNIX xử lý sự khác biệt này bằng cách dùng bảng phân phối hàm (dispatch table) bên trong
cấu trúc tệp mở – chứa các con trỏ hàm phù hợp cho từng loại đối tượng.
3. Windows sử dụng mô hình hướng đối tượng mạnh hơn: •
I/O được xử lý như thông điệp (message): lOMoAR cPSD| 58833082
o Yêu cầu I/O được chuyển thành thông điệp gửi qua kernel → I/O manager → device driver.
o Với ghi dữ liệu: thông điệp chứa dữ liệu để ghi. o Với đọc dữ liệu:
thông điệp chứa bộ đệm để nhận dữ liệu. Ưu điểm: •
Tăng tính linh hoạt, dễ mở rộng hệ thống. Nhược điểm: •
Có thể tăng chi phí xử lý do có thêm overhead so với cách tiếp cận chia sẻ bộ nhớ. 13.4.8
Kernel I/O Subsystem Summary
Chức năng của hệ thống con I/O: •
Quản lý không gian tên (namespace) của tệp và thiết bị •
Kiểm soát quyền truy cập vào tệp và thiết bị •
Kiểm soát thao tác phù hợp với từng loại thiết bị o (Ví dụ: modem không thể thực hiện thao tác "seek") •
Quản lý phân bổ không gian trong hệ thống tệp (file-system space) •
Phân bổ thiết bị (device allocation) •
Thực hiện đệm (buffering), bộ đệm trung gian (caching), và xếp hàng in (spooling) •
Lập lịch I/O (I/O scheduling) để tối ưu hiệu suất •
Theo dõi trạng thái thiết bị, xử lý lỗi, khôi phục khi xảy ra sự cố •
Cấu hình và khởi tạo các trình điều khiển thiết bị (device drivers)