Tải bản đầy đủ (.pdf) (36 trang)

Abraham silberschatz operating system concepts (9th,2012 12) trang 611 646 (1)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.48 MB, 36 trang )

Machine Translated by Google

CHƯƠNG 13

Hệ thống vào/ra

Hai cơng việc chính của máy tính là I/O và xử lý. Trong nhiều trường hợp, cơng việc
chính là I/O và q trình xử lý chỉ là ngẫu nhiên. Chẳng hạn, khi chúng ta duyệt một
trang web hoặc chỉnh sửa một tệp, mối quan tâm ngay lập tức của chúng ta là đọc hoặc
nhập một số thơng tin, chứ khơng phải tính tốn câu trả lời.
Vai trò của hệ điều hành trong I/O máy tính là quản lý và kiểm sốt các hoạt động
I/O và thiết bị I/O . Mặc dù các chủ đề liên quan xuất hiện trong các chương khác, nhưng
ở đây chúng tôi tập hợp các phần lại với nhau để vẽ nên một bức tranh hoàn chỉnh về I/
O. Đầu tiên, chúng tôi mô tả những điều cơ bản về phần cứng I/O , bởi vì bản chất của
giao diện phần cứng đặt ra những hạn chế đối với các cơ sở bên trong của hệ điều hành.
Tiếp theo, chúng ta thảo luận về các dịch vụ I/O được cung cấp bởi hệ điều hành và hiện
thân của các dịch vụ này trong giao diện I/O của ứng dụng . Sau đó, chúng tơi giải
thích cách hệ điều hành thu hẹp khoảng cách giữa giao diện phần cứng và giao diện ứng
dụng. Chúng tôi cũng thảo luận về cơ chế UNIX System V STREAM , cho phép một ứng dụng
lắp ráp các đường dẫn mã trình điều khiển một cách linh hoạt. Cuối cùng, chúng ta thảo
luận về các khía cạnh hiệu suất của I/O và các nguyên tắc thiết kế hệ điều hành giúp
cải thiện hiệu suất I/O .

CHƯƠNG MỤC TIÊU

• Để khám phá cấu trúc của hệ thống con I/O của một hệ điều hành . •
Để thảo luận về các nguyên tắc và sự phức tạp của phần cứng I/O . •
Để giải thích các khía cạnh hiệu suất của phần cứng và phần mềm I/O .

13.1 Tổng quan


Việc kiểm soát các thiết bị kết nối với máy tính là mối quan tâm chính của các nhà
thiết kế hệ điều hành. Bởi vì các thiết bị I/O rất khác nhau về chức năng và tốc độ của
chúng (hãy xem xét chuột, đĩa cứng và rô-bốt băng), nên cần có nhiều phương pháp khác
nhau để điều khiển chúng. Các phương thức này tạo thành hệ thống con I/O của nhân, phân
tách phần còn lại của nhân khỏi sự phức tạp của việc quản lý các thiết bị I/O .

587


Machine Translated by Google
588

Chương 13 Hệ thống I/O
Công nghệ thiết bị I/O thể hiện hai xu hướng trái ngược nhau. Một mặt, chúng ta thấy
tiêu chuẩn hóa ngày càng tăng của giao diện phần mềm và phần cứng. Xu hướng này giúp
chúng tôi kết hợp các thế hệ thiết bị cải tiến vào các máy tính và hệ điều hành hiện có.
Mặt khác, chúng ta thấy ngày càng có nhiều loại thiết bị I/O . Một số thiết bị mới khơng
giống các thiết bị trước đây đến mức khó kết hợp chúng vào máy tính và hệ điều hành của
chúng ta. Thách thức này được giải quyết bằng sự kết hợp giữa kỹ thuật phần cứng và phần
mềm. Các phần tử phần cứng I/O cơ bản , chẳng hạn như cổng, bus và bộ điều khiển thiết
bị, phù hợp với nhiều loại thiết bị I/O . Để đóng gói các chi tiết và điểm kỳ lạ của các
thiết bị khác nhau, nhân của một hệ điều hành được cấu trúc để sử dụng các mơ-đun trình
điều khiển thiết bị. Trình điều khiển thiết bị trình bày một giao diện truy cập thiết bị
thống nhất cho hệ thống phụ I/O , giống như các lời gọi hệ thống 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 Phần cứng I/O
Máy tính vận hành rất nhiều loại thiết bị. Hầu hết phù hợp với các loại thiết bị lưu trữ
chung (đĩa, băng), thiết bị truyền dẫn (kết nối mạng, Bluetooth) và thiết bị giao diện
người dùng (màn hình, bàn phím, chuột, đầu vào và đầu ra âm thanh). Các thiết bị khác

chuyên dụng hơn, chẳng hạn như những thiết bị liên quan đến việc điều khiển máy bay phản
lực. Trong những chiếc máy bay này, con người đưa đầu vào cho máy tính bay thơng qua cần
điều khiển và bàn đạp chân, đồng thời máy tính gửi các lệnh đầu ra khiến động cơ di
chuyển bánh lái và cánh tà cũng như nạp nhiên liệu cho động cơ. Tuy nhiên , bất chấp sự
đa dạng đáng kinh ngạc của các thiết bị I/O , chúng ta chỉ cần một vài khái niệm để hiểu
cách các thiết bị được gắn vào và cách phần mềm có thể điều khiển phần cứng.

Một thiết bị giao tiếp với hệ thống máy tính bằng cách gửi tín hiệu qua cáp hoặc
thậm chí qua khơng khí. Thiết bị giao tiếp với máy thơng qua điểm kết nối hoặc cổng—ví
dụ: cổng nối tiếp. Nếu các thiết bị chia sẻ một bộ dây chung, kết nối được gọi là xe
buýt. Bus là một tập hợp các dây dẫn và một giao thức được xác định rõ ràng để chỉ định
một tập hợp các thông báo có thể được gửi trên các dây dẫn. Về mặt điện tử, các thông
điệp được truyền tải bằng các mẫu điện áp đặt vào dây dẫn với thời gian xác định. Khi
thiết bị A có cáp cắm vào thiết bị B và thiết bị B có cáp cắm vào thiết bị C và thiết bị
C cắm vào một cổng trên máy tính, sự sắp xếp này được gọi là chuỗi xích. Một chuỗi daisy
thường hoạt động như một chiếc xe buýt.
Bus được sử dụng rộng rãi trong kiến trúc máy tính và khác nhau về phương thức báo
hiệu, tốc độ, thông lượng và phương thức kết nối. Một cấu trúc bus PC điển hình xuất
hiện trong Hình 13.1. Trong hình, một bus PCI ( bus hệ thống PC phổ biến ) kết nối hệ
thống con bộ xử lý-bộ nhớ với các thiết bị nhanh và một bus mở rộng kết nối các thiết bị
tương đối chậm, chẳng hạn như bàn phím, cổng nối tiếp và cổng USB . Ở phần phía trên bên
phải của hình, bốn đĩa được kết nối với nhau trên một bus Giao diện Hệ thống Máy tính
Nhỏ (SCSI) được cắm vào bộ điều khiển SCSI . Các bus phổ biến khác được sử dụng để kết
nối các bộ phận chính của máy tính với nhau bao gồm PCI Express (PCIe), với thông lượng
lên tới 16 GB mỗi giây và HyperTransport, với thông lượng lên tới 25 GB mỗi giây.
Bộ điều khiển là một tập hợp các thiết bị điện tử có thể vận hành một cổng, một xe
buýt hoặc một thiết bị. Bộ điều khiển cổng nối tiếp là bộ điều khiển thiết bị đơn giản.
Đó là một con chip (hoặc một phần của con chip) trong máy tính điều khiển các tín hiệu trên



Machine Translated by Google
589

13.2 Phần cứng I/O

đĩa

đĩa
xe
buýt
SCSI

màn hình

đĩa

bộ vi xử lý

đĩa

bộ đệm
bộ điều
khiển đồ họa

cầu/bộ điều khiển
bộ nhớ

bộ điều khiển SCSI

kỉ niệm


xe buýt PCI

Bộ điều khiển đĩa IDE

đĩa

đĩa

đĩa

đĩa

giao diện bus
mở rộng

bàn phím

xe bt mở rộng

cổng song
song

cổng
nối tiếp

Hình 13.1 Một cấu trúc bus PC điển hình.

dây của một cổng nối tiếp. Ngược lại, bộ điều khiển bus SCSI không đơn giản. Do giao
thức SCSI phức tạp nên bộ điều khiển bus SCSI thường được triển khai dưới dạng bảng

mạch riêng (hoặc bộ điều hợp máy chủ) cắm vào máy tính. Nó thường chứa một bộ xử lý,
vi mã và một số bộ nhớ riêng để cho phép nó xử lý các thơng báo giao thức SCSI . Một
số thiết bị có bộ điều khiển tích hợp riêng. Nếu bạn nhìn vào ổ đĩa, bạn sẽ thấy một
bảng mạch được gắn ở một bên. Bảng này là bộ điều khiển đĩa. Ví dụ, nó triển khai
phía đĩa của giao thức cho một số loại kết nối—SCSI hoặc Phần đính kèm Cơng nghệ Nâng
cao Nối tiếp (SATA) . Nó có vi mã và bộ xử lý để thực hiện nhiều tác vụ, chẳng hạn
như lập bản đồ khu vực xấu, tìm nạp trước, tạo bộ đệm và lưu vào bộ nhớ đệm.
Làm cách nào bộ xử lý có thể đưa ra các lệnh và dữ liệu cho bộ điều khiển để thực
hiện chuyển giao I/O ? Câu trả lời ngắn gọn là bộ điều khiển có một hoặc nhiều thanh
ghi dữ liệu và tín hiệu điều khiển. Bộ xử lý giao tiếp với bộ điều khiển bằng cách
đọc và ghi các mẫu bit trong các thanh ghi này. Một cách mà giao tiếp này có thể xảy
ra là thơng qua việc sử dụng các lệnh I/O đặc biệt chỉ định việc truyền một byte hoặc
từ tới một địa chỉ cổng I/O . Lệnh I/O kích hoạt các đường bus để chọn thiết bị thích
hợp và di chuyển các bit vào hoặc ra khỏi thanh ghi thiết bị. Ngoài ra, bộ điều khiển
thiết bị có thể hỗ trợ I/O ánh xạ bộ nhớ . Trong trường hợp này, các thanh ghi điều
khiển thiết bị được ánh xạ vào không gian địa chỉ của bộ xử lý. CPU thực hiện các yêu
cầu I/O bằng cách sử dụng các lệnh truyền dữ liệu tiêu chuẩn để đọc và ghi các thanh
ghi điều khiển thiết bị tại các vị trí được ánh xạ của chúng trong bộ nhớ vật lý .
Một số hệ thống sử dụng cả hai kỹ thuật. Chẳng hạn, PC sử dụng các lệnh I/O để
điều khiển một số thiết bị và I/O được ánh xạ bộ nhớ để điều khiển các thiết bị khác.
Hình 13.2 cho thấy các địa chỉ cổng I/O thơng thường dành cho PC. Bộ điều khiển đồ
họa có các cổng I/O cho các hoạt động điều khiển cơ bản, nhưng bộ điều khiển có bộ nhớ lớn-


Machine Translated by Google
590

Chương 13 Hệ thống I/O
thiết bị


Dải địa chỉ I/O (thập lục phân)
000–00F

bộ điều khiển DMA

020–021

bộ điều khiển ngắt

040–043

hẹn giờ

200–20F

người điều khiển trò chơi

2F8–2FF
320–32F

cổng nối tiếp (phụ)
bộ điều khiển đĩa cứng

378–37F

cổng song song

3D0–3DF

bộ điều khiển đồ họa


3F0–3F7
3F8–3FF

bộ điều khiển ổ đĩa mềm

cổng nối tiếp (chính)

Hình 13.2 Vị trí cổng I/O của thiết bị trên PC (một phần).

vùng được ánh xạ để giữ nội dung màn hình. Quá trình gửi đầu ra tới màn hình bằng cách
ghi dữ liệu vào vùng ánh xạ bộ nhớ. Bộ điều khiển tạo ra hình ảnh màn hình dựa trên nội
dung của bộ nhớ này. Kỹ thuật này là đơn giản để sử dụng. Hơn nữa, việc ghi hàng triệu
byte vào bộ nhớ đồ họa nhanh hơn việc đưa ra hàng triệu lệnh I/O . Nhưng việc dễ dàng
ghi vào bộ điều khiển I/O được ánh xạ bộ nhớ bị bù đắp bởi một nhược điểm. Bởi vì một
loại lỗi phần mềm phổ biến là ghi thơng qua một con trỏ khơng chính xác đến một vùng bộ
nhớ ngoài ý muốn, một thanh ghi thiết bị được ánh xạ bộ nhớ dễ bị sửa đổi do vơ tình.
Tất nhiên, bộ nhớ được bảo vệ giúp giảm nguy cơ này.

Một cổng I/O thường bao gồm bốn thanh ghi, được gọi là các thanh ghi trạng thái,
điều khiển, dữ liệu vào và dữ liệu ra.
• Thanh ghi dữ liệu vào được máy chủ đọc để nhận đầu vào. •
Thanh ghi dữ liệu ra được ghi bởi máy chủ để gửi đầu ra. • Thanh ghi
trạng thái chứa các bit mà máy chủ có thể đọc được. Các bit này cho biết các trạng
thái, chẳng hạn như liệu lệnh hiện tại đã hoàn thành hay chưa, liệu một byte có sẵn
để đọc từ thanh ghi dữ liệu vào hay khơng và liệu có xảy ra lỗi thiết bị hay khơng.

• Thanh ghi điều khiển có thể được ghi bởi máy chủ để bắt đầu một lệnh hoặc để thay
đổi chế độ của thiết bị. Chẳng hạn, một bit nhất định trong thanh ghi điều khiển
của cổng nối tiếp chọn giữa giao tiếp song cơng hồn tồn và bán song công, bit

khác cho phép kiểm tra chẵn lẻ, bit thứ ba đặt độ dài từ thành 7 hoặc 8 bit và các
bit khác chọn một trong các tốc độ được hỗ trợ bởi cổng nối tiếp.

Các thanh ghi dữ liệu thường có kích thước từ 1 đến 4 byte. Một số bộ điều khiển có
chip FIFO có thể chứa vài byte dữ liệu đầu vào hoặc đầu ra để mở rộng dung lượng của bộ
điều khiển ngoài kích thước của thanh ghi dữ liệu. Chip FIFO có thể chứa một loạt dữ
liệu nhỏ cho đến khi thiết bị hoặc máy chủ có thể nhận những dữ liệu đó.


Machine Translated by Google
13.2 Phần cứng I/O

591

13.2.1 Bỏ phiếu

Giao thức hoàn chỉnh cho sự tương tác giữa máy chủ và bộ điều khiển có thể phức tạp,
nhưng khái niệm bắt tay cơ bản thì đơn giản. Chúng tơi giải thích bắt tay với một ví
dụ. Giả sử rằng 2 bit được sử dụng để điều phối mối quan hệ người sản xuất-người tiêu
dùng giữa bộ điều khiển và máy chủ. Bộ điều khiển cho biết trạng thái của nó thơng qua
bit bận trong thanh ghi trạng thái . (Nhớ lại rằng để thiết lập một bit có nghĩa là
ghi 1 vào bit và xóa một bit có nghĩa là ghi 0 vào nó.) Bộ điều khiển thiết lập bit
bận khi nó đang bận làm việc và xóa bit bận khi nó sẵn sàng hoạt động. chấp nhận lệnh
tiếp theo. Máy chủ báo hiệu mong muốn của nó thơng qua bit sẵn sàng cho lệnh trong
thanh ghi lệnh . Máy chủ đặt bit sẵn sàng cho lệnh khi có lệnh để bộ điều khiển thực
thi.
Đối với ví dụ này, máy chủ ghi đầu ra thông qua một cổng, phối hợp với bộ điều khiển
bằng cách bắt tay như sau.

1. Máy chủ liên tục đọc bit bận cho đến khi bit đó trở nên rõ ràng.

2. Máy chủ đặt bit ghi trong thanh ghi lệnh và ghi một byte vào thanh ghi dữ liệu
ra .
3. Máy chủ đặt bit sẵn sàng cho lệnh .
4. Khi bộ điều khiển thông báo rằng bit sẵn sàng cho lệnh được đặt, nó sẽ đặt
hơi bận
5. Bộ điều khiển đọc thanh ghi lệnh và xem lệnh ghi .
Nó đọc thanh ghi xuất dữ liệu để lấy byte và thực hiện I/O cho thiết bị.

6. Bộ điều khiển xóa bit sẵn sàng cho lệnh , xóa bit lỗi trong thanh ghi trạng thái
để cho biết rằng I/O của thiết bị đã thành cơng và xóa bit bận để cho biết rằng
nó đã kết thúc.

Vịng lặp này được lặp lại cho mỗi byte.
Ở bước 1, máy chủ đang bận chờ đợi hoặc bỏ phiếu: nó ở trong một vòng lặp, đọc đi
đọc lại thanh ghi trạng thái cho đến khi bit bận trở nên rõ ràng. Nếu bộ điều khiển
và thiết bị nhanh, phương pháp này là một phương pháp hợp lý. Nhưng nếu thời gian chờ
đợi có thể lâu, chủ nhà có lẽ nên chuyển sang nhiệm vụ khác. Sau đó, làm thế nào để
máy chủ biết khi nào bộ điều khiển không hoạt động? Đối với một số thiết bị, máy chủ
phải nhanh chóng phục vụ thiết bị, nếu không dữ liệu sẽ bị mất. Chẳng hạn, khi dữ liệu
đang truyền vào cổng nối tiếp hoặc từ bàn phím, bộ đệm nhỏ trên bộ điều khiển sẽ bị
tràn và dữ liệu sẽ bị mất nếu máy chủ đợi quá lâu trước khi quay lại đọc byte.
Trong nhiều kiến trúc máy tính, ba chu kỳ hướng dẫn CPU là đủ để thăm dò một thiết
bị: đọc thanh ghi thiết bị, logic--và để trích xuất một bit trạng thái và phân nhánh
nếu không phải là 0. Rõ ràng, hoạt động bỏ phiếu cơ bản là hiệu quả. Tuy nhiên, việc
bỏ phiếu trở nên khơng hiệu quả khi nó được thử lặp đi lặp lại nhưng hiếm khi tìm thấy
một thiết bị sẵn sàng hoạt động, trong khi quá trình xử lý CPU hữu ích khác vẫn chưa
hồn thành. Trong những trường hợp như vậy, có thể hiệu quả hơn nếu sắp xếp để bộ điều
khiển phần cứng thông báo cho CPU khi thiết bị sẵn sàng hoạt động, thay vì u cầu CPU
thăm dị liên tục để hồn thành I/O . Cơ chế phần cứng cho phép thiết bị thông báo cho
CPU được gọi là ngắt.



Machine Translated by Google
592

Chương 13 Hệ thống I/O
CPU

bộ điều khiển vào/ra

1

trình điều khiển thiết bị khởi tạo I/O

2
khởi tạo I/O

CPU thực thi kiểm tra các
ngắt giữa các lệnh

3

CPU nhận ngắt, chuyển
quyền điều khiển cho
bộ xử lý ngắt

4

đầu vào sẵn sàng,
đầu ra hồn thành

hoặc lỗi tạo tín hiệu ngắt

7
5

trình xử lý ngắt
xử lý dữ liệu,
trả về từ ngắt

6

CPU tiếp tục
xử lý tác vụ
bị gián đoạn

Hình 13.3 Chu trình I/O điều khiển ngắt.

13.2.2 Ngắt Cơ chế
ngắt cơ bản hoạt động như sau. Phần cứng CPU có một dây được gọi là dây
yêu cầu ngắt mà CPU cảm nhận được sau khi thực hiện mọi lệnh. Khi CPU phát
hiện ra rằng bộ điều khiển đã xác nhận tín hiệu trên dịng u cầu ngắt,
CPU sẽ thực hiện lưu trạng thái và chuyển sang quy trình xử lý ngắt tại
một địa chỉ cố định trong bộ nhớ. Trình xử lý ngắt xác định nguyên nhân
gây ra ngắt, thực hiện xử lý cần thiết, thực hiện khôi phục trạng thái và
thực hiện quay lại lệnh ngắt để đưa CPU về trạng thái thực thi trước khi
ngắt. Chúng tơi nói rằng bộ điều khiển thiết bị tạo ra một ngắt bằng cách
xác nhận tín hiệu trên dịng u cầu ngắt, CPU bắt ngắt và gửi nó đến bộ
xử lý ngắt, và bộ xử lý sẽ xóa ngắt bằng cách bảo dưỡng thiết bị. Hình
13.3 tóm tắt chu trình I/O điều khiển ngắt . Chúng tơi nhấn mạnh đến việc
quản lý ngắt trong chương này bởi vì ngay cả các hệ thống hiện đại chỉ có

một người dùng cũng quản lý hàng trăm lần ngắt mỗi giây và các máy chủ
quản lý hàng trăm nghìn lần mỗi giây.
Cơ chế ngắt cơ bản vừa được mô tả cho phép CPU phản hồi sự kiện không
đồng bộ, chẳng hạn như khi bộ điều khiển thiết bị sẵn sàng hoạt động. Tuy
nhiên, trong một hệ điều hành hiện đại, chúng ta cần các tính năng xử lý
ngắt phức tạp hơn.


Machine Translated by Google
13.2 Phần cứng I/O

593

1. Chúng tôi cần khả năng trì hỗn xử lý ngắt trong q trình xử lý quan trọng.
2. Chúng ta cần một cách hiệu quả để gửi đến trình xử lý ngắt phù hợp cho một
thiết bị mà không cần bỏ phiếu trước cho tất cả các thiết bị để xem thiết bị
nào gây ra ngắt.
3. Chúng ta cần các ngắt đa cấp để hệ điều hành có thể phân biệt giữa các ngắt có
mức độ ưu tiên cao và thấp và có thể phản hồi với mức độ khẩn cấp phù hợp.

Trong phần cứng máy tính hiện đại, ba tính năng này được cung cấp bởi CPU và phần
cứng của bộ điều khiển ngắt.
Hầu hết các CPU đều có hai dịng u cầu ngắt. Một là ngắt không che được, được
dành riêng cho các sự kiện như lỗi bộ nhớ không thể phục hồi.
Dịng ngắt thứ hai có thể che được: CPU có thể tắt nó trước khi thực hiện các chuỗi
lệnh quan trọng khơng được ngắt.
Ngắt có thể che dấu được bộ điều khiển thiết bị sử dụng để yêu cầu dịch vụ.
Cơ chế ngắt chấp nhận một địa chỉ—một số chọn một thói quen xử lý ngắt cụ thể
từ một tập hợp nhỏ. Trong hầu hết các kiến trúc, địa chỉ này là một phần bù trong
bảng được gọi là vectơ ngắt. Vectơ này chứa các địa chỉ bộ nhớ của các trình xử lý

ngắt chun biệt. Mục đích của cơ chế ngắt theo vectơ là giảm nhu cầu về một trình
xử lý ngắt duy nhất để tìm kiếm tất cả các nguồn ngắt có thể có để xác định cái nào
cần dịch vụ. Tuy nhiên, trong thực tế, máy tính có nhiều thiết bị hơn (và do đó, các
trình xử lý ngắt) hơn là chúng có các thành phần địa chỉ trong vectơ ngắt.
Một cách phổ biến để giải quyết vấn đề này là sử dụng chuỗi ngắt, trong đó mỗi phần
tử trong vectơ ngắt trỏ đến phần đầu của danh sách các trình xử lý ngắt. Khi một
ngắt được đưa ra, các trình xử lý trong danh sách tương ứng được gọi từng cái một,
cho đến khi tìm thấy một trình xử lý có thể phục vụ u cầu. Cấu trúc này là sự thỏa
hiệp giữa chi phí hoạt động của một bảng ngắt khổng lồ và sự kém hiệu quả của việc
gửi tới một trình xử lý ngắt duy nhất.
Hình 13.4 minh họa thiết kế vector ngắt cho bộ xử lý Intel Pentium. Các sự kiện
từ 0 đến 31, không thể che giấu được, được sử dụng để báo hiệu các tình trạng lỗi
khác nhau. Các sự kiện từ 32 đến 255, có thể che được, được sử dụng cho các mục đích
như ngắt do thiết bị tạo.
Cơ chế ngắt cũng thực hiện một hệ thống các mức ưu tiên ngắt. Các mức này cho
phép CPU trì hỗn việc xử lý các ngắt có mức ưu tiên thấp mà không che dấu tất cả
các ngắt và giúp ngắt có mức ưu tiên cao có thể chiếm trước việc thực hiện ngắt có
mức ưu tiên thấp.
Một hệ điều hành hiện đại tương tác với cơ chế ngắt theo nhiều cách. Tại thời
điểm khởi động, hệ điều hành thăm dò các bus phần cứng để xác định thiết bị nào có
mặt và cài đặt các trình xử lý ngắt tương ứng vào vectơ ngắt. Trong quá trình I/O,
các bộ điều khiển thiết bị khác nhau sẽ tăng các ngắt khi chúng sẵn sàng hoạt động.
Các ngắt này biểu thị rằng đầu ra đã hoàn thành hoặc dữ liệu đầu vào có sẵn hoặc một
lỗi đã được phát hiện. Cơ chế ngắt cũng được sử dụng để xử lý nhiều loại ngoại lệ,
chẳng hạn như chia cho 0, truy cập địa chỉ bộ nhớ được bảo vệ hoặc không tồn tại
hoặc cố gắng thực hiện lệnh đặc quyền từ chế độ người dùng. Các sự kiện kích hoạt
các ngắt có một thuộc tính chung: chúng là các sự kiện xảy ra khiến hệ điều hành
thực thi một thói quen độc lập, khẩn cấp.



Machine Translated by Google
594

Chương 13 Hệ thống I/O
số vectơ

sự mô tả

0

lỗi phân chia

1

gỡ lỗi ngoại lệ

2

null ngắt điểm

3

dừng

4

Thiết bị opcode không hợp

5


lệ ngoại lệ giới hạn phạm

6

vi được phát hiện INTO

7

không khả dụng

số 8

9

lỗi nặng
phân đoạn bộ đồng xử lý tràn (dành riêng) phân

10

đoạn trạng thái tác vụ không hợp lệ phân đoạn

11

không xuất hiện lỗi ngăn xếp

12
13

lỗi trang bảo vệ


14

chung

15

(Dành riêng cho Intel, không sử

16

dụng) kiểm tra căn chỉnh lỗi dấu

17

phẩy động

18

kiểm tra máy

19–31
32–255

(Dành riêng cho Intel, không sử
dụng) các ngắt có thể che được

Hình 13.4 Bảng vectơ sự kiện bộ xử lý Intel Pentium.

Một hệ điều hành có những cách sử dụng tốt khác cho cơ chế phần cứng và
phần mềm hiệu quả giúp tiết kiệm một lượng nhỏ trạng thái bộ xử lý và sau đó

gọi một thường trình đặc quyền trong nhân. Ví dụ, nhiều hệ điều hành sử dụng
cơ chế ngắt để phân trang bộ nhớ ảo. Lỗi trang là một ngoại lệ làm tăng ngắt.
Ngắt tạm dừng tiến trình hiện tại và chuyển đến trình xử lý lỗi trang trong
kernel. Trình xử lý này lưu trạng thái của quy trình, di chuyển quy trình vào
hàng đợi, thực hiện quản lý bộ đệm trang, lên lịch cho thao tác I/O để tìm
nạp trang, lên lịch cho một quy trình khác để tiếp tục thực thi và sau đó
quay lại từ ngắt.
Một ví dụ khác được tìm thấy trong việc thực hiện các cuộc gọi hệ thống.
Thơng thường, một chương trình sử dụng lời gọi thư viện để thực hiện lời gọi
hệ thống. Các thủ tục thư viện kiểm tra các đối số do ứng dụng đưa ra, xây
dựng cấu trúc dữ liệu để truyền các đối số tới nhân, sau đó thực hiện một lệnh
đặc biệt gọi là ngắt phần mềm hoặc bẫy. Hướng dẫn này có một tốn hạng xác
định dịch vụ hạt nhân mong muốn. Khi một quy trình thực thi lệnh bẫy, phần
cứng ngắt sẽ lưu trạng thái của mã người dùng, chuyển sang chế độ kernel và
gửi đến thủ tục kernel thực hiện dịch vụ được yêu cầu. Cái bẫy được cấp mức
ưu tiên ngắt tương đối thấp so với mức ưu tiên được gán cho các ngắt của thiết
bị—việc thực hiện lệnh gọi hệ thống thay mặt cho một ứng dụng ít khẩn cấp hơn
so với việc bảo dưỡng bộ điều khiển thiết bị trước khi hàng đợi FIFO của nó
bị tràn và mất dữ liệu .
Các ngắt cũng có thể được sử dụng để quản lý luồng điều khiển trong nhân.
Ví dụ: hãy xem xét một ví dụ về q trình xử lý cần thiết để hồn thành


Machine Translated by Google
13.2 Phần cứng I/O

595

một đĩa đọc. Một bước là sao chép dữ liệu từ không gian nhân vào bộ đệm người dùng.
Việc sao chép này tốn thời gian nhưng khơng khẩn cấp—nó khơng nên chặn việc xử lý

ngắt có mức độ ưu tiên cao khác. Một bước khác là bắt đầu I/O đang chờ xử lý tiếp
theo cho ổ đĩa đó. Bước này có mức độ ưu tiên cao hơn. Nếu các đĩa được sử dụng
hiệu quả, chúng ta cần bắt đầu I/O tiếp theo ngay sau khi hồn thành I/O trước đó.
Do đó, một cặp trình xử lý ngắt thực hiện mã hạt nhân để hoàn thành việc đọc đĩa.
Trình xử lý ưu tiên cao ghi lại trạng thái I/O , xóa ngắt thiết bị, bắt đầu I/O
đang chờ xử lý tiếp theo và tăng ngắt ưu tiên thấp để hồn thành cơng việc. Sau
đó, khi CPU khơng bận rộn với cơng việc có mức ưu tiên cao, ngắt có mức ưu tiên
thấp sẽ được gửi đi. Trình xử lý tương ứng hồn thành I/O cấp người dùng bằng cách
sao chép dữ liệu từ bộ đệm nhân vào khơng gian ứng dụng, sau đó gọi bộ lập lịch để
đặt ứng dụng vào hàng đợi sẵn sàng.
Kiến trúc nhân luồng rất phù hợp để thực hiện nhiều ưu tiên ngắt và để thực
thi quyền ưu tiên xử lý ngắt so với xử lý nền trong các thường trình ứng dụng và
nhân. Chúng tơi minh họa điểm này với nhân Solaris. Trong Solaris, các trình xử lý
ngắt được thực thi dưới dạng các luồng nhân. Một loạt các ưu tiên cao được dành
riêng cho các chủ đề này.
Những ưu tiên này cung cấp cho trình xử lý ngắt ưu tiên hơn mã ứng dụng và quản lý
hạt nhân và thực hiện các mối quan hệ ưu tiên giữa các trình xử lý ngắt. Các ưu
tiên khiến bộ lập lịch luồng Solaris ưu tiên các trình xử lý ngắt có mức độ ưu
tiên thấp để ưu tiên các trình xử lý ngắt có mức độ ưu tiên cao hơn và việc triển
khai theo luồng cho phép phần cứng đa bộ xử lý chạy đồng thời một số trình xử lý
ngắt. Chúng tôi mô tả kiến trúc ngắt của Windows XP và UNIX trong Chương 19 và Phụ
lục A, tương ứng.
Tóm lại, các ngắt được sử dụng trên khắp các hệ điều hành hiện đại để xử lý
các sự kiện khơng đồng bộ và bẫy các thói quen chế độ giám sát trong nhân. Để cho
phép thực hiện công việc khẩn cấp nhất trước tiên, các máy tính hiện đại sử dụng
một hệ thống ưu tiên ngắt. Bộ điều khiển thiết bị, lỗi phần cứng và lệnh gọi hệ
thống đều gây ra các ngắt để kích hoạt các quy trình nhân. Bởi vì các ngắt được sử
dụng rất nhiều cho quá trình xử lý nhạy cảm với thời gian, nên việc xử lý ngắt
hiệu quả là cần thiết để có hiệu suất hệ thống tốt.


13.2.3 Truy cập bộ nhớ trực tiếp

Đối với một thiết bị thực hiện chuyển giao lớn, chẳng hạn như ổ đĩa, có vẻ lãng
phí khi sử dụng bộ xử lý đa năng đắt tiền để xem các bit trạng thái và nạp dữ liệu
vào thanh ghi bộ điều khiển mỗi lần một byte—một quá trình được gọi là I/O được
lập trình (PIO). Nhiều máy tính tránh tạo gánh nặng cho CPU chính với PIO bằng
cách giảm tải một số công việc này cho bộ xử lý có mục đích đặc biệt được gọi là
bộ điều khiển truy cập bộ nhớ trực tiếp (DMA) . Để bắt đầu truyền DMA , máy chủ
ghi khối lệnh DMA vào bộ nhớ. Khối này chứa một con trỏ tới nguồn truyền, một con
trỏ tới đích truyền và đếm số byte sẽ được truyền. CPU ghi địa chỉ của khối lệnh
này vào bộ điều khiển DMA , sau đó tiếp tục với công việc khác. Bộ điều khiển DMA
tiến hành vận hành bus bộ nhớ trực tiếp, đặt các địa chỉ trên bus để thực hiện
chuyển giao mà không cần sự trợ giúp của CPU chính . Bộ điều khiển DMA đơn giản là
một thành phần tiêu chuẩn trong tất cả các máy tính hiện đại, từ điện thoại thơng
minh đến máy tính lớn.


Machine Translated by Google
596

Chương 13 Hệ thống I/O
Quá trình bắt tay giữa bộ điều khiển DMA và bộ điều khiển thiết bị được thực
hiện thông qua một cặp dây gọi là yêu cầu DMA và xác nhận DMA.
Bộ điều khiển thiết bị đặt một tín hiệu trên dây yêu cầu DMA khi có sẵn một từ
dữ liệu để truyền. Tín hiệu này làm cho bộ điều khiển DMA nắm bắt bus bộ nhớ,
đặt địa chỉ mong muốn trên dây địa chỉ bộ nhớ và đặt tín hiệu trên dây xác nhận
DMA. Khi bộ điều khiển thiết bị nhận được tín hiệu xác nhận DMA, nó sẽ chuyển từ
dữ liệu sang bộ nhớ và xóa tín hiệu u cầu DMA.
Khi tồn bộ q trình truyền hồn tất, bộ điều khiển DMA sẽ ngắt CPU.


Q trình này được mơ tả trong Hình 13.5. Khi bộ điều khiển DMA chiếm bus bộ
nhớ, CPU tạm thời bị ngăn không cho truy cập bộ nhớ chính, mặc dù CPU vẫn có thể
truy cập các mục dữ liệu trong bộ nhớ đệm chính và phụ của nó.
Mặc dù việc đánh cắp chu kỳ này có thể làm chậm q trình tính tốn của CPU ,
nhưng việc giảm tải công việc truyền dữ liệu sang bộ điều khiển DMA nhìn chung
sẽ cải thiện hiệu năng tổng thể của hệ thống. Một số kiến trúc máy tính sử dụng
địa chỉ bộ nhớ vật lý cho DMA, nhưng một số khác thực hiện truy cập bộ nhớ ảo
trực tiếp (DVMA), sử dụng địa chỉ ảo trải qua quá trình dịch sang địa chỉ vật
lý. DVMA có thể thực hiện truyền giữa hai thiết bị được ánh xạ bộ nhớ mà không
cần sự can thiệp của CPU hoặc sử dụng bộ nhớ chính.
Trên các nhân chế độ được bảo vệ, hệ điều hành thường ngăn các tiến trình
trực tiếp đưa ra các lệnh của thiết bị. Kỷ luật này bảo vệ dữ liệu khỏi các vi
phạm kiểm soát truy cập và cũng bảo vệ hệ thống khỏi việc sử dụng sai bộ điều
khiển thiết bị có thể gây ra sự cố hệ thống. Thay vào đó, hệ điều hành xuất các
chức năng mà một quy trình đủ đặc quyền có thể sử dụng để truy cập các hoạt động
cấp thấp trên phần cứng bên dưới. Trên các nhân khơng có bảo vệ bộ nhớ, các tiến
trình có thể truy cập trực tiếp vào bộ điều khiển thiết bị. Truy cập trực tiếp
này có thể được sử dụng để đạt được hiệu suất cao, vì nó có thể tránh giao tiếp
nhân, chuyển ngữ cảnh và các lớp của phần mềm nhân. Khơng may,

1. trình điều khiển thiết bị
được u cầu chuyển dữ liệu

CPU

đĩa sang bộ đệm tại địa chỉ X

5. Bộ điều khiển DMA

2. trình điều khiển thiết


chuyển byte vào

bị yêu cầu bộ điều

bộ đệm X, tăng địa

khiển đĩa chuyển các

chỉ bộ nhớ và giảm

byte C từ đĩa sang bộ

C cho đến khi C 0

đệm tại địa chỉ X

bộ đệm

DMA/bus/bộ

6. khi C 0, DMA ngắt

điều
khiển ngắt

CPU để báo hiệu hoàn
thành truyền

xx


Bộ nhớ bus bộ nhớ CPU

xe buýt PCI

3. bộ điều khiển đĩa bắt đầu

Bộ điều
khiển đĩa IDE

đĩa

đĩa

đĩa

đĩa

truyền DMA

4. bộ điều khiển đĩa gửi
từng byte đến bộ điều
khiển DMA

Hình 13.5 Các bước trong chuyển giao DMA.

đệm


Machine Translated by Google

13.3 Giao diện I/O của ứng dụng

597

nó can thiệp vào an ninh hệ thống và sự ổn định. Xu hướng trong các hệ điều hành
có mục đích chung là bảo vệ bộ nhớ và thiết bị để hệ thống có thể cố gắng bảo vệ
chống lại các ứng dụng có lỗi hoặc độc hại.
13.2.4 Tóm tắt phần cứng I/O Mặc dù các
khía cạnh phần cứng của I/O rất phức tạp khi được xem xét ở mức độ chi tiết của
thiết kế phần cứng điện tử, các khái niệm mà chúng tôi vừa mô tả cũng đủ để giúp
chúng tơi hiểu được nhiều tính năng của I/O của các hệ điều hành. Hãy xem lại các
khái niệm chính:
• Xe buýt
• Bộ điều khiển

• Một cổng I/O và các thanh ghi
của nó • Mối quan hệ bắt tay giữa máy chủ và bộ điều khiển thiết bị • Việc
thực hiện q trình bắt tay này trong vịng bỏ phiếu hoặc thơng qua các ngắt •
Giảm tải cơng việc này cho bộ điều khiển DMA đối với các lần truyền lớn
Chúng tơi đã đưa ra một ví dụ cơ bản về quá trình bắt tay diễn ra giữa bộ điều
khiển thiết bị và máy chủ trước đó trong phần này. Trên thực tế, sự đa dạng của
các thiết bị có sẵn đặt ra một vấn đề cho những người triển khai hệ điều hành. Mỗi
loại thiết bị có bộ khả năng, định nghĩa bit điều khiển và giao thức riêng để
tương tác với máy chủ—và tất cả chúng đều khác nhau. Làm thế nào hệ điều hành có
thể được thiết kế để chúng ta có thể gắn các thiết bị mới vào máy tính mà khơng
cần viết lại hệ điều hành? Và khi các thiết bị khác nhau rất nhiều, làm thế nào hệ
điều hành có thể cung cấp giao diện I/O thống nhất, thuận tiện cho các ứng dụng?
Chúng tôi giải quyết những câu hỏi tiếp theo.

13.3 Giao diện I/O của ứng dụng

Trong phần này, chúng tôi thảo luận về các kỹ thuật cấu trúc và giao diện cho hệ
điều hành cho phép các thiết bị I/O được xử lý theo cách tiêu chuẩn, thống nhất.
Ví dụ, chúng tơi giải thích cách ứng dụng có thể mở tệp trên đĩa mà khơng cần biết
loại đĩa đó là gì và cách có thể thêm đĩa mới cũng như các thiết bị khác vào máy
tính mà khơng làm gián đoạn hệ điều hành.
Giống như các vấn đề công nghệ phần mềm phức tạp khác, cách tiếp cận ở đây
liên quan đến trừu tượng hóa, đóng gói và phân lớp phần mềm. Cụ thể, chúng ta có
thể trừu tượng hóa những khác biệt chi tiết trong các thiết bị I/O bằng cách xác
định một số loại chung. Mỗi loại chung được truy cập thơng qua một bộ chức năng
được tiêu chuẩn hóa—một giao diện. Sự khác biệt được gói gọn trong các mơ-đun hạt
nhân được gọi là trình điều khiển thiết bị bên trong được tùy chỉnh phù hợp với
các thiết bị cụ thể nhưng xuất một trong các giao diện tiêu chuẩn. Hình 13.6 minh
họa cách các phần liên quan đến I/O của nhân được cấu trúc trong các lớp phần mềm.
Mục đích của lớp trình điều khiển thiết bị là che giấu sự khác biệt giữa các
bộ điều khiển thiết bị khỏi hệ thống con I/O của nhân, giống như các lệnh gọi hệ
thống I/O gói gọn hành vi của các thiết bị trong một vài lớp chung che giấu sự
khác biệt về phần cứng khỏi các ứng dụng . Tạo hệ thống con I/O


Machine Translated by Google
Chương 13 Hệ thống I/O

nhân

phần
mềm

hệ thống con I/O hạt nhân

Trình

điều khiển
thiết bị SCSI

Bộ
điều

trình điều

trình điều
khiển thiết
bị bàn phím

khiển thiết

Trình điều

• • •

bị chuột

bị bus PCI

bộ điều

bộ điều
khiển

khiển

khiển thiết


Bộ điều
• • •

khiển

trình

Trình điều

điều khiển

khiển thiết

thiết bị mềm

bộ điều

Bộ điều

khiển

khiển

thiết bị bus PCI thiết bị mềm

thiết bị bàn phímthiết bị chuột
khiển thiết bị SCSI

bị ATAPI


thiết bị ATAPI

phần
cứng

598

Thiết
thiết
bị SCSI

bàn phìm chuột

• • •

ổ đĩa
xe bt PCI

mềm

bị ATAPI
(đĩa,
băng, ổ
đĩa)

Hình 13.6 Một cấu trúc I/O hạt nhân.

độc lập với phần cứng giúp đơn giản hóa cơng việc của nhà phát triển hệ điều hành. Nó
cũng mang lại lợi ích cho các nhà sản xuất phần cứng. Họ thiết kế các thiết bị mới để

tương thích với giao diện bộ điều khiển máy chủ hiện có (chẳng hạn như SATA) hoặc họ
viết trình điều khiển thiết bị để giao tiếp phần cứng mới với các hệ điều hành phổ
biến. Do đó, chúng ta có thể gắn các thiết bị ngoại vi mới vào máy tính mà khơng cần
đợi nhà cung cấp hệ điều hành phát triển mã hỗ trợ.
Thật không may cho các nhà sản xuất phần cứng-thiết bị, mỗi loại hệ điều hành có
các tiêu chuẩn riêng cho giao diện trình điều khiển thiết bị. Một thiết bị nhất định
có thể đi kèm với nhiều trình điều khiển thiết bị—ví dụ: trình điều khiển cho Windows,
Linux, AIX và Mac OS X. Các thiết bị khác nhau ở nhiều kích thước, như được minh họa
trong Hình 13.7.

• Dịng ký tự hoặc khối. Thiết bị dòng ký tự truyền từng byte một, trong khi thiết bị
khối truyền một khối byte dưới dạng đơn vị.
• Truy cập tuần tự hoặc ngẫu nhiên. Thiết bị tuần tự truyền dữ liệu theo thứ tự cố
định do thiết bị xác định, trong khi người dùng thiết bị truy cập ngẫu nhiên có
thể hướng dẫn thiết bị tìm kiếm bất kỳ vị trí lưu trữ dữ liệu có sẵn nào.

• Đồng bộ hoặc khơng đồng bộ. Một thiết bị đồng bộ thực hiện truyền dữ liệu với thời
gian phản hồi có thể dự đốn được, phối hợp với các khía cạnh khác của hệ thống.
Một thiết bị khơng đồng bộ thể hiện thời gian phản hồi bất thường hoặc khơng thể
đốn trước khơng được phối hợp với các sự kiện máy tính khác. • Có thể chia sẻ
hoặc dành riêng. Một thiết bị có thể chia sẻ có thể được sử dụng đồng thời bởi một
số quy trình hoặc luồng; một thiết bị chuyên dụng không thể.


Machine Translated by Google
13.3 Giao diện I/O của ứng dụng

biến thể

diện mạo

khối ký tự

chế độ truyền dữ liệu

599

thí dụ
đĩa đầu
cuối

phương pháp truy cập

lịch trình chuyển nhượng

chia sẻ

tốc độ thiết bị

modem

tuần tự
ngẫu nhiên

Ổ ĐĨA CD

đồng bộ khơng

bàn

đồng bộ


phím băng

chun dụng

bàn

có thể chia sẻ

phím băng

độ trễ
tìm kiếm
thời gian độ
trễ tốc độ truyền giữa các hoạt động

hướng vào/ra

chỉ đọc

Đĩa điều

ghi chỉ
đọc-ghi

khiển đồ họa CD-ROM

Hình 13.7 Đặc điểm của thiết bị I/O.

• Tốc độ hoạt động. Tốc độ thiết bị nằm trong khoảng từ vài byte trên giây đến

vài gigabyte mỗi giây.
• Đọc–ghi, chỉ đọc hoặc chỉ viết. Một số thiết bị thực hiện cả đầu vào và đầu ra,
nhưng những thiết bị khác chỉ hỗ trợ một hướng truyền dữ liệu.

Với mục đích truy cập ứng dụng, nhiều sự khác biệt trong số này bị ẩn bởi hệ điều
hành và các thiết bị được nhóm thành một số loại thơng thường. Các kiểu truy cập thiết
bị kết quả đã được tìm thấy là hữu ích và có thể áp dụng rộng rãi. Mặc dù các cuộc gọi
hệ thống chính xác có thể khác nhau giữa các hệ điều hành, nhưng các danh mục thiết
bị khá chuẩn. Các quy ước truy cập chính bao gồm I/O khối, I/O dòng ký tự , truy cập
tệp ánh xạ bộ nhớ và ổ cắm mạng. Các hệ điều hành cũng cung cấp các lệnh gọi hệ thống
đặc biệt để truy cập một vài thiết bị bổ sung, chẳng hạn như đồng hồ thời gian trong
ngày và bộ đếm thời gian.
Một số hệ điều hành cung cấp một tập hợp các cuộc gọi hệ thống cho các thiết bị hiển
thị đồ họa, video và âm thanh.
Hầu hết các hệ điều hành cũng có một lối thốt (hoặc cửa sau) chuyển các lệnh tùy
ý từ ứng dụng sang trình điều khiển thiết bị một cách rõ ràng. Trong UNIX, lệnh gọi
hệ thống này là ioctl() (đối với “ điều khiển I/O”). Lệnh gọi hệ thống ioctl() cho
phép một ứng dụng truy cập vào bất kỳ chức năng nào có thể được thực hiện bởi bất kỳ
trình điều khiển thiết bị nào mà không cần phải phát minh ra một lệnh gọi hệ thống
mới. Cuộc gọi hệ thống ioctl() có ba đối số. Đầu tiên là một bộ mô tả tệp kết nối ứng
dụng với trình điều khiển bằng cách tham chiếu đến một thiết bị phần cứng được quản
lý bởi trình điều khiển đó. Thứ hai là một số nguyên chọn một trong các lệnh được
triển khai trong trình điều khiển. Thứ ba là một con trỏ tới cấu trúc dữ liệu tùy ý
trong bộ nhớ cho phép ứng dụng và trình điều khiển giao tiếp bất kỳ thơng tin hoặc dữ
liệu điều khiển cần thiết nào.


Machine Translated by Google
600


Chương 13 Hệ thống I/O
13.3.1 Thiết bị khối và ký tự

Giao diện thiết bị khối nắm bắt tất cả các khía cạnh cần thiết để truy cập ổ đĩa và các thiết bị
định hướng khối khác. Thiết bị phải hiểu các lệnh như đọc() và viết(). Nếu nó là một thiết bị truy
cập ngẫu nhiên, nó cũng sẽ có lệnh seek() để chỉ định khối nào sẽ được chuyển tiếp theo. Các ứng
dụng thường truy cập một thiết bị như vậy thông qua giao diện hệ thống tệp. Chúng ta có thể thấy
rằng read(), write() và seek() nắm bắt các hành vi thiết yếu của các thiết bị lưu trữ khối, để các
ứng dụng được cách ly khỏi sự khác biệt ở mức độ thấp giữa các thiết bị đó.

Bản thân hệ điều hành, cũng như các ứng dụng đặc biệt như hệ thống quản lý cơ sở dữ liệu, có
thể thích truy cập thiết bị khối dưới dạng một mảng khối tuyến tính đơn giản. Chế độ truy cập này
đôi khi được gọi là I/O thô . Nếu ứng dụng thực hiện bộ đệm của riêng nó, thì việc sử dụng hệ
thống tệp sẽ gây ra bộ đệm bổ sung, không cần thiết. Tương tự như vậy, nếu một ứng dụng cung cấp
khóa riêng cho các khối tệp hoặc vùng, thì bất kỳ dịch vụ khóa nào của hệ điều hành ít nhất cũng
sẽ dư thừa và tệ nhất là mâu thuẫn. Để tránh những xung đột này, quyền truy cập thiết bị thô sẽ
chuyển quyền kiểm soát thiết bị trực tiếp đến ứng dụng, cho phép hệ điều hành tránh xa. Thật khơng
may, khơng có dịch vụ hệ điều hành nào được thực hiện trên thiết bị này. Một thỏa hiệp đang trở
nên phổ biến là hệ điều hành cho phép một chế độ hoạt động trên một tệp vơ hiệu hóa bộ đệm và
khóa. Trong thế giới UNIX , điều này được gọi là I/O trực tiếp .

Quyền truy cập tệp được ánh xạ bộ nhớ có thể được xếp lớp trên trình điều khiển thiết bị khối.
Thay vì cung cấp các thao tác đọc và ghi, giao diện ánh xạ bộ nhớ cung cấp quyền truy cập vào bộ
lưu trữ đĩa thông qua một mảng byte trong bộ nhớ chính. Cuộc gọi hệ thống ánh xạ tệp vào bộ nhớ
trả về địa chỉ bộ nhớ ảo chứa bản sao của tệp. Việc truyền dữ liệu thực tế chỉ được thực hiện khi
cần thiết để đáp ứng quyền truy cập vào hình ảnh bộ nhớ. Bởi vì quá trình truyền được xử lý theo
cơ chế giống như cơ chế được sử dụng để truy cập bộ nhớ ảo theo phân trang theo yêu cầu, I/O được
ánh xạ bộ nhớ hiệu quả. Ánh xạ bộ nhớ cũng thuận tiện cho người lập trình—việc truy cập tệp ánh xạ
bộ nhớ cũng đơn giản như đọc và ghi vào bộ nhớ. Các hệ điều hành cung cấp bộ nhớ ảo thường sử dụng
giao diện ánh xạ cho các dịch vụ nhân. Chẳng hạn, để thực thi một chương trình, hệ điều hành ánh

xạ tệp thực thi vào bộ nhớ và sau đó chuyển điều khiển đến địa chỉ mục nhập của tệp thực thi. Giao
diện ánh xạ cũng thường được sử dụng để truy cập kernel vào khơng gian hốn đổi trên đĩa.

Bàn phím là một ví dụ về thiết bị được truy cập thông qua giao diện luồng ký tự. Các cuộc
gọi hệ thống cơ bản trong giao diện này cho phép một ứng dụng get () hoặc put() một ký tự. Ngoài
giao diện này, các thư viện có thể được xây dựng để cung cấp khả năng truy cập theo từng dòng, với
các dịch vụ đệm và chỉnh sửa (ví dụ: khi người dùng nhập một khoảng lùi, ký tự trước đó sẽ bị xóa
khỏi luồng đầu vào). Kiểu truy cập này thuận tiện cho các thiết bị đầu vào như bàn phím, chuột và
modem tạo ra dữ liệu cho đầu vào “một cách tự phát” —tức là vào những thời điểm mà ứng dụng khơng
nhất thiết phải dự đốn. Kiểu truy cập này cũng tốt cho các thiết bị đầu ra như máy in và bảng âm
thanh, phù hợp với khái niệm về luồng byte tuyến tính một cách tự nhiên.

13.3.2 Thiết Bị Mạng

Bởi vì các đặc điểm về hiệu suất và địa chỉ của I/O mạng khác biệt đáng kể so với các đặc điểm của
I/O đĩa, hầu hết các hệ điều hành đều cung cấp một mạng.


Machine Translated by Google
13.3 Giao diện I/O của ứng dụng

601

Giao diện I/O khác với giao diện read()–write()–seek() được sử dụng cho đĩa. Một giao
diện có sẵn trong nhiều hệ điều hành, bao gồm cả UNIX và Windows, là giao diện ổ cắm
mạng .
Hãy nghĩ về ổ cắm điện trên tường: bất kỳ thiết bị điện nào cũng có thể được cắm
vào. Tương tự, hệ thống gọi giao diện ổ cắm cho phép ứng dụng tạo ổ cắm, kết nối ổ cắm
cục bộ với địa chỉ từ xa (cắm ứng dụng này vào socket được tạo bởi một ứng dụng khác),
để lắng nghe bất kỳ ứng dụng từ xa nào cắm vào ổ cắm cục bộ và để gửi và nhận các gói

qua kết nối. Để hỗ trợ việc triển khai các máy chủ, giao diện ổ cắm cũng cung cấp một
chức năng gọi là select() để quản lý một tập hợp các ổ cắm. Một cuộc gọi đến select()
trả về thơng tin về ổ cắm nào có gói đang chờ nhận và ổ cắm nào có chỗ để chấp nhận
gói được gửi. Việc sử dụng select() loại bỏ bỏ phiếu và chờ đợi bận rộn mà nếu không
sẽ cần thiết cho I/O mạng. Các chức năng này đóng gói các hành vi thiết yếu của mạng,
hỗ trợ rất nhiều cho việc tạo các ứng dụng phân tán có thể sử dụng bất kỳ ngăn xếp
giao thức và phần cứng mạng cơ bản nào.

Nhiều cách tiếp cận khác để giao tiếp giữa các quá trình và giao tiếp mạng đã được
thực hiện. Chẳng hạn, Windows cung cấp một giao diện cho thẻ giao diện mạng và giao
diện thứ hai cho các giao thức mạng. Trong UNIX, vốn có lịch sử lâu đời như là nền
tảng chứng minh cho công nghệ mạng, chúng ta tìm thấy các đường ống bán song cơng,
FIFO song cơng hồn tồn , STREAMS song cơng hồn tồn , hàng đợi thông báo và ổ cắm.
Thông tin về mạng UNIX được đưa ra trong
Mục A.9.

13.3.3 Đồng hồ và Bộ hẹn giờ

Hầu hết các máy tính đều có đồng hồ phần cứng và bộ hẹn giờ cung cấp ba chức năng cơ
bản:
• Đưa ra thời gian hiện tại.
• Đưa ra thời gian đã trơi
qua. • Đặt hẹn giờ để kích hoạt thao tác X tại thời điểm T.

Các chức năng này được sử dụng nhiều bởi hệ điều hành, cũng như các ứng dụng nhạy cảm
với thời gian. Thật không may, các cuộc gọi hệ thống thực hiện các chức năng này khơng
được tiêu chuẩn hóa trên các hệ điều hành.
Phần cứng để đo thời gian đã trôi qua và kích hoạt các hoạt động được gọi là bộ
định thời khoảng thời gian có thể lập trình. Nó có thể được thiết lập để đợi một
khoảng thời gian nhất định rồi tạo ngắt và nó có thể được đặt để thực hiện việc này

một lần hoặc lặp lại quy trình để tạo ngắt định kỳ. Bộ lập lịch sử dụng cơ chế này để
tạo ra một ngắt sẽ chặn trước một quá trình ở cuối lát cắt thời gian của nó.
Hệ thống con I/O của đĩa sử dụng nó để gọi việc xóa định kỳ các bộ đệm đệm bẩn vào đĩa
và hệ thống con mạng sử dụng nó để hủy các hoạt động đang diễn ra quá chậm do tắc
nghẽn hoặc lỗi mạng. Hệ điều hành cũng có thể cung cấp giao diện cho các quy trình
người dùng để sử dụng bộ hẹn giờ. Hệ điều hành có thể hỗ trợ nhiều yêu cầu hẹn giờ hơn
số kênh phần cứng hẹn giờ bằng cách mô phỏng đồng hồ ảo. Để làm như vậy, hạt nhân
(hoặc trình điều khiển thiết bị hẹn giờ) duy trì một danh sách các ngắt mong muốn theo
quy trình riêng của nó và theo yêu cầu của người dùng, được sắp xếp theo thứ tự thời
gian sớm nhất. Nó thiết lập bộ đếm thời gian cho


Machine Translated by Google
602

Chương 13 Hệ thống I/O
thời gian sớm nhất. Khi bộ đếm thời gian bị gián đoạn, hạt nhân báo hiệu cho người yêu cầu và
tải lại bộ đếm thời gian với thời gian sớm nhất tiếp theo.
Trên nhiều máy tính, tốc độ ngắt do đồng hồ phần cứng tạo ra là từ 18 đến 60 tick mỗi giây.
Độ phân giải này là thơ, vì một máy tính hiện đại có thể thực hiện hàng trăm triệu lệnh mỗi giây.
Độ chính xác của trình kích hoạt bị giới hạn bởi độ phân giải thô của bộ hẹn giờ, cùng với chi
phí duy trì đồng hồ ảo. Ngồi ra, nếu các dấu tích của bộ đếm thời gian được sử dụng để duy trì
đồng hồ thời gian trong ngày của hệ thống, thì đồng hồ hệ thống có thể trơi. Trong hầu hết các
máy tính, đồng hồ phần cứng được xây dựng từ bộ đếm tần số cao. Trong một số máy tính, giá trị
của bộ đếm này có thể được đọc từ thanh ghi thiết bị, trong trường hợp đó, bộ đếm có thể được
coi là đồng hồ có độ phân giải cao. Mặc dù đồng hồ này khơng tạo ra các khoảng thời gian gián
đoạn, nhưng nó đưa ra các phép đo chính xác về các khoảng thời gian.

13.3.4 I/O khơng chặn và khơng đồng bộ
Một khía cạnh khác của giao diện lời gọi hệ thống liên quan đến sự lựa chọn giữa chặn I/O và

không chặn I/O. Khi một ứng dụng thực hiện cuộc gọi hệ thống chặn , việc thực thi ứng dụng sẽ bị
đình chỉ. Ứng dụng được chuyển từ hàng đợi chạy của hệ điều hành sang hàng đợi. Sau khi cuộc gọi
hệ thống hoàn tất, ứng dụng được chuyển trở lại hàng đợi chạy, nơi nó đủ điều kiện để tiếp tục
thực thi. Khi nó tiếp tục thực thi, nó sẽ nhận các giá trị được trả về bởi lệnh gọi hệ thống.
Các hành động vật lý được thực hiện bởi các thiết bị I/O nói chung là khơng đồng bộ—chúng mất
một lượng thời gian khác nhau hoặc khơng thể đốn trước. Tuy nhiên, hầu hết các hệ điều hành sử
dụng lệnh gọi hệ thống chặn cho giao diện ứng dụng, bởi vì mã ứng dụng chặn dễ hiểu hơn mã ứng
dụng khơng chặn.

Một số quy trình cấp người dùng cần I/O khơng chặn . Một ví dụ là giao diện người dùng nhận
dữ liệu đầu vào từ bàn phím và chuột trong khi xử lý và hiển thị dữ liệu trên màn hình. Một ví
dụ khác là một ứng dụng video đọc các khung hình từ một tệp trên đĩa đồng thời giải nén và hiển
thị đầu ra trên màn hình.

Một cách mà người viết ứng dụng có thể thực thi chồng chéo với I/O là viết một ứng dụng đa
luồng. Một số luồng có thể thực hiện chặn cuộc gọi hệ thống, trong khi những luồng khác tiếp tục
thực hiện. Một số hệ điều hành cung cấp các cuộc gọi hệ thống I/O không chặn . Một cuộc gọi không
chặn không dừng việc thực thi ứng dụng trong một thời gian dài. Thay vào đó, nó trả về nhanh
chóng, với giá trị trả về cho biết có bao nhiêu byte đã được truyền.

Một giải pháp thay thế cho lệnh gọi hệ thống không chặn là lệnh gọi hệ thống không đồng bộ.
Một cuộc gọi không đồng bộ trả về ngay lập tức mà khơng cần đợi I/O hồn tất. Ứng dụng tiếp tục
thực thi mã của nó. Việc hồn thành I/O tại một thời điểm nào đó trong tương lai được thông báo
tới ứng dụng, thông qua cài đặt của một số biến trong không gian địa chỉ của ứng dụng hoặc thơng
qua việc kích hoạt tín hiệu hoặc ngắt phần mềm hoặc quy trình gọi lại được thực thi bên ngồi
luồng điều khiển tuyến tính của ứng dụng. Sự khác biệt giữa các cuộc gọi hệ thống không chặn và
không đồng bộ là một read() không chặn trả về ngay lập tức với bất kỳ dữ liệu nào có sẵn—đầy đủ
số byte được u cầu, ít hơn hoặc khơng có gì cả. Một cuộc gọi read() khơng đồng bộ yêu cầu
chuyển sẽ được thực hiện toàn bộ nhưng sẽ hồn thành vào một thời điểm nào đó trong tương lai.
Hai phương thức I/O này được thể hiện trong Hình 13.8.



Machine Translated by Google
603

13.3 Giao diện I/O của ứng dụng

người dùng hạt nhân

yêu cầu quá trình chờ
đợi
trình điều khiển thiết bị

xử lý ngắt

quá trình yêu cầu

trình điều khiển thiết bị

xử lý ngắt

truyền dữ

truyền dữ

liệu phần cứng

liệu phần cứng

thời gian


người sử dụng

nhân

thời gian

(một)

(b)

Hình 13.8 Hai phương pháp I/O: (a) đồng bộ và (b) không đồng bộ.

Các hoạt động không đồng bộ xảy ra trên khắp các hệ điều hành hiện đại.
Thông thường, chúng không tiếp xúc với người dùng hoặc ứng dụng mà được chứa trong hoạt động
của hệ điều hành. Đĩa và mạng I/O là những ví dụ hữu ích. Theo mặc định, khi một ứng dụng đưa
ra yêu cầu gửi mạng hoặc yêu cầu ghi đĩa, hệ điều hành sẽ ghi nhận yêu cầu đó, đệm I /O và
quay lại ứng dụng. Khi có thể, để tối ưu hóa hiệu suất tổng thể của hệ thống, hệ điều hành sẽ
hoàn thành yêu cầu. Nếu xảy ra lỗi hệ thống trong thời gian tạm thời, ứng dụng sẽ mất mọi yêu
cầu “đang chạy”.
Do đó, các hệ điều hành thường đặt giới hạn về thời gian chúng sẽ đệm một yêu cầu. Ví dụ , một
số phiên bản của UNIX xóa bộ đệm đĩa của chúng sau mỗi 30 giây hoặc mỗi u cầu được xóa trong
vịng 30 giây kể từ khi nó xuất hiện. Tính nhất qn của dữ liệu trong các ứng dụng được duy
trì bởi hạt nhân, đọc dữ liệu từ bộ đệm của nó trước khi đưa ra yêu cầu I/O cho thiết bị, đảm
bảo rằng dữ liệu chưa được ghi vẫn được trả lại cho trình đọc yêu cầu. Lưu ý rằng nhiều luồng
thực hiện I/O cho cùng một tệp có thể khơng nhận được dữ liệu nhất quán, tùy thuộc vào cách
nhân thực hiện I/O của nó. Trong trường hợp này, chủ đề có thể cần phải sử dụng giao thức khóa.
Một số yêu cầu I/O cần được thực hiện ngay lập tức, do đó, các lệnh gọi hệ thống I/O thường có
một cách để chỉ ra rằng một yêu cầu nhất định hoặc I/O tới một thiết bị cụ thể phải được thực
hiện đồng bộ.

Một ví dụ điển hình về hành vi khơng chặn là lệnh gọi hệ thống select() cho ổ cắm mạng.
Cuộc gọi hệ thống này nhận một đối số chỉ định thời gian chờ tối đa. Bằng cách đặt nó thành 0,
một ứng dụng có thể thăm dị hoạt động mạng mà không bị chặn. Nhưng việc sử dụng select() sẽ
giới thiệu thêm chi phí hoạt động, bởi vì lệnh gọi select() chỉ kiểm tra xem I/O có khả thi
hay khơng. Để truyền dữ liệu, select() phải được theo sau bởi một số loại lệnh read() hoặc
write() .
Một biến thể của cách tiếp cận này, được tìm thấy trong Mach, là lệnh gọi nhiều lượt đọc chặn.
Nó chỉ định các lần đọc mong muốn cho một số thiết bị trong một cuộc gọi hệ thống và trả về
ngay khi bất kỳ một trong số chúng hoàn thành.

13.3.5 I/O vectơ
Một số hệ điều hành cung cấp một biến thể chính khác của I/O thông qua các giao diện ứng dụng
của chúng. vectored I/O cho phép một lệnh gọi hệ thống thực hiện nhiều thao tác I/O liên quan
đến nhiều vị trí. Ví dụ, UNIXreadv


Machine Translated by Google
604

Chương 13 Hệ thống I/O
cuộc gọi hệ thống chấp nhận một vectơ gồm nhiều bộ đệm và đọc từ nguồn đến vectơ đó
hoặc ghi từ vectơ đó đến đích. Việc chuyển giao tương tự có thể được gây ra bởi một
số lệnh gọi hệ thống riêng lẻ, nhưng phương pháp thu thập phân tán này hữu ích vì
nhiều lý do.
Nhiều bộ đệm riêng biệt có thể truyền nội dung của chúng thông qua một cuộc gọi
hệ thống, tránh chuyển đổi ngữ cảnh và chi phí cuộc gọi hệ thống. Nếu khơng có I/O
theo vectơ , trước tiên, dữ liệu có thể cần được chuyển sang bộ đệm lớn hơn theo
đúng thứ tự rồi mới được truyền đi, điều này khơng hiệu quả. Ngồi ra, một số phiên
bản của phân tán–thu thập cung cấp tính nguyên tử, đảm bảo rằng tất cả I/O được thực
hiện mà không bị gián đoạn (và tránh làm hỏng dữ liệu nếu các luồng khác cũng đang

thực hiện I/O liên quan đến các bộ đệm đó). Khi có thể, các lập trình viên tận dụng
các tính năng I/O thu thập phân tán để tăng thơng lượng và giảm chi phí hoạt động
của hệ thống.

13.4 Hệ thống con I/O hạt nhân
Hạt nhân cung cấp nhiều dịch vụ liên quan đến I/O. Một số dịch vụ—lập lịch, tạo bộ
đệm, lưu vào bộ nhớ đệm, lưu đệm, đặt trước thiết bị và xử lý lỗi—được cung cấp bởi
hệ thống con I/O của nhân và được xây dựng trên cơ sở hạ tầng trình điều khiển
thiết bị và phần cứng. Hệ thống con I/O cũng chịu trách nhiệm bảo vệ chính nó khỏi
các quy trình sai lầm và người dùng độc hại.

13.4.1 Lập lịch I/O
Để lên lịch một tập hợp các yêu cầu I/O có nghĩa là xác định một thứ tự tốt để thực
hiện chúng. Thứ tự các ứng dụng thực hiện cuộc gọi hệ thống hiếm khi là lựa chọn
tốt nhất. Lập lịch có thể cải thiện hiệu suất tổng thể của hệ thống, có thể chia sẻ
quyền truy cập thiết bị một cách công bằng giữa các quy trình và có thể giảm thời
gian chờ trung bình để I/O hồn tất. Đây là một ví dụ đơn giản để minh họa. Giả sử
rằng một nhánh đĩa ở gần phần đầu của đĩa và ba ứng dụng đó đưa ra lệnh chặn các
cuộc gọi đọc tới đĩa đó. Ứng dụng 1 yêu cầu một khối gần cuối đĩa, ứng dụng 2 yêu
cầu một khối gần đầu và ứng dụng 3 yêu cầu một khối ở giữa đĩa. Hệ điều hành có thể
giảm khoảng cách mà tay đĩa di chuyển bằng cách phục vụ các ứng dụng theo thứ tự 2,
3, 1. Sắp xếp lại thứ tự dịch vụ theo cách này là bản chất của lập lịch I/O .
Các nhà phát triển hệ điều hành thực hiện lập lịch bằng cách duy trì hàng đợi
các yêu cầu cho từng thiết bị. Khi một ứng dụng đưa ra lệnh gọi hệ thống I/O chặn ,
yêu cầu sẽ được đặt trên hàng đợi cho thiết bị đó. I /Oscheduler sắp xếp lại thứ tự
của hàng đợi để cải thiện hiệu suất tổng thể của hệ thống và thời gian phản hồi
trung bình của các ứng dụng. Hệ điều hành cũng có thể cố gắng cơng bằng để không
một ứng dụng nào nhận được dịch vụ đặc biệt kém hoặc nó có thể cung cấp dịch vụ ưu
tiên cho các yêu cầu nhạy cảm với độ trễ. Chẳng hạn, các yêu cầu từ hệ thống con bộ
nhớ ảo có thể được ưu tiên hơn các yêu cầu ứng dụng. Một số thuật tốn lập lịch

trình cho I/O đĩa được trình bày chi tiết trong Phần 10.4.
Khi một nhân hỗ trợ I/O khơng đồng bộ, nó phải có khả năng theo dõi nhiều yêu
cầu I/O cùng một lúc. Với mục đích này, hệ điều hành có thể đính kèm hàng đợi vào
bảng trạng thái thiết bị. Hạt nhân quản lý bảng này, bảng chứa mục nhập cho mỗi
thiết bị I/O , như trong Hình 13.9.


Machine Translated by Google
13.4 Hệ thống con I/O hạt nhân

605

thiết bị: trạng thái bàn
phím: khơng hoạt động

u cầu địa chỉ

thiết bị: máy in laser trạng

máy in laser:

thái: bận

38546 chiều dài: 1372

thiết bị: trạng thái
chuột: không hoạt động

thiết bị: đơn vị đĩa 1
trạng thái: nhàn rỗi

thiết bị: đĩa đơn vị 2
trạng thái: bận

.
.
.

yêu cầu cho đơn

yêu cầu cho đơn

vị đĩa 2

vị đĩa 2

tập tin:

tập tin:

xxx hoạt động: đọc địa

yyy thao tác: ghi địa

chỉ: 43046 chiều dài:

chỉ: 03458 chiều dài:

20000

500


Hình 13.9 Bảng trạng thái thiết bị.

Mỗi mục trong bảng cho biết loại, địa chỉ và trạng thái của thiết bị (không hoạt
động, không hoạt động hoặc bận). Nếu thiết bị đang bận với một yêu cầu, loại yêu cầu
và các tham số khác sẽ được lưu trong mục nhập bảng cho thiết bị đó.
Lập lịch hoạt động I/O là một cách mà hệ thống con I/O cải thiện hiệu quả của
máy tính. Một cách khác là sử dụng không gian lưu trữ trong bộ nhớ chính hoặc trên
đĩa thơng qua bộ đệm, bộ nhớ đệm và bộ đệm.

13.4.2 Bộ đệm
Tất nhiên, bộ đệm là vùng bộ nhớ lưu trữ dữ liệu được truyền giữa hai thiết bị hoặc
giữa thiết bị và ứng dụng. Bộ đệm được thực hiện vì ba lý do. Một lý do là để đối
phó với sự khơng phù hợp về tốc độ giữa nhà sản xuất và người tiêu dùng luồng dữ
liệu. Ví dụ: giả sử rằng một tệp đang được nhận qua modem để lưu trữ trên đĩa cứng.
Modem chậm hơn khoảng một nghìn lần so với đĩa cứng. Vì vậy, một bộ đệm được tạo
trong bộ nhớ chính để tích lũy các byte nhận được từ modem. Khi toàn bộ bộ đệm dữ
liệu đã đến, bộ đệm có thể được ghi vào đĩa trong một thao tác đơn lẻ. Vì q trình
ghi đĩa khơng diễn ra tức thời và modem vẫn cần một nơi để lưu trữ dữ liệu bổ sung
đến, nên hai bộ đệm được sử dụng. Sau khi modem lấp đầy bộ đệm đầu tiên, q trình
ghi đĩa sẽ được u cầu. Sau đó, modem bắt đầu lấp đầy bộ đệm thứ hai trong khi bộ
đệm thứ nhất được ghi vào đĩa. Vào thời điểm modem đã lấp đầy bộ đệm thứ hai, quá
trình ghi đĩa từ bộ đệm thứ nhất đã hoàn tất, vì vậy modem có thể chuyển trở lại bộ
đệm thứ nhất trong khi đĩa ghi bộ đệm thứ hai. Bộ đệm đôi này tách rời nhà sản xuất
dữ liệu khỏi người tiêu dùng, do đó giảm bớt các yêu cầu về thời gian giữa chúng. Sự
cần thiết của việc tách rời này được minh họa trong Hình 13.10, trong đó liệt kê
những khác biệt rất lớn về tốc độ thiết bị đối với phần cứng máy tính điển hình.

Cách sử dụng thứ hai của bộ đệm là cung cấp khả năng thích ứng cho các thiết bị
có kích thước truyền dữ liệu khác nhau. Sự chênh lệch như vậy đặc biệt phổ biến trong

mạng máy tính, nơi bộ đệm được sử dụng rộng rãi để phân mảnh và tập hợp lại các thông
điệp. Ở bên gửi, một tin nhắn lớn bị phân mảnh


Machine Translated by Google
606

Chương 13 Hệ thống I/O

xe buýt hệ thống

HyperTransport (32 cặp)
PCI Express 2.0 ( 32)
Infniband (QDR 12X)
Nối tiếp ATA (SATA-300)

mạng Ethernet tốc độ cao

xe buýt SCSI

dây lửa

ổ đĩa cứng

modem

con chuột

bàn phím
0,00001


0,001

0,1

10

1000

100000

10E6

Hình 13.10 Tốc độ truyền thiết bị của Sun Enterprise 6000 (logarit).

thành các gói mạng nhỏ. Các gói được gửi qua mạng và bên nhận đặt chúng vào bộ
đệm tái hợp để tạo thành hình ảnh của dữ liệu nguồn.
Việc sử dụng bộ đệm thứ ba là để hỗ trợ ngữ nghĩa sao chép cho I/O của ứng dụng.

Một ví dụ sẽ làm rõ ý nghĩa của “ngữ nghĩa sao chép”. Giả sử rằng một ứng dụng
có bộ đệm dữ liệu mà nó muốn ghi vào đĩa. Nó gọi lệnh gọi hệ thống write() ,
cung cấp một con trỏ tới bộ đệm và một số nguyên chỉ định số byte cần ghi. Sau
khi lời gọi hệ thống trả về, điều gì sẽ xảy ra nếu ứng dụng thay đổi nội dung
của bộ đệm? Với ngữ nghĩa sao chép, phiên bản của dữ liệu được ghi vào đĩa được
đảm bảo là phiên bản tại thời điểm gọi hệ thống ứng dụng, không phụ thuộc vào
bất kỳ thay đổi nào sau đó trong bộ đệm của ứng dụng. Một cách đơn giản mà hệ
điều hành có thể đảm bảo ngữ nghĩa sao chép là gọi hệ thống write() để sao chép
dữ liệu ứng dụng vào bộ đệm nhân trước khi trả lại quyền điều khiển cho ứng
dụng. Ghi đĩa được thực hiện từ bộ đệm hạt nhân, do đó những thay đổi tiếp theo
đối với bộ đệm ứng dụng không có hiệu lực. Việc sao chép dữ liệu giữa các bộ

đệm hạt nhân và không gian dữ liệu ứng dụng là phổ biến trong các hệ điều hành,
mặc dù hoạt động này gây ra chi phí hoạt động do ngữ nghĩa rõ ràng. Hiệu ứng
tương tự có thể đạt được hiệu quả hơn bằng cách sử dụng khéo léo ánh xạ bộ nhớ
ảo và bảo vệ trang sao chép khi ghi.

13.4.3 Bộ nhớ đệm
Acache là một vùng bộ nhớ nhanh chứa các bản sao dữ liệu. Truy cập vào bản sao
được lưu trong bộ nhớ cache hiệu quả hơn truy cập vào bản gốc. Ví dụ, các hướng dẫn


Machine Translated by Google
13.4 Hệ thống con I/O hạt nhân

607

của quy trình hiện đang chạy được lưu trữ trên đĩa, được lưu trong bộ nhớ vật lý
và được sao chép lại trong bộ đệm chính và phụ của CPU . Sự khác biệt giữa bộ đệm
và bộ đệm là bộ đệm có thể chứa bản sao duy nhất hiện có của một mục dữ liệu,
trong khi bộ đệm, theo định nghĩa, giữ một bản sao trên bộ lưu trữ nhanh hơn của
một mục nằm ở nơi khác.
Bộ nhớ đệm và bộ đệm là các chức năng riêng biệt, nhưng đôi khi một vùng bộ
nhớ có thể được sử dụng cho cả hai mục đích. Ví dụ, để duy trì ngữ nghĩa sao chép
và để cho phép lập lịch trình I/O đĩa hiệu quả , hệ điều hành sử dụng bộ đệm trong
bộ nhớ chính để giữ dữ liệu đĩa. Các bộ đệm này cũng được sử dụng làm bộ nhớ đệm,
để cải thiện hiệu quả I/O cho các tệp được ứng dụng chia sẻ hoặc đang được ghi và
đọc lại nhanh chóng. Khi nhân nhận được một yêu cầu I/O của tệp , trước tiên, nhân
sẽ truy cập bộ nhớ đệm của bộ đệm để xem liệu vùng đó của tệp đã có sẵn trong bộ
nhớ chính hay chưa. Nếu đúng như vậy, có thể tránh hoặc trì hỗn một I/O đĩa vật
lý . Ngoài ra, việc ghi đĩa được tích lũy trong bộ nhớ đệm trong vài giây, do đó
các lần chuyển lớn được thu thập để cho phép lập lịch ghi hiệu quả. Chiến lược trì

hỗn ghi này để cải thiện hiệu quả I/O được thảo luận, trong bối cảnh truy cập tệp
từ xa, trong Phần 17.9.2.

13.4.4 Spooling và đặt trước thiết bị
Bộ đệm là bộ đệm giữ đầu ra cho một thiết bị, chẳng hạn như máy in, không thể chấp
nhận các luồng dữ liệu xen kẽ. Mặc dù một máy in chỉ có thể phục vụ một công việc
tại một thời điểm, nhưng một số ứng dụng có thể muốn in đầu ra của chúng đồng thời
mà không để đầu ra của chúng bị trộn lẫn với nhau. Hệ điều hành giải quyết vấn đề
này bằng cách chặn tất cả đầu ra của máy in. Đầu ra của mỗi ứng dụng được lưu vào
một tệp đĩa riêng. Khi một ứng dụng in xong, hệ thống đệm sẽ xếp hàng đợi tệp đệm
tương ứng để xuất ra máy in.
Hệ thống bộ đệm sao chép từng tệp một bộ đệm đã xếp hàng vào máy in. Trong một số
hệ điều hành, spooling được quản lý bởi một tiến trình daemon hệ thống. Ở những
nơi khác, nó được xử lý bởi một luồng trong nhân. Trong cả hai trường hợp, hệ điều
hành cung cấp giao diện điều khiển cho phép người dùng và quản trị viên hệ thống
hiển thị hàng đợi, loại bỏ các công việc không mong muốn trước khi in các cơng
việc đó, tạm dừng in trong khi máy in được bảo dưỡng, v.v.
Một số thiết bị, chẳng hạn như ổ băng từ và máy in, không thể ghép kênh một
cách hữu ích các yêu cầu I/O của nhiều ứng dụng đồng thời. Bộ đệm là một cách hệ
điều hành có thể phối hợp đầu ra đồng thời. Một cách khác để xử lý truy cập thiết
bị đồng thời là cung cấp các phương tiện rõ ràng để phối hợp. Một số hệ điều hành
(bao gồm cả VMS) cung cấp hỗ trợ truy cập thiết bị độc quyền bằng cách cho phép
một quy trình cấp phát thiết bị nhàn rỗi và hủy cấp phát thiết bị đó khi khơng cịn
cần thiết. Các hệ điều hành khác thực thi giới hạn một trình xử lý tệp đang mở cho
một thiết bị như vậy. Nhiều hệ điều hành cung cấp các chức năng cho phép các quy
trình phối hợp truy cập độc quyền với nhau. Chẳng hạn, Windows cung cấp các cuộc
gọi hệ thống để đợi cho đến khi một đối tượng thiết bị khả dụng. Nó cũng có một
tham số cho cuộc gọi hệ thống OpenFile() tuyên bố các loại quyền truy cập được
phép đối với các luồng đồng thời khác. Trên các hệ thống này, việc tránh bế tắc là
tùy thuộc vào các ứng dụng.


13.4.5 Xử lý lỗi
Một hệ điều hành sử dụng bộ nhớ được bảo vệ có thể bảo vệ chống lại nhiều loại lỗi
phần cứng và ứng dụng, do đó, lỗi tồn bộ hệ thống có thể xảy ra.


Machine Translated by Google
608

Chương 13 Hệ thống I/O

không phải là kết quả thông thường của mỗi trục trặc cơ học nhỏ. Truyền thiết bị và
I/O có thể khơng thành cơng theo nhiều cách, vì lý do tạm thời, chẳng hạn như khi
mạng trở nên quá tải hoặc vì lý do "vĩnh viễn", chẳng hạn như khi bộ điều khiển đĩa
bị lỗi. Các hệ điều hành thường có thể bù đắp hiệu quả cho các lỗi tạm thời. Chẳng
hạn, lỗi đọc() của đĩa dẫn đến thử lại đọc() và lỗi gửi mạng () dẫn đến gửi lại(),
nếu giao thức chỉ định như vậy.
Thật không may, nếu một thành phần quan trọng gặp lỗi vĩnh viễn, hệ điều hành sẽ
không thể phục hồi.
Theo nguyên tắc chung, một cuộc gọi hệ thống I/O sẽ trả về một bit thông tin về
trạng thái của cuộc gọi, biểu thị thành công hay thất bại. Trong hệ điều hành UNIX ,
một biến số nguyên bổ sung có tên errno được sử dụng để trả về mã lỗi—một trong số
khoảng một trăm giá trị—cho biết bản chất chung của lỗi (ví dụ: đối số nằm ngồi
phạm vi, con trỏ hỏng hoặc tệp không mở được ). Ngược lại, một số phần cứng có thể
cung cấp thơng tin lỗi rất chi tiết, mặc dù nhiều hệ điều hành hiện tại không được
thiết kế để truyền tải thông tin này đến ứng dụng. Chẳng hạn, một lỗi của thiết bị
SCSI được giao thức SCSI báo cáo theo ba cấp độ chi tiết: một khóa cảm nhận xác định
bản chất chung của lỗi, chẳng hạn như lỗi phần cứng hoặc yêu cầu bất hợp pháp; một
mã cảm giác bổ sung cho biết loại lỗi, chẳng hạn như tham số lệnh không hợp lệ hoặc
lỗi tự kiểm tra; và một bộ định tính mã giác quan bổ sung cung cấp nhiều chi tiết

hơn, chẳng hạn như tham số lệnh nào bị lỗi hoặc hệ thống con phần cứng nào không tự
kiểm tra được. Hơn nữa, nhiều thiết bị SCSI duy trì các trang nội bộ của thông tin
nhật ký lỗi mà máy chủ có thể yêu cầu—nhưng hiếm khi như vậy.

13.4.6 Bảo vệ I/O

Lỗi có liên quan chặt chẽ đến vấn đề bảo vệ. Một tiến trình người dùng có thể vơ
tình hoặc cố ý làm gián đoạn hoạt động bình thường của một hệ thống bằng cách cố
gắng đưa ra các hướng dẫn I/O bất hợp pháp . Chúng ta có thể sử dụng các cơ chế khác
nhau để đảm bảo rằng sự gián đoạn như vậy không thể xảy ra trong hệ thống.
Để ngăn người dùng thực hiện I/O bất hợp pháp, chúng tôi xác định tất cả các
hướng dẫn I/O là hướng dẫn đặc quyền. Do đó, người dùng không thể đưa ra các hướng
dẫn I/O trực tiếp; họ phải làm điều đó thơng qua hệ điều hành. Để thực hiện I/O, một
chương trình người dùng thực hiện một lệnh gọi hệ thống để yêu cầu hệ điều hành thực
hiện I/O thay cho nó (Hình 13.11). Hệ điều hành, thực thi trong chế độ giám sát,
kiểm tra xem u cầu có hợp lệ khơng và nếu có, I/O có được u cầu hay khơng. Hệ
điều hành sau đó trả lại cho người dùng.
Ngồi ra, mọi vị trí bộ nhớ được ánh xạ bộ nhớ và cổng I/O phải được bảo vệ khỏi
sự truy cập của người dùng bởi hệ thống bảo vệ bộ nhớ. Lưu ý rằng kernel không thể
đơn giản từ chối tất cả quyền truy cập của người dùng. Ví dụ: hầu hết các trị chơi
đồ họa và phần mềm chỉnh sửa và phát lại video đều cần truy cập trực tiếp vào bộ
nhớ bộ điều khiển đồ họa được ánh xạ bộ nhớ để tăng tốc hiệu suất của đồ họa. Trong
trường hợp này, hạt nhân có thể cung cấp một cơ chế khóa để cho phép một phần bộ
nhớ đồ họa (đại diện cho một cửa sổ trên màn hình) được phân bổ cho một quy trình
tại một thời điểm.
13.4.7 Cấu trúc dữ liệu hạt nhân

Hạt nhân cần giữ thông tin trạng thái về việc sử dụng các thành phần I/O .
Nó làm như vậy thông qua nhiều cấu trúc dữ liệu trong nhân, chẳng hạn như tệp mở



Machine Translated by Google
13.4 Hệ thống con I/O hạt nhân

609

nhân

trường hợp n


1

bẫy để
theo dõi



2



đọc

thực hiện I/O






3
trả lại





cho người dùng

người sử dụng

cuộc gọi hệ thống n





chương trình

Hình 13.11 Sử dụng lời gọi hệ thống để thực hiện I/O.

cấu trúc bảng từ Mục 12.1. Nhân sử dụng nhiều cấu trúc tương tự để theo dõi các kết
nối mạng, giao tiếp thiết bị-ký tự và các hoạt động I/O khác .
UNIX cung cấp quyền truy cập hệ thống tệp cho nhiều thực thể khác nhau, chẳng
hạn như tệp người dùng, thiết bị thô và khơng gian địa chỉ của các quy trình. Mặc
dù mỗi thực thể này đều hỗ trợ thao tác read() , nhưng ngữ nghĩa lại khác nhau.
Chẳng hạn, để đọc tệp người dùng, hạt nhân cần thăm dò bộ nhớ cache của bộ đệm
trước khi quyết định có thực hiện I/O đĩa hay không. Để đọc một đĩa thô, nhân cần
đảm bảo rằng kích thước yêu cầu là bội số của kích thước khu vực đĩa và được căn
chỉnh trên một ranh giới khu vực. Để đọc một hình ảnh quá trình, chỉ cần sao chép

dữ liệu từ bộ nhớ. UNIX gói gọn những khác biệt này trong một cấu trúc thống nhất
bằng cách sử dụng một kỹ thuật hướng đối tượng. Bản ghi tệp mở, như trong Hình
13.12, chứa một bảng điều phối chứa các con trỏ tới các thường trình thích hợp, tùy
thuộc vào loại tệp.
Một số hệ điều hành sử dụng các phương pháp hướng đối tượng thậm chí cịn rộng rãi hơn.
Chẳng hạn, Windows sử dụng triển khai chuyển thông báo cho I/O.

Một yêu cầu I/O được chuyển đổi thành một thông báo được gửi qua nhân tới trình
quản lý I/O rồi tới trình điều khiển thiết bị, mỗi trình điều khiển trong số đó có
thể thay đổi nội dung thông báo. Đối với đầu ra, thông báo chứa dữ liệu sẽ được
ghi. Đối với đầu vào, thông báo chứa bộ đệm để nhận dữ liệu. Cách tiếp cận truyền
thơng báo có thể thêm chi phí hoạt động, bằng cách so sánh với các kỹ thuật thủ tục
sử dụng cấu trúc dữ liệu dùng chung, nhưng nó đơn giản hóa cấu trúc và thiết kế của
hệ thống I/O và thêm tính linh hoạt.


Machine Translated by Google
610

Chương 13 Hệ thống I/O

bảng tệp mở toàn hệ thống
bảng inode
hoạt động

bản ghi hệ thống tập tin

con trỏ inode
con trỏ hàm đọc và ghi con trỏ
hàm chọn con trỏ hàm ioctl con

bảng tệp mở
bộ mô tả tập tin

cho mỗi q trình

trỏ hàm đóng hàm



bản ghi mạng (ổ cắm)

bộ nhớ tiến trình người dùng

bảng
thơng tin
mạng

con trỏ tới thơng tin
mạng con trỏ để đọc và ghi hàm con
trỏ để chọn hàm con trỏ tới hàm
ioctl con trỏ để đóng hàm




bộ nhớ hạt nhân

Hình 13.12 Cấu trúc nhân UNIX I/O.

13.4.8 Tóm tắt hệ thống con I/O hạt nhân

Tóm lại, hệ thống con I/O điều phối một bộ sưu tập mở rộng các dịch vụ có sẵn cho các ứng dụng
và các phần khác của nhân. Hệ thống con I/O giám sát các thủ tục này:

• Quản lý khơng gian tên cho tệp và thiết bị
• Kiểm sốt truy cập vào tệp và thiết bị

• Kiểm sốt hoạt động (ví dụ: modem khơng thể tìm kiếm()) • Phân bổ khơng
gian hệ thống tệp
• Phân bổ thiết bị
• Bộ nhớ đệm, bộ nhớ đệm và bộ đệm • Lập
lịch trình I/O • Theo dõi trạng thái thiết
bị, xử lý lỗi và khôi phục lỗi • Khởi tạo và cấu hình trình điều khiển thiết bị

Các cấp cao hơn của thiết bị truy cập hệ thống con I/O thông qua giao diện thống nhất được
cung cấp bởi trình điều khiển thiết bị.


Machine Translated by Google
13.5 Chuyển đổi Yêu cầu I/O thành Hoạt động của Phần cứng

611

13.5 Chuyển đổi Yêu cầu I/O thành Hoạt động của Phần cứng
Trước đó, chúng tơi đã mơ tả q trình bắt tay giữa trình điều khiển thiết bị và bộ điều khiển
thiết bị, nhưng chúng tôi khơng giải thích cách hệ điều hành kết nối u cầu ứng dụng với một
bộ dây mạng hoặc với một cung đĩa cụ thể.
Ví dụ, hãy xem xét việc đọc một tệp từ đĩa. Ứng dụng đề cập đến dữ liệu bằng một tên tệp.
Trong một đĩa, hệ thống tệp ánh xạ từ tên tệp qua các thư mục hệ thống tệp để lấy phân bổ
không gian của tệp. Chẳng hạn, trong MS-DOS, tên ánh xạ tới một số biểu thị một mục trong bảng
truy cập tệp và mục trong bảng đó cho biết khối đĩa nào được phân bổ cho tệp. Trong UNIX, tên

ánh xạ tới một số inode và inode tương ứng chứa thông tin phân bổ không gian. Nhưng kết nối
được tạo từ tên tệp đến bộ điều khiển đĩa (địa chỉ cổng phần cứng hoặc các thanh ghi bộ điều
khiển ánh xạ bộ nhớ) được thực hiện như thế nào?

Một phương pháp được sử dụng bởi MS-DOS, một hệ điều hành tương đối đơn giản.
Phần đầu tiên của tên tệp MS-DOS , trước dấu hai chấm, là một chuỗi xác định một thiết bị phần
cứng cụ thể. Ví dụ: C: là phần đầu tiên của mọi tên tệp trên đĩa cứng chính. Thực tế là C: đại
diện cho đĩa cứng chính được tích hợp trong hệ điều hành; C: được ánh xạ tới một địa chỉ cổng
cụ thể thông qua bảng thiết bị. Do dấu hai chấm, không gian tên thiết bị tách biệt với không
gian tên hệ thống tệp. Sự tách biệt này giúp hệ điều hành dễ dàng liên kết chức năng bổ sung
với từng thiết bị. Chẳng hạn, thật dễ dàng để gọi spooling trên bất kỳ tệp nào được ghi vào
máy in.
Thay vào đó, nếu khơng gian tên thiết bị được kết hợp trong không gian tên hệ thống tệp
thông thường, giống như trong UNIX, thì các dịch vụ tên hệ thống tệp thông thường sẽ được cung
cấp tự động. Nếu hệ thống tệp cung cấp quyền sở hữu và quyền kiểm sốt truy cập đối với tất cả
các tên tệp thì thiết bị có quyền sở hữu và quyền kiểm sốt quyền truy cập. Do các tệp được
lưu trữ trên thiết bị nên giao diện như vậy cung cấp quyền truy cập vào hệ thống I/O ở hai cấp độ.
Tên có thể được sử dụng để truy cập chính thiết bị hoặc để truy cập tệp được lưu trữ trên thiết bị.

UNIX đại diện cho tên thiết bị trong không gian tên hệ thống tệp thông thường. Không giống
như tên tệp MS-DOS , có dấu phân cách dấu hai chấm, tên đường dẫn UNIX khơng có phần tách biệt
rõ ràng của phần thiết bị. Trên thực tế, khơng có phần nào của tên đường dẫn là tên của thiết
bị. UNIX có một bảng gắn kết liên kết tiền tố của tên đường dẫn với tên thiết bị cụ thể. Để
giải quyết một tên đường dẫn, UNIX tra cứu tên trong bảng gắn kết để tìm tiền tố phù hợp dài
nhất; mục tương ứng trong bảng gắn kết cung cấp tên thiết bị. Tên thiết bị này cũng có dạng
tên trong khơng gian tên hệ thống tệp. Khi UNIX tra cứu tên này trong cấu trúc thư mục hệ
thống tệp, nó khơng tìm thấy số inode mà là số thiết bị <chính, phụ> . Số thiết bị chính xác
định trình điều khiển thiết bị sẽ được gọi để xử lý I/O cho thiết bị này. Số thiết bị phụ được
chuyển đến trình điều khiển thiết bị để lập chỉ mục vào bảng thiết bị. Mục nhập bảng thiết bị
tương ứng cung cấp địa chỉ cổng hoặc địa chỉ ánh xạ bộ nhớ của bộ điều khiển thiết bị.


Các hệ điều hành hiện đại có được tính linh hoạt đáng kể từ nhiều giai đoạn của bảng tra
cứu trong đường dẫn giữa yêu cầu và bộ điều khiển thiết bị vật lý. Các cơ chế chuyển yêu cầu
giữa các ứng dụng và trình điều khiển là chung. Do đó, chúng ta có thể đưa các thiết bị và
trình điều khiển mới vào máy tính mà khơng cần biên dịch lại kernel. Trên thực tế, một số hệ
điều hành có khả năng tải trình điều khiển thiết bị theo yêu cầu. Lúc khởi động, hệ thống


×