Giáo trình Hệ điều hành - Chương 5: Quản lý vào ra

CHƯƠNG 5. QUẢN LÝ VÀO RA  
5.0. Mở đầu  
Khả năng hiệu suất của một hệ thống máy tính không chỉ phụ thuộc vào kiểu  
bộ vi xử lý và bề rộng từ (16, 32 hay 64 Bit), đặt biệt còn phụ thuộc một cách thực  
chất vào tốc độ, với nó, các dữ liệu thể được dịch chuyển giữa các thiết bị  
vào - ra (kiểu bộ nhớ quảng đại, kiểu kết nối mạng...) hệ thống bộ nhớ chính -  
bộ vi xử lý. các ứng dụng khoa học thuần tuý, khả năng tính toán có thể đạt tới  
hàng triệu phép tính dấu phẩy động. Trong sự khác biệt với điều đó, các yêu cầu  
của các thiết bị tính toán thông thường thì bao gồm một sự pha trộn muôn màu  
muôn vẻ các kiểu chương trình khác nhau: các thành phần tính toán, các ứng dụng  
về ngân hàng dữ liệu, các nhiệm vụ quản lý... Cho nên, tỷ suất các chương trình  
(benchmark programms) áp dụng những nhiệm vụ việc sửa chữa lỗi của chúng  
được xác định một cách mạnh mẽ bởi một hệ thống gồm bộ vi xử lý, bộ nhớ chính,  
bộ nhớ quảng đại cấu trúc vận chuyển dữ liệu.  
Theo đó, việc đưa vào-ra các dữ liệu đóng vai trò rất quan trọng. Từ đó, chúng  
ta coi trọng và quan tâm tới cấu trúc vào-ra của các hệ điều hành. Cụ thể, vấn đề  
này đã được nghiên cứu ở các chương trước; ở chương này, chúng ta sẽ tiếp tục  
khảo sát điều này một cách kỷ lưỡng hơn.  
5.1. Phân loại nhiệm vụ  
Trước đây, trong các hệ điều hành, những quan hệ qua lại giữa chương trình  
người sử dụng và các thiết bị xuất-nhập rất khăng khít; mỗi người lập trình ứng  
dụng đã biên soạn cho mình một hệ thống tệp tin hiệu quả để gia tăng dòng dữ liệu  
giữa các ứng dụng của anh ta và các thiết bị ngoại vi. Tuy nhiên, phương pháp này  
không chỉ dẫn tới mỗi dòng dữ liệu một chương trình hướng thiết bị riêng, mà  
còn dẫn tới các lỗi và các sự lẫn lộn khi nhiều chương trình muốn truy cập lên một  
thiết bị như nhau. Vì có điều đó xảy ra, nên hệ thống đa người sử dụng làm việc  
rất ì ạch; để giải quyết vấn đề này, khi đó, các thành phần chương trình kiểu thiết  
bị được tách chia ra hay được tích hợp lại thành các đơn thể riêng lẻ, gọi là các bộ  
kích tạo của hệ điều hành (operating-system-driver). Điều này không chỉ yêu cầu  
di chuyển một chương trình ra khỏi các cấu trúc máy tính khác nhau trợ giúp để  
phòng tránh các lỗi, đặt biệt còn tiết kiệm sức lực cho người lập trình ứng  
dụng.  
Nhiệm vụ cơ bán của một bộ kích tạo (driver) ở chỗ phải bao quát tất cả các  
bước khởi xướng của thiết bị và các cơ chế chuyển đổi dữ liệu trước chương trình  
ứng dụng (sau một giao diện của hệ điều hành). Với các quan niệm đã được đề cập  
ở chương 1, bộ kích tạo chính là một máy ảo; được dùng làm cầu nối trung gian  
giữa hệ điều hành máy vật lý,  
Các nhiệm vụ của bộ kích tạo thì bị giới hạn bởi việc khởi xướng các cấu trúc  
dữ liệu và các thiết bị như việc viết hay đọc các dữ liệu. Thêm vào đó, còn có  
những nhiêmh vụ mà chúng chỉ thể thực hiện cùng với hệ điều hành, đó là:  
Việc chuyển đổi mô hình lập trình logic tới các yêu cầu thiết bị chuyên  
dụng;  
Việc chỉnh lý các tiến trình đọc hay viết đối với thiết bị;  
Việc phối hợp các thiết bị khác nhau thành các kiểu giống nhau;  
Việc ghi chéo các dữ liệu dự trữ vào buffer...  
Người ta có thể tổng hợp các nhiệm vụ bổ sung vào trong một lớp phần mềm,  
do đó, nói chung, nhiều lớp của các máy ảo hay bộ kích tạo nằm giữa tiến trình  
người sử dụng và máy vật lý. Hình 5.1 minh hoạ điều này.  
Trạng thái NSD  
Tiến trình NSD  
Trạng thái nhân Bộ phân bổ nhân  
Quản lý dãy tuần tự  
Ghi vào bộ đệm  
Bộ kích tạo  
Bộ điều khiển  
Thiết bị  
Hình 5.1. Các lớp cơ bản của quản thiết bị  
Việc giới thiệu các phân lớp cho phép dẫn vào những nhiệm vụ bổ sung cho  
việc sử dữ liệu ở dạng các lớp đặc biệt thành dãy trình tự xử lý. Thí dụ, bộ kích  
tạo ổ đĩa coi ổ đĩa như một thiết bị nhớ địa chỉ nhớ của được xác định  
nhờ nhiều thông số khác nhau như ổ đĩa, số sector, số đĩa từ... chuyển đổi các  
yêu cầu đọc /viết thành các địa chỉ logic của bộ nhớ ổ đĩa, các yêu cầu này xuất  
phát từ một kiểu tuyến tính đơn giản của [0..N] địa chỉ bộ nhớ. Bấy giờ, người ta  
đặt thêm một bộ kích tạo cho việc chuyển đổi một địa chỉ logic thành một địa chỉ  
vậ lý. Tức là khi đó, một bộ kích tạo tệp tin sẽ thực hiện việc chuyển đổi một địa  
chỉ logic tương đối ở trong một tệp tin thành địa chỉ logic tuyệt đối của thiết bị bộ  
nhớ, mà trên đó tệp tin tồn tại.  
5.1.1. Các lớp xử lý I/O Unix.  
Nguyên tắc phân lớp của nhã hệ điều hành Unix được trình bày như trên hình  
1.6 trong chương đầu. Ơ đây, với các lớp bổ sungm hệ thống lưu thông của hệ  
điều hành Unix ấn bản System V có điều kiện để kết hợp các bước xử lý khác  
nhau thành quá trình xử lý; chức năng này của hệ điều hành gọi bộ kích tạo  
(driver) của hệ điều hành. Hình 5.2 chỉ ra hệ thống lưu thông tín hiệu ở trong hệ  
điều hành Unix.  
Hình 5.2 trang 184.  
hình 5.2(a) cho thấy, khi thiết bị hướng tự , thì bộ kích tạo nhận dạng  
tự đặc biệt bị đẩy vào lộ trình xử (processing route); lộ trình này nhận biết  
các chữ cái đặc biệt; các chữ cái này dịch vụ với tư cách là các lệnh (thí dụ: FEL  
để xoá chữ cái cuối cùng, Control-C để bẻ gãy tiến trình đang xảy ra...); ngoài ra,  
lộ trình này còn nhận biết các ký hiệu đặc biệt (thí dụ: 6ký tự trống cho một TAB  
tự...) tạo ra những hoạt động thích hợp.  
Một giao diện nguyên (raw interface) cho phép gởi đi hay đón nhận các ký  
tự một cách trực tiếp mà không cần xử lý cao hơn dòng ký tự (tức là không cần tới  
các lệnh ECHO hay Control-C). Lộ trình này còn đặc biệt hữu ích đối với việc kết  
nối các dữ liệu giữa máy tính với những mục đíchtrao đổi dữ liệu, ở đây, tất cả  
các ký tự được bao hàm như các dữ liệu, mà không phải là các chữ cái hay tín hiệu  
điều khiển.  
5.1.2. Các lớp xử lý I/O của Windows NT.  
Việc phân lớp ở trong Windows NT thì năng động phụ thuộc vào việc dịch  
vụ hệ thống. Hình 5.3 chỉ ra: bên trái là sự phân lớp đơn giản cho các thiết bị nối  
tiếp, còn bên phải đa lớp cho bộ nhớ quảng đại.  
Bộ kích tạo hệ thống tệp tin (file-system-driver):  
Tất cả các gọi hệ thống đối với việc xuất-nhập được bó gói và được chuyển đi  
tới quản lý I/O để chuyển đổi thành dạng một gói yêu cầu I/O (I/O reagest  
package:IRP). Mỗi một trong các gói chuyển đổi này chứa đựng các địa chỉ người  
nhận này chứa đựng các địa chỉ người nhận cũng như không gian dữ liệu (data-  
space);cho nên, thông tin trong một lớp dịch chuyển từ trên xuống dưới tới tiến  
trình người sử dụng và thông báo kết quả trở lại. thế, nhiều trạng thái và nhiều  
lớp sẽ đi qua. Ngoài ra, sự tồn tại của bộ kích tạo thật năng động: Trong sự khác  
biệt cới hệ điều hành Unix, ở đây, trong khi điều hành, người ta có thể đưa vào  
hay lấy đi một bộ kích tạo theo ý muốn để điền đầy những nhiêmh vụ xác định.  
Trạng thái NSD  
Trạng thái nhân  
Tiến trình NSD  
Tiến trình NSD  
Bộ phân bổ nhân  
Điều hành I/O  
Bộ phân bổ nhân  
Cache/Điều hành I/O  
Bộ kích tạo  
Bộ kích tạo HT tệp tin  
Các thiết bị Monitor,  
Printer, Keyboard,  
Mouse.  
Cache/Điều hành I/O  
Bộ kích tạo thiết bị  
Các thiết bị CD-Rom, đĩa  
cứng,đĩa mềm, băng từ  
Hình 5.3. Sự phân lớp đơn giản đa cấp ở hệ điều hành Windows NT  
Bộ kích tạo với ảnh xạ các cluster hư hỏng.  
việc quản tệp tin vẫn do tự bộ kích tạo điều khiển, do đó, trong hệ thống  
Windows NT nhiều hệ thống tệp tin có thể tồn tại song song với nhiều bộ kích tạo.  
Thật vật, người ta thấy rằng, đối với mỗi hệ thống các tệp tin cho các hệ điều hành  
khác nhau (Windows NT, OS/2 hay MS-DOS) đều một bộ kích tạo riêng. Tất  
cả các tác vụ truy cập đối với các hệ thống tệp tin thì được thực thi như những  
phương pháp của một bộ kích tạo hệ thống tệp tin. Chúng phân biệt không chỉ ở  
các cấu trúc dữ liệu hiệu suất dịch vụ (nghĩa là chúng tạo ra những cái đó với sự  
trợ giúp của bộ kích tạo thiết bị trên bộ nhớ quảng đại), mà còn ở sự phản ứng  
trước các lỗi xuất hiện. nếu thí dụ ở trong bảng FAT của MS-DOS hay trong hệ  
thống tệp tin của OS/2 xuất hiện các lỗi không thể sửa được vì các đơn vị bộ nhớ  
sai hỏng (tức là các block hay các cluster bị sai hỏng), thì do đó, khi có lỗi, Bit hư  
hỏng (corrupted-bit) được thiết lập. Muốn sử dụng các tệp tin trên clucter hư hỏng  
này, người ta phải tiến hành kiểm tra sửa chữa bằng một chương trình trợ giúp  
(check disk) được gọi với lệnh chkdsk: với chương trình này, các tệp tin nói trên  
được điền vào hệ thống tệp tin bộ nhứo quảng đại, cụ thể các đơn vị bộ nhớ phù  
hợp điền vào bảng bad clucter mapping, và do đó, cluster hư hỏng bị lloại ra khỏi  
các ứng dụng tiếp theo.  
Ngược lại, ở hệ thống tệp tin Windows, điều này được thực hiện một cách năng  
động. Thật vậy, việc sắp xếp các cluster ảo thành các cluster logic được điều chỉnh  
thích hợp; các loại cluter này cũng đã được nói tới trong mục 4.5 trên. Bây giờ,  
chúng ta khảo sát một thí dụ ở hình 5.4, ở đây một cluter đã bị khuyết tật,nó không  
thể được bộ kích tạo thiết bị kiến lập thành những đơn vị lưu trữ (reserved-  
unit).  
hình 5.4 trang 186  
Cuối cùng, nếu không còn phần dư thừa của bộ nhớ quảng đại cũng không  
thể bản sao bảo vệ tồn tại, khi đó, một thông báo lỗi “Read/Write Error” được  
đưa ra trên màn hình.  
Đối với hệ thống tệp tin Windows NT, nếu không có cluster còn trống thể  
sử dụng được, do đó, một nguyên tắc, Bit bị hỏng của đĩa từ sẽ được kiến lập; và  
khi thực hiện, một chương trình kiểm tra sửa chữa (chkdsk) được tiến hành một  
cách tự động.  
Nếu các dữ liệu của cluster hỏng không thể phục hồi được cũng không còn  
cluster thay thế, do đó, ngoài ra, tại mỗi lần vào-ra trên cluster này, một thông báo  
lỗi “Warning Eorror” được đưa tới người điều hành hay người sử dụng, bấy giờ, vì  
không còn dữ liệu khả dụng nên độ lệch lỗi không tồn tại nội dung của cluster  
hư hỏng phải được khai khẩn khi đọc từ bản sao.  
5.2. Các mô hình thiết bị  
Sự phát triển của bộ kích tạo (driver) đối với một hệ điều hành được quyết định  
bởi tính chất của các thiết bị vật lý, tức là chúng phải tạo lập nên các tính chất mà  
hệ điều hành mong đợi. Điều đó rất cần thiết, nó làm cho người lập trình hiểu  
nhiều hơn về thiết bị. rất nhiều thiết bị đặc điểm giống nhau, do đó, nó có lợi  
cho việc nghiên cứu các kiểu dáng để hiểu sâu sắc các thông số đặc trưng.  
Thật vậy, chúng ta có thể phân biệt một cách thô thiển giữa hai loại thiết bị:  
các thiết bị sử dụng các thông tin định vị với việc truy cập tuỳ chọn thiết bị với  
sự chuyển đổi dữ liệu nối tiếp mà không cần thông tin địa chỉ.  
Bây giờ, chúng ta nghiên cứu bộ nhớ ổ đĩa từ đại diện cho nhóm thiết bị tuỳ  
chọn.  
5.2.1. Bộ nhớ ổ đĩa từ  
Bộ nhớ đĩa từ bao gồm một đĩa bằng nhôm được phủ một lớp mỏng bột ôxyt  
sắt. Trên một thanh kim loại mảnh gắn một đầu từ để đọc/viết, đĩa được  
quay tròn quanh một trục. Đầu từ thể làm nhiễm bột từ trên các vòng hình  
xuyến (track) của đĩa, khi đó gọi là quá trình viết. Ngược lại, khi trượt qua đầu tự  
một cách khác nhau, lớp bột từ làm kích thích cảm ứng ở trong cuộn dây đầu từ,  
khi đó gọi là quá trình đọc. Khi đọc, các thông tin được định hình bằng từ tính,  
mỗi sự thay đổi cảm biến được thông dịch thành các Bit, do đó, trên mỗi vòng  
xuyến của đĩa từ, một dãy tuần tự các Bit được lưu trữ. một vòng xuyến thể  
lưu trữ rất nhiều thồng tin, vì vật, người ta chia nhỏ vòng xuyến thành nhiều phần  
độ lớn khác nhau, mỗi phần gọi một sector.  
Bây giờ, người ta còn điều khiển thanh kim loại gắn đầu từ di chuyển trên  
đĩa từ (đĩa cứng) từ tâm ra mép biên hay ngược lại: để đọc viết được trên nhiều  
vòng xuyến khác nhau.  
Mô hình cơ bản của một bộ nhớ đĩa từ thì bao giừo cũng giống nhau. Ngoài  
việc phủ trên bề mặt đĩa một lớp bột ôxyt sắt (đĩa cứng), người ta còn phủ một lớp  
bột ôxyt crôm (đĩa CD-ROM) hay tráng một lớp môi trường quang hoạt tính (đĩa  
ĐV), người ta còn chế tạo đĩa từ bằng chất dẻo phủ bột từ (đĩa mềm).  
Tất nhiên, người ta có thể sắp xếp nhiều đĩa từ với nhau từ trên xuống dưới với  
mỗi mặt đĩa bố trí một đầu từ đọc/viết (read/write head).  
hình 5.6 trang187  
Nếu nhiều đĩa từ được lắp chồng lên nhau cùng theo một trục quay, do đó,  
bằng kết cấu cơ khí, các đầu từ cũng được chuyển động theo mong muốn. Ở trên  
các đĩa từ khác nhau trong hệ , tất cả các đầu từ luôn luôn cùng trên một vòng  
xuyến số nhóm giống nhau thì trên nhau và tạo thành một vỏ hình trụ ảnh ảo  
(xem hình 5.6). Các vòng xuyến số điều khiển giống nhau được biểu thị một  
nhóm hình trụ (cylinder group).  
Ở phần cấu tạo, một đầu từ phải được dịch chuyển một cách cơ học để đọc hết  
trọn một vòng xuyến. Nếu người ta muốn đặt chính xác ở giữa hình xuyến để nhận  
biết điểm bắt đầu của vòng xuyến và các khoảng chia của vòng xuyến, do đó,  
ngoài ra còn có những thông tin trợ giúp như các kích thích đều đặn hay các thông  
tin hiệu chuẩn đặt biệt thì cũng rất cần thiết. Đối với người lập trình, các thông số  
sau đây của mô hình cấu tạo đĩa từ rất quan trọng:  
Thời gian truy cập trung bình ts còn gọi thời gian tòm kiếm trung bình  
(averrage seek time) cho một vòng xuyến: khoảng 810ms cho ổ đĩa cứng, khoảng  
100ms cho ổ đĩa CD-ROM, khoảng 250ms cho ổ đĩa mềm...  
Khi tốc độ quay là cố định, người ta phải chờ đợi trên vòng xuyến một  
khoảng thời gian xác định tD, gọi thời gian quay trễ (rotational delay time), cho  
tới khi đạt được một sector mong muốn xuất hiện dưới đầu từ. Trong trường hợp  
xấu nhất, đó thời gian trễ cho một vòng quay tR.  
Tốc độ vận chuyển lớn nhất còn gọi tỷ phần vận chuyển dữ liệu H, nó  
phụ thuộc vào mật độ từ tính của đĩa từ trên một đơn vị chiều dài của vòng xuyến  
(thứ nguyên của mật độ từ tính: Bit/mm).  
Do vậy, các bộ nhớ đĩa từ gia tăng dung lượng lưu trữ một cách tuyến tính khi  
thời gian truy cập như nhau. Ngược lại, khi các vòng xuyến gia tăng dung lượng,  
người ta nhận thấy: để truy cập một dung lượng như nhau, với vòng xuyến có bán  
kính nhỏ thì đầu từ truy cập một thời gian ít hơn khi truy cập trên vòng xuyến có  
bán kính lớn hơn. Trường hợp đặc biệt, khi trên mỗi vòng xuyến một đầu từ,  
khi đó không có chuyển động đầu từ xảy ra nữa (fixed head disk).  
Mô hình nói trên của việc truy cập đĩa cứng đòi hỏi phải đáp ứng những nhu  
cầu thiết yếu sau đây: nhu cầu về thời gian truy cập trung bình ts thời gian để  
đầu từ chuyển động tới đúng vòng xuyến (track) cần tìm; nhu cầu về thời gian  
quay trễ tD thời gian để đầu từ tìm thấy đúng sector cần tìm; và nhu cầu về thời  
gian tT để vận chuyển dữ liệu (data tranfer time). Việc làm trễ quá trình truy cập  
trên đĩa từ có 3 nguyên nhân chủ yếu:  
- Do chất lượng cơ cấu cơ khí của đầu từ;  
- Do tốc độ quay của đĩa từ chiều dài (đường kính) khác nhau của track;  
- Do dung lượng mật độ thông tin trên một track (thí dụ mỗi track cùng  
được nạp một dung lượng m Byte).  
Nếu gọi k là dung lượng của dữ liệu cần truy cập giả sử thời gian quay trễ  
để tìn đúng sector ts bằng một nửa thời gian quay trọn một vòng xuyến tR:  
TD= tR/2  
(5.1)  
Khi đó thời gian truy cập tổng cộng T được thiết lập bằng biểu thức:  
T= tS + tR/2 + (k/m).tR  
(5.2)  
Từ biểu thức (5.2), ta nhận thấy T biến thiên tuyến tính theo k. Khi đó tỷ phần  
vận chuyển dữ liệu H được xác định:  
H= k/tT  
(5.3)  
Với biểu thức (5.3), ta có nhận xét: H và tT đều những đại lượng phụ thuộc  
vào k; tuỳ theo cấu hình của hệ thống mà tT và k sẽ một quan hệ nào đó; do đó,  
H là một hàm phi tuyến, nó không biến thiên tỷ lệ thuận với k. Để giải quyết vấn  
đề này của hệ điều hành, một đơn vị bộ nhớ (có thể độ lớn 1 sector, 1 block  
hay 1 page) được trợ giúp để chuyển dịch tới bước hoạt động nhân tử, điều đó  
được yêu cầu do sự tối ưu hoá khả năng sử dụng bộ nhớ chính qua các bảng trang  
(xem mục 3.3.6). Đáng tiếc, độ lớn tệp tin trung bình nằm ở giá trị 1kByte. Do đó  
việc sử dụng dung lượng bộ nhớ bị giảm xuống một cách mạnh mẽ, khi nếu độ lớn  
trang thay đổi quá độ lớn 1kByte của tệp tin; vì thế, người ta phải từ bỏ việc gia  
tăng tốc độ chuyển vận dữ liệu qua việc gia tăng độ lớn trang.  
Ngoài ra còn tồn tại một vấn đề mữa về mô hình đĩa từ, đó là: tất cả các track  
(vòng xuyến) của đĩa từ chiều dài khác nhau. Nếu bây giờ, mật độ từ tính và số  
Bit trên một đơn vị mm2 của bề mặt đĩa từ như nhau khắp nơi, do đó, mỗi track  
một số lượng Bit khác nhau: số Bit của track có bán kính nhỏ thì ít hơn số Bit  
của track có bán kính lớn. Nhưng thời gian quay một vòng của các track có bán  
kính khác nhau là như nhau. Cho nên, tại mỗi track, chúng ta có một tỷ phần dữ  
liệu khác nhau (Bist/sec). Đối với nghành công nghệ thông tin, điều này được mô  
phỏng thêm một vấn đề: nhịp Bit đối với mỗi track cũng như đối với phần mềm  
của bộ kích tạo (driver) phải được định nghĩa một cách khác thường, bởi lẽ, số  
lượng các đơn vị bộ nhớ (sector) trên mỗi track là khác nhau.  
Đề phòng tránh các tiêu chí phần mềm phần cứng, tất cả các track của đĩa từ  
được phân chia thành số lượng các sector như nhau. Do đó, các track ở gần trung  
tâm quay nhất thể dược tả chỉ tới một giứoi hạn dung lượng của chúng. Sự  
không đều đặn của cách phân lớp này tồn tại sẽ dẫn đến lỗi. Do đó các track ở  
trong cùng (gần tâm quay) thường ít được sử dụng (thí dụ trên thực tế đối với mỗi  
đĩa mềm chỉ sử dụng 80 track, đáng lẽ 82); thêm vào đó, đa số các track có một sự  
bảo vệ biến động cao.  
Tối ưu việc truy cập ổ đĩa cứng ở các Unix  
Để tối ưu khả năng của hệ thống tệp tin, người ta có thể thực hiện việc sử dụng  
các biện pháp: tại mọt cơ cấu định vị kết hợp, tất cả các đầu từ sẽ truy cập nhanh  
trên track hay trên các đơn vị nhỏ block của các track của một trụ ảo (virtual  
cylinder), nếu các đầu từ đồng thời ở trên cylinder này. Ở hệ điều hành Unix, mỗi  
nhóm track (các vòng xuyến cùng bán kính) của một cylinder chứa đựng một nút  
đặt biệt (của cây B) và một sự quản đặt biệt. Cho nên, nếu nút chỉ số mới (new  
index node) và các block cấp phát tệp tin, do đó, điều này được xảy ra một cách tự  
động trên từng nhóm cylinder. Qua đó, việc đọc/viết các tệp tin được tăng tốc rất  
nhanh, vì sau khi truy cập trên một nuýt chỉ số (i-node), tất cả các tác vụ tiếp theo  
sẽ không cần dùng thời gian nữa để định vị đầu từ đọc/viết.  
Giao diện thiết bị (device interface):  
Khác với trước đây, ở cấu trúc máy tính định hướng bus hệ thống thì không có  
các kênh phần cứng đặc biệt và do đó, không có các lênh được dự kiến trước của  
bộ vi xử lý. Đặc biệt, tất cả các thiết bị thể được làm đáp ứng một cách hệ  
thống nhất như bộ nhớ dưới mộtđịa chỉ ở trong không gian của bộ nhớ chính  
(memory mapped I/O).  
Hình 5.7 trang 190  
trong máy tính, các khoảng nhớ bên trong (của thanh ghi, bộ đệm...) được  
một bộ điều khiển thiết bị tạo lập để điều khiển thiết bị trên khoảng địa chỉ của bộ  
nhớ chính. Sau đây, những cái đó được lần lượt giới thiệu.  
Thanh ghi điều khiển (control-register):  
Nội dung lưu trữ của một tệp tin (data-word) được bộ điều khiển đọc thực  
hiện. phục vụ như một thanh ghi trạng thái; mỗi Bit có một ý nghĩa đặc biệt.  
Thí dụ: Bit 4=1kết thúc việc đọc; Bit 8=1xuất hiện lỗi đọc  
Thanh ghi lệnh (command-register):  
Ở loại thanh ghi này, mã được viết cho một lệnh (đọc/viết; tạo dạng/định vị...),  
thì lệnh này cần thiết phải được thực hiện. việc viết vào một lệnh ở trong thanh  
ghi này được thông dịch như việc gọi thủ tục; khi đó, các thông số trên thanh  
này cũng bao gồm cả nội dung của các thanh ghi khác.  
Thanh ghi địa chỉ (address-register):  
Thanh ghi địa chỉ chứa đựng địa chỉ trên thiết bị (bao hàm: device, track, track-  
group, ector, disk, read/write-head) số dung lượng vận chuyển (Byte).  
Bộ đệm dữ liệu (data-buffer):  
Hầu hết các bộ đệm xuất-nhập được tách chia để sao cho mỗi một bộ đệm chỉ  
được đọc một bộ đệm khác chỉ được viết.  
Hệ thống ngắt (interupt-system): Sau khi thực hiện một lệnh, ngắt hệ  
thống thể phát động một ngắt khác...  
Nếu thiết bị chiếm rất nhiều thông số, người ta có thể điều chỉnh chúng, do  
đó, người ta dùng nhiều thanh ghi, và khi đó sẽ xảy ra trường hợp nhiều không  
gian địa chỉ bị loại bỏ. Ở các không gian địa chỉ nhỏ, thông thường chỉ một địa  
chỉ tồn tại, khi đó, người ta phải viết địa chỉ tới gói tin nhiệm vụ hay các gói tin dữ  
liệu tuần tự với kích cỡ đã được khẳng định chính xác.  
Một cơ chế quan trọng đối với việc trao đổi thông tin với thiết bị việc di dịch  
toàn bộ khối dữ liệu giữa bộ đệm thiết bị của bộ điều khiển với bộ nhớ chính. Điều  
này được thực hiện một cách phụ thuộc vào bộ vi xử (với các cíp vĩ mạch  
chuyên dụng); khi đó, người ta gọi trường hợp này là truy cập trực tiếp (direct-  
memory access: DMA). Các nhịp DMA tồn tại không chỉ trong hệ thống bộ nhớ,  
đặc biệt còn tồn tại trên card điều khiển (Control-card). vậy, chúng có thể làm  
việc một cách độc lập với nhau nhờ có các kênh DMA.  
5.2.2. Bộ nhớ đa ổ đĩa từ  
Một phương pháp được mở rộng để nâng cao dung lượng đĩa từ ở chỗ quản  
kết hợp nhiều đĩa từ dung lượng nhỏ thành một ổ đĩa ảo có dung lượng lớn.  
Thật vậy, đối với một đĩa từ, chúng ta có một ổ đĩăcngs chỉ với một dung lượng  
hạn hẹp, do đó, nhiệm vụ của chúng là biến ổ đĩa có dung lượng nhỏ này thành ổ  
đĩa có giá trị. Một hệ thống để giải quyết vấn đề này được biểu thị là RAID  
(redundal array of inexpensive disk). Hệ thống này được ưu chuộng một cách  
tuyệt đối với các ngân hàng dữ liệu lớn với nhiều mục đích khác.  
Đối với hệ điều hành, sự biến thể phần cứng có ý nghĩa: Bộ kích tạo của hệ  
điều hành chỉ cho chúng ta thấy, người ta có thể tạo nên một ổ đĩa ảo năng động  
duy nhất đem lại một dung lượng lớn hơn. Khi ố. Đối với một giao diện để dẫn  
tới các lớp cao hơn của hệ điều hành, thì việc thực hiện tập hợp các đĩa từ chẳng  
vấn đề gì.  
Một lợi thế tiếp theo của hệ thống đa bộ nhớ đĩa cứng thể được sử dụng  
mạnh mẽ hơn, nếu ở trong hệ điều hành tồn tại nhiều tiến trình độc lập hay các  
tiến trình threads (xem chương 2). Sự độc lập của chúng, và với cái đó, sự loại bỏ  
lẫn nhau nhanh chóng được phòng tránh, nếu các dữ liệu độc lập nhau được thu  
gom trên một bộ nhớ kết hợp. Nếu bây giờ chúng ta thay thế nhiều ổ đĩa cứng bởi  
một ổ đĩa duy nhất với các đầu từ được nối cứng (xem hình 5.6), do đó, các dữ liệu  
của các tiến trình độc lập thể được đặt trên các bộ nhớ đĩa từ độc lập, như  
vậy, việc truy cập dữ liệu xảy ra nhanh hơn đáng kể. Ở hình 5.8, một sự phân chia  
các dữ liệu như vậy thì được nhìn thấy trên hệ thống đa ổ đĩa từ. Do đó, không  
gian tổng của bộ nhớ logic được phân chia thành các khoảng; một cách tương ứng,  
các khoảng lớn bằng nhau của ổ đĩa từ khác nhau được bộ kích tạo coi là khoảng  
bộ nhớ liên kết lập thành một khoảng bộ nhớ thống nhất cho một nhóm tiến  
trình. Bộ kích tạo của hệ điều hành có nhiệm vụ: phải quyết định việc phân bổ và  
kết hợp các dữ liệu phải thực hiện việc tạo lập các đơn vị bộ nhớ ảo trên các  
đơn vị bộ nhớ logic của các ổ đĩa từ khác nhau.  
Tổ chức ổ đĩa từ ở trong Windows NT:  
Ơ hệ điều hành Windows NT, khi tạo khuôn dạng lần đầu cho các khoảng bộ  
nhớ logic, một sự lựa chọn được cho trước để tổ chức thành các dải băng.  
Một sự lựa chọn tương tự hay khác nhau là ở chỗ, phải liên kết nhiều đoạn có  
độ lớn bất kỳ của các đĩa từ khác nhau tới một dung lượng của ổ đĩa logic. Không  
gian địa chỉ của ổ đĩa ảo thể được phân bổ không đều đặn trên các đĩa từ khác  
nhau.  
hình 5.8 trang 192  
Nếu chúng ta làm cho những dải băng rất mỏng, thí dụ khoảng 4 Byte hay tạo  
thành một klock lớn hơn, do đó, bộ nhớ đệm dữ liệu này được phân chia thành  
những khoảng tuần tự chiều dài 4 Byte và cho nên các dữ liệu được đọc viết  
rất nhanh trên ổ đĩa từ. Một hệ thống cấu hình truy cập nhanh nhưng không có  
tổn thất như vừa nêu được biểu thị hệ thống RAID-0.  
Bên cạnh khả năng truy cập nhanh rất cao và dung lượng bộ nhớ lớn, các hệ  
thống của đa ổ đĩa từ còn có một ưu điểm quan trọng nữa là: với hệ thống này,  
người ta có thể loại bỏ các tổn hao của đĩa từ. Đối với kiểu sai số lỗi hay sai số tổn  
hao, người ta nhận thấy với các dữ liệu của một ổ đĩa từ một bản sao (copy)  
chính xác trên một đĩa từ của một ổ đĩa khác; còn đĩa từ khác thì được tạo thành  
ảnh xạ của một trong các đĩa từ trong quan hệ với các dữ liệu của chúng. Hình 5.9  
chỉ ra một sơ đồ của một cấu hình ảnh xạ đĩa từ.  
Tuy nhiên, bản copy này phải luôn thường xuyên thực hiện. bộ kích tạo thể  
dịch vụ theo một cấu hình như vậy; tại mỗi quá trình viết lên đĩa Disk1, nó phải  
tác dụng bản copy trên đĩa Disk2; tức là, có một cái gì đó đã tạo ra khả năng chịu  
tải của hệ điều hành và của phần cứng I/O. Trong trường hợp hệ thống đa ổ đĩa từ  
tổn thất thì cấu hình của ảnh xạ ổ đĩa từ được gọi là DAID-1. Nếu chúng ta thực  
hiện ý tưởng của ảnh xạ ổ đĩa từ ổ trong cấu hình dãi băng (stripes) như ở hình  
5.8, do đó, chúng ta sẽ nhận được một hệ thống nhanh tuy có tổn hao, gọi là  
RAID-0/1. Tóm lại, người ta phải tiến hành thực nghiệm để điều hoà sự tổn hao  
thời gian tại quá trình đọc của ảnh xạ đĩa từ.  
hình 5.9 trang 193  
Bộ kích tạo sử dụng trạng thái tồn tại chốc lát của các đĩa từ để nó có thể lựa  
chọn việc đọc lần lượt 2 đĩa từ, mà các đầu đọc của các track mong muốn ở cạnh  
đó; còn đầu từ kia có thể sẵn sàng được định vị cho lần đọc tiếp theo hay có thể  
đọc/viết ở các cung đoạn khác chưa được ảnh xạ.  
Nhờ sự khéo trí này, người ta đã gia tăng một cách đặc sắc nhu cầu không gian  
nhớ lớn đối với hệ thống RAID-0/1. Thật vậy, mỗi Bit của một từ dữ liệu được  
viết lên một đĩa tà; đối với một từ 32 Bit, người ta cần dùng tới 32 ổ đĩa từ. Sau  
đó, mỗi từ được dự kiến với một hiệu chuyên dụng, thí dụ: một phần bổ sung 6  
Bit; do đó, ở hiệu suất cuối cùng của một từ dữ liệu được bộ điều khiển phân bổ  
trên 38 ổ đĩa từ. Điều đó không chỉ có ý nghĩa đối với dòng dữ liệu đồ sộ, mà còn  
tạo khả năng một độ chính xác kết quả cao. Vì mỗi một liên hiêpk Bit của một  
từ dữ liệu 38 Bit là không thể khả năng; cho nê, khi các đĩa từ hư hỏng hay  
khiếm khuyết, người ta chỉ chốt lại hợp lý 32 Bit.  
Sữa chữa lỗi nhờ hình thành tính chẵn lẻ:  
Ơ đây yêu cầu, chúng ta muốn lưu trữ n Bit một cách độc lập với nhau. Cách  
tiến hành như sau: Khi có thông tin điều khiển, chúng ta tạo lập được Bit thứ n+1,  
Bit này có tính chẵn lẻ p. Vì thế, người ta gọi p là hàm khác dấu (hàm XOR hay  
hàm logic cộng modul 2) của hai biến số a và b. Hàm này được biểu diễn bởi  
biểưthcs:  
p=ab  
(5.4)  
Theo đại số Boole, hàm này có bảng chân lý:  
a
b
0
1
0
1
p=ab  
0
0
1
1
0
1
1
0
Đồng thời hàm XOR có các tính chất:  
a 0 = a  
a a = 0  
(5.5)  
(5.6)  
Từ bảng chân lý và các tính chất (5.5), ta suy ra:  
p b = a b b = a 0  
Hay p b = a  
Với biểu thức (5.6), bây giờ ta hiểu rằng, khi tính chẵn lẻ p đã biêt, thì kết quả  
của một Bit a có thể được cho qua, vì chúng ta có thể phục hồi a trực tiếp từ p và  
b. Tất nhiên, điều đó sẽ dẫn tới, nếu biến b tự tồn tại trở lại từ nhiều số hạng,  
chẳng hạn:  
b = b1 b2 ... bn  
(5.7)  
Từ biểu thức (5.7) này chúng ta có nhận xét: tại n biến nhị phân, mà từ đó  
chúng ta thiết lập tính chẵn lẻ của hệ thống, thì ta thấy một trong các biến với sự  
trợ giúp của tính chẵn lẻ giữa các biến được khai khẩn phục hồi trở lại. Nếu bây  
giờ, chúng ta chỉ bình luận 8 biến nhị phân (chúng được kết hợp với nhau trong  
một Byte) song song nhau, do đó, điều sẽ dẫn đến đối với mỗi Bit Byte này hay  
đối với các Byte khác: Nếu chúng ta nạp mỗi Bit (hay vả dãy Bit) trên một bộ nhớ  
khác, do đó, khi bộ nhớ hư hỏng, chúng ta có thể phục hồi trực tiếp Bit lỗi từ n Bit  
chưa thay đổi. Khi đó, nếu chúng ta tạo ra được nhiều Bit sữa chữa lỗi, do đó,  
chúng ta sẽ khắc phục được khiếm khuyết của nhiều ổ đĩa từ.  
Hệ thống sữa chữa lỗi RAID-2 được giới thiệu trong hình 5.10 ở dưới. Các từ  
dữ liệu (data Word) được biểu thị thành các cột; mỗi cột lại được chia ra các Bit.  
O trong bộ điều khiển, dòng Bit của mội đĩa từ lại được chia nhỏ thành từng Byte,  
do vậy, các đĩa từ thương mại thông thường thể trở thành các hệ thống bộ nhớ.  
hình 5.10 trang 194  
Nếu chúng ta liên kết các Bit đã sữa chữa lỗi thành một khoảng ngắn nạp  
chúng vào một đĩa từ, khi đó, chúng ta nhận được một hệ thống sữa chữa lỗi đĩa từ  
RAID-3. Vì ở đây, thông tin sai số lỗi đãi của tất cả các block thì đựơc nạp trên  
một ổ đĩa từ duy nhất, do đó, ở đây chỉ một đĩa từ duy nhất này không tính tới.  
Bất giờ nếu chúng ta gộp các Bit dữ liệu thành các khoảng riêng lẻ (thí dụ thành  
các block), và như ở hệ thống RAID-0, chúng ta nạp mỗi khoảng này lên một đĩa  
từ riêng biệt; khi đó, hệ thống sữa chữa lỗi này được biểu thị là RAID-4.  
Sự quyết định cho cái đó ở chỗ, phải bảo đảm các thông tin sai số lỗi (fault  
information) thừơng xuyên được đọc đối với mỗi block bộ nhớ ở trên một ổ đĩa từ  
khác, và do đó, phải phân bổ một cách cân xứng sức chịu tải I/O của hệ thống ở tất  
cả các đĩa từ. Khi đó, người ta nhận được hệ thống sữa lỗi RAID-5. Hình 5.11 chỉ  
ra sơ đồ của hệ thống này.  
hình 5.11 trang 195  
Đối với kiến trúc hệ điều hành, nhiệm vụ chủ yếu là, phải vận chuyển toàn bộ  
kể cả các diễn biến lỗi một cách điều hoà vào trong các hệ thống con RAID, và  
phải làm cho hệ điều hành độc lập với hệ thống bộ nhớ. Đối với hệ điều hành, chỉ  
một hệ thống bộ nhớ ảo đơn giản mới một hệ thống an toàn và tiện lợi.  
Hạn chế lỡi nhờ ở đĩa ánh xạ hệ thống RAID trong Windows NT  
Ơ trong hệ điều hành Windows NT, đối với việc quản một tệp tin có sai số  
lỗi sẽ một bộ kích tạo đặc biệt (special driver), gọi bộ kích tạo FtDisk. Bộ  
này được chuyển đỏi giữa hai bộ: bộ kích tạo hệ thống NT và bộ kích tạo thiết bih;  
bộ kích tạo FtDisk tạo ra một máy ảo như một lớp trung gian (middle class);  
máy ảo vừa tạo cần phải tự mình đón bắt tất cả ác lỗi xuất hiện, mà các lớp cao  
hơn không thể nhìn thấy chưa nhận biết được. Nếu bây giờ một lỗi xuất hiện  
(chẳng hạn bad sector), do đó, các dữ liệu block chứa đựng lỗi sẽ được ổ đĩa ánh  
xạ đọc hay được phục vụ với sự trợ giúp của thông tin sữa lỗi (dải chẵ lẻ). Sau đó,  
một sector mới được yêu cầu cho sector chứa đựng lỗi, gọi ảnh xạ sector lỗi(bad  
sector mapping) và các dữ liệu được viết lên sector này. Với cái đó, trong hệ thống  
lại tồn tại hiện tượng dư thừa dữ liệu. Nếu không còn các sector trống (free space  
sectors) hay nếu thiết bị không có sector ảnh xạ, do đó, block (có các dữ liệu được  
phục hồi) được đưa trở lại bộ kích tạo hệ thống tệp tin.  
Nếu việc tổ chức ổ đĩa sai số lỗi không được tạo lập, do đó, bộ kích tạo FtDisk  
thông báo lỗi, chẳng hạn lỗi đọc/viết nhằm chỉ cho hệ thống tệp tin hay người sử  
dụng phản ứng lại điều đó.  
5.2.3. Tạo các ổ đĩa RAM (RAM-Disk)  
trong hệ điều hành, đối với các tính chất của bộ đĩa cứng, chỉ bộ kích tạo  
mới đầy đủ chức trách để tạo ra một máy ảo. Cho nên, người ta cũng thể sử  
dụng một khoảng bộ nhớ chính RAM như một ổ đĩa ảo ở vị trí của một bộ nhớ  
thực đĩa cứng, mà không cần lưu ý điều đó ở trong hệ điều hành. Cách làm này  
được gọi phương pháp tạo ổ đĩa hay phương pháp tạo ổ đĩa RAM.  
Tất nhiên, việc truy cập trên ổ đĩa RAM như vậy rất nhanh vì đối với các tệp  
tin trên ổ đĩa này thì tkhông có thời gian trễ cơ học khi đọc/viết. Trước khi tắt máy  
tính, người ta cần phải làm sáng tỏ một phần rất nhỏ của bộ nhớ chính như một  
thiết bị bộ nhớ đĩa cứng(?). Đó là vì: Các chiến lược hiệu nghiệm đối với bộ nhớ  
Cache và việc phân trang mà trước đây đã được minh hoạ bằng nhiều hình vẽ về  
các khoảng tệp tin trên không gian địa chỉ ảo, đã làm giảm đi đáng kể thời gian  
truy cập và làm cho việc quản bộ nhớ chính năng động hơn. thế, câu trả lời  
cho câu hỏi trên phụ thuộc mạnh mẽ vào hệ thống được sử dụng.  
Việc tạo một ổ đĩa RAM với mục đích: nếu người ta phải làm việc với  
một phần mềm cho trước xác định, thì phì mềm này tạo ra những tệp tin trên ổ đĩa  
này, mà chúng cũng được sử dụng bình thường như trên các ổ đĩa khác. Một dụ  
về điều đó là trình biên dịch (compiler): Nếu các tệp tin trung gian của quá trình  
biên dịch nằm trên ổ đĩa RAM, do đó, nâng cao một cách đáng kể tốc độ biên  
dịch.  
Một tình huống khác cũng thuộc các hệ thống này, khi hệ điều hành  
không thể phù hợp các khoảng địa chỉ lớn, qua bộ nhớ chính, thì nó phải có dung  
lượng m lớn hơn giới hạn bắt buộc 640kByte, do đó, người ta có thể sử dụng trình  
biên dịch qua một ổ đĩa RAM. Ở bộ kích tạo ổ đĩa RAM, người ta có thể vượt qua  
rào cản nhờ thủ thuật định vị tuần tự thích hợp.  
5.2.4. Các thiết bị nối tiếp.  
Chúng ta nhớ lại trong chương 4, ở hầu hết các thiêt bị, dữ liệu thể truy cập  
một cách tuần tự hay tuỳ chọn; nhưng tới khi trên thiết bị (như bàn phím,máy  
in...) thì điều đó không còn có thể bình thường được nữa. Mối liên hệ giữa các  
thiết bị nối tiếp được biểu thị một phương pháp để chỉ các dữ liệu phải sẽ  
được đưa chuyển như thế nào(?): Đó phương pháp vận chuyển lần lượt từng ký  
tự mà không cần thông tin địa chỉ của thiết bị.  
Tất nhiên, phương pháp này xảy ra với tốc độ hạn chế (khoảng vài kByte/sec).  
Đó là do các điều kiện biên kinh điển: do thiết bị đầu cuối, do máy in chạy chậm,  
do tốc độ gỏ bàn phím... Tuy nhiên, các quan hệ về mối liên kết nối tiếp vẫn mang  
lại kết quả rất nhanh; các kiểu này không cần dịch vụ của bộ kích tạo; ở đây, các  
khối dữ liệu được chuyển vận nhờ việc truy cập trực tiếp bộ nhớ. Việc điều khiển  
mối liên hệ này được thực hiện với sự trơk giúp của các kỷ thuật viên bằng cách  
pha trộn hợp đối với bộ kích tạo các thiết bị định hưởng khối định hướng ký  
tự.  
Giao diện thiết bị:  
Giao diện để dẫn tới bộ điều khiển các thiết bị nối tiếp (cũng giống như các  
thiết bị tuỳ chọn) ở trong khoảng các địa chỉ bộ nhớ chỉ chính sách thể được thích  
hợp qua những điểm sau đây:  
Thanh ghi điều khiển quan tâm tới các thông báo trạng thái, tốc độ vận  
chuyển (thí dụ 1200,2400,4800,9600 Baud= 1 Bit/sec của vận chuyển dữ liệu và  
điều khiển) cả phương pháp vận chuyển đồng bộ hay không đồng bộ. Khi vận  
chuyển không đồng bộ, các dữ liệu truyền đạt trong các khoảng cách khôngđều  
đặn; khi vận chuyển đồng bộ, tất cả các ký tự đều xảy ra trong khoảng thời gian  
cố định.  
Một thanh ghi nhập (dữ liệu) chứa đựng tự nhận được đầu tiên, rồi  
được bộ kích tạo đọc tại đó.  
thanh ghi xuất (dữ liệu), tự gởi đi được bộ kích tạo viết; rồi nó  
được bộ điều khiển trực tiếp gới đi.  
Hệ thống ngắt sẽ thoát ra một ngắt sau mỗi tự được nhận hay được  
gởi đi.  
Ngoài ra, hầu hết các thiết bị nối tiếp làm việc khi có dòng điều khiển được đặt  
trên thanh ghi điều khiển. Thông thường, việc điều khiển phần cứng được thực  
hiện qua các dây mảnh kim loại (chuẩn RS 232), do đó, các ký tự được  
(XON,XOFF...) gởi đi để điều khiển. Nếu khi nhận, bộ đệm nhận bị đe doạ đầy  
tràn, do đó, sẽ gởi đi dòng ký tự XOFF, và tạo thời cơ cho người gởi dừng lại  
việc gởi. Nếy bộ đêmh còn trống, thì người nhận sẽ gới đi dòng ký tự XON và báo  
cho người gởi tiếp tục gởi đi. Tuy nhiên, cơ chế này chỉ hoạt động, nếu người nhận  
gởi tín hiệu của anh ta kịp thời, do đó, người gởi đủ thời gian để tiếp nhận và  
thông dịch tự điều khiển, chuyển vào bộ kích tạo trước khi bộ đệm bên bị  
tràn.  
5.3. Mô hình hoá và việc thực thi của bộ kích tạo  
Một cách truyền thống, muốn viết một bộ kích tạo thiết bị đòi hỏi phải một  
sự hiểu biết cơ bản cao hơn của người lập trình về thiết bị bộ điều khiển cũng  
như về các chi tiết đặc sắc của sự sống lao động của hệ điều hành. Do đó, hầu hết  
các lỗi ở trong các hệ điều hành được đúc kết lại thành các bộ kích tạo mới; những  
bộ kích tạo này đã được dàn xếp với các thiết bị ngoại vi mới ở trong hệ điều hành  
và có thể hạn chế được các lỗi không tránh được ở trạng thái nhân.  
Để giải quyết vấn đề này, điều quan trọng là các nhà sản xuất hệ điều hành đã  
đưa ra một giao diện hiển thị rõ ràng đối với bộ kích tạo thiết bị. Ngay cả sư tồn  
tại của các bộ kích tạo cao hơn đã trợ giúp rất nhiều khi tạo lập các bộ kích tạo  
mới khác.  
Các bộ kích tạo này làm thoả mãn tất cả các nhiêmh vụ quản lý các thiết bị độc  
lập (như dẫn các danh sách gói tin, quản bộ đệm Cache...). Một lợ thế nữa là:  
nếu người ta treo một kích tạo mới trực tiếp vào hệ điều hành, thì không cần phải  
gắn vào một nhân hệ điều hành mới.  
Vấn đề tiếp theo là đàm luận về các lỗi. Sau đây, chúng ta sẽ nói tới một vài  
giao diện công tác cùng các chức năng của chúng.  
5.3.1. Giao diện của bộ kích tạo ở Unix  
Một cách quen thuộc, các bộ kích tạo Unix không thể chất tải thêm, mà chúng  
thể được chuyển đổi hay hoặc thể được kết nối với nhân một cách tính tại.  
Mỗi bộ kích tạo thực thi một dãy của nhiều hay ít các thủ tục đã được khẳng định;  
các thủ tục này được liên kết thành một bảng. Vì các thủ tục này được viết bằng  
ngôn ngữ C, cho nên, các bộ kích tạo sẽ được tiến trình người sử dụng gọi bởi các  
lệnh như open(), close(), read(), và write(). Với các thủ tục này, các việc điền vào  
để xác định của cấu trúc người sử dụng (u.u_offset, u.u_count, u.u_error...) được  
sử dụng như những bằng chứng để thông báo lỗi trở lại.  
Các thủ tục của bộ kích tạo đối với một thiết bị dạng là XX, thí dụ: XX=mt  
cho thiết bị băng từ; XX=rk cho ổ đĩa cứng. Sau đây sẽ giới thiệu một vài thủ tục  
thông dụng:  
XX_init là một thủ tục để thực thi bộ kích tạo thực thi thiết bị. Điều đó  
được thực hiện khi khởi động hệ thống.  
XX_read, XX write là thủ tục để đọc/viết trực tiếp các dữ liệu (thí dụ các  
block bộ nhớ) theo kiểu nguyên (raw modus)  
XX_open, XX_close là các thủ tục, mà nó được gọi bởi hệ thống open()  
và close(). Những thủ tục này dịch vụ chủ yếu để khởi động thiết bị mỗi khi sử  
dụng, và có ý nghĩa đặc biệt đối với thiết bị. Thí dụ, với thủ tục mt_close, một  
băng từ tính (magnet band) được bắt đầu quấn lại, với cái đó, người ta có thể lấy  
băng ra.  
XX_ioctl là một gọi hệ thống, nhận được các thông số, người ta đã  
đưa lại khi gọi hệ thống ioctl(), nó cũng được dùng để điều chỉnh thiết bị, điều  
chỉnh tốc độ vận chuyển đìều chỉnh phương pháp khi thiết bị liên kết nối tiếp.  
XX_strategy là một thủ tục dùng để đọc/viết các block riêng lẻ (block  
device), và bên cạnh việc chuyển đổi số logic các block tới địa chỉ bộ nhớ vật lý,  
nó còn quan tâm thêm chiến lược đọc/viết để cải thiện cú pháp (xem mục 5.4  
dưới)  
Các thông tin được ghi nhớ ở đầu các block bộ nhớ. thủ tục strategy được  
gọi một cách không đồng bộ từ bộ điều khiển ngắt để chuyển bllock kế tiếp cho  
thiết bị, khi tất cả các thông báo lỗi được chứa đựng ở đầu cấu trúc block, vì bộ  
kích tạo thể truy cập trên tiến trình người sử dụng để nhận thấy các tham số.  
XX_intr là một lập thức dịch vụ ngắt (interrup service routine). Unix, nó  
thuộc bộ kích tạo được viết bằng ngôn ngữ C. Lập thức này được dùng để sẵn  
sàng cứu thoát các thanh ghik khi đó được gọi là các lập thức ngôn ngữ máy  
(assemblerroutine), được dùng để vận chuyển dữ liệu cũng như để thiết đặt bộ  
chuyển đổi truy cập trực tiếp DMA với sự trợ giúp của danh sách chuỗi các nhiệm  
vụ.  
Ngoài ra, còn có các thủ tục khác, mà chúng thì phụ thuộc vào các ấn bản của  
Unix và được làm đầy bởi các chức năng đặc biệt.  
Tất cả các thue tục của các bộ kích tạo được định nghĩa như những địa chỉ ở  
trong cấu trúc bản ghi (với tệp tin conf.h) trên một thiết bị được sắp xếp thành  
một bảng trung tâm (với tệp tin conf.c); bảng này có thể được tạo ra bởi một  
chương trình config. Mỗi một thiết bị hay mỗi một bộ điều khiển được thu xếp  
một số rõ ràng, gọi số thiết bị chuyên dụng (major device number). Nếu một  
trong các thủ tục được gọi,do đó, điều đó chỉ xảy ra trên các bảng trung tâm. Mõi  
lần điền vào bảng thì bao gồm mộtcấu trúc bản ghi, mà trong đó, các địa chỉ của  
các thủ tục của bộ kích tạo thiết bị được dẫn tới. Chỉ số của mỗi lần điền vào thì  
được kết nối với một gọi hệ thống duy nhất tới các bộ kích tạo; chúng được sắp  
xếp thành 2 giai đoạn: theo thiết bị hướng khối(block device switch:bdevsw) và  
theo thiết bị hướng tự (character device switch: cdevsw).  
Trích dẫn từ tệp tin conf.c của hệ điều hành OS/2:  
struck bdevsw bdevsw[ ] = {  
{ tmopen, tmclose, tmstrategy, tmdump,  
0, B_TAPE },  
{ nodev, nodev, nodev, nodev,  
0,B_TAPE },  
/*0*/  
/*1*/  
/*2*/  
{xyopen, nulldev, xystrategy, xydump,  
xysize, 0}  
...};  
struct cdevsw cdevsw[ ] = {  
{cnopen, cnclose, cnread, cnwrite,  
cnioctl, nullev, cnselect, 0,  
/*0*/  
0,  
0,  
},  
{ nodev, nodev, nodev, nodev,  
/*1*/  
nodev, nodev, nodev, 0,  
swcinfo, 0, },  
{ syopen, nulldev, suread, sywrite,  
syioctl, nulldev, syselect, 0,  
/*2*/  
0,  
0,  
},  
...};  
Ở đây, các thiết bị hướng block có các gọi hệ thống đồng bộ: open, close,  
strategy, dump, psize, và flage; các thiết bị hướng tự có các gọi hệ thống: open,  
close, read, write, ioctl, reset, select, mmap, stream, segmap. Các lập thức dịch vụ  
ngắt không đồng bộ thì không điền vào ở đây, điền vào trong một đơn thể  
assembler bị tách biệt.  
Mỗi thiết bị logic không có một sự thực thi các thủ tục của bộ kích tạo: Nếu  
không tồn tại việc thực thi, do đó, điều này dẫn ra với gọi hệ thống nodev và nó  
dẫn tới thông báo lỗi khi gọi hệ thống; nếu đơn giản điều đó không xảy ra, do đó,  
sẽ bắt đầu với gọi với gọi hệ thống nulldev. Nếu một thiết bị được thích hợp  
hướng tự cũng như hướng block, do đó, các thủ tục của các bộ kích tạo thich  
hợp của thiết bị được nhận biết ở trong cả hai bảng.  
Khi xuất hiện các lỗi (máy không mở, track bị hỏng, có các lỗi khi đọc...) thì  
chỉ số lỗi thích hợp sẽ được viết vào cấu trúc người sử dụng của tiến trình người  
sử dụng. Nếu bộ kích tạo nhận biết một trạng thái, mà bộ kích tạo không còn thống  
trị trạng thái này nữa(địa chỉ bộ đệm lỗi) và vì thế trạng thái này không thể đếm  
xỉa tới, do đó, còn lại khả năng cuối cùng để gọi thủ tục panic; thủ tục này in một  
text lỗi dừng toàn bộ hệ điều hành.  
5.3.2. Giao diện của bộ kích tạo ở trong Windows NT.  
Các bộ kích tạo ở trong Windows NT phải chứa đựng những công dụng xác  
định. Theo R.Nigar (1997), thuộc điều đó những thủ tục sau đây:  
Thủ tục khởi động (load driver)  
Thủ tục này được thực hiện nhờ bộ điềuhành I/O, nếu bộ kích tạo hệ thống  
được nạp, khi đó sẽ tạo lập một đối tượng, với đối tượng này, trình điều  
hành I/O nhận biết thiết bị và trên thiết bị này, những thủ tục kế tiếp dưới đây  
được tham chiếu  
Thủ tục để khởi động bộ vận chuyển dữ liệu(start I/O)  
Như vậy, phải tối thiểu một thủ tục để thoát bộ vận chuyển dữ liệu (cancel  
I/O). Việc thực hiện việc lựa chọn thủ tục này thì phụ thuộc chắc chắn vào kích  
cỡ dịch vụ của bộ vận chuyển dữ liệu.  
Lập thức dịch vụ ngắt (interrupt service rountine: ISR):  
Hệ thống ngắt ở trong Windows NT giúp việc điều khiển hệ thống khi có ngắt  
thiết bị yêu cầu tới thủ tục này. Vì ngắt này xảy ra với ưu tiên rất cao, nó được lập  
thức ISR chờ đợi, do đó, khi có gọi ISR xuất hiện, lập thức này sẽ biến đổi thành  
gọi thủ tục DPC (deferred procedure call: DPC), và gọi này giống như một gói  
tin công tác (job package) treo vào hàng đợi của các DPC. Nếu các DPC tiến  
hành với ưu tiên thấp thì một ngắt khác sẽ bẻ gãy chúng.  
Thủ tục DPC bao gồm lập thức ISR:  
Các thủ tục DPC sẽ được gọi, nếu ưu tiên của các tiến trình đang diễn rơi vào  
ưu tiên được định nghĩa của DPC. Thủ tục DPC hoàn thiện công việc chính của  
lập thức ISR, đặc biệt làm hoàn thiện bộ chuyển vận dữ liệu và phân bổ nhiệm vụ  
kế tiếp từ hàng đợi.  
Thủ tục để thoát bộ vận chuyển dữ liệu (completion rountine)  
Thủ tục này có thể dẫn tới nhờ một bộ kích tạo ở trong các gói yêu cầu I/O, do  
đó, sẽ được gọi sau khi bộ kích tạo sâu hơn kết thúc hoạt động của nó. Thủ tục  
này tiếp tục dẫn tới những thông tin về kết quả, các lỗi xuất hiện hay sự bẻ gãy của  
các bộ kích tạo cao hơn (thí dụ bộ kích tạo hệ thống tệp tin); đồng thời, tạo khả  
năng cho bộ kích tạo này kết thúc nhiệm vụ một cách thích ứng.  
Thủ tục ghi chép lỗi (error logging):  
Thủ tục này dẫn tiếp các thông tin về bộ điều hành I/O, mà nó đã viết các lỗi  
này thành một tệp tin các lỗi.  
Khi tải bộ kích tạo thì không tạo ra một đối tượng kích tạo (driver object) cho  
việc truy cập trình điều hành I/O, mà nó tạo ra một đối tượng thiết bị (device  
object) cho mỗi thiết bị cũng như cho mỗi chức năng thiết bị. Các đối tượn thiết bị  
cho thấy điểm quan hệ để sử dụng bộ kích tạo. Thí dụ khi mở tệp tin  
\Device\Floppy0\Text\bs_file.doc (xem hình 4.7), tên đường dẫn \Device\Floppy0\  
bị tách chia: tên này chính là tên của đối tượng thiết bị mà nó có quan hệ với trình  
điều hành I/O. Trình điều hành I/O được hệ thống tệp tin trao nhiệm vụ nhằm đạt  
được các gói tin yêu cầu I/O qua đối tượng thiết bị ở bộ kích tạo thẩm quyền về  
cái đó. Cho nên, tất cả các đối tượng thiêts bị của thiết bị vật lý, thiết bị logic, và  
thiết bị ảo đều được kết nối với bộ kích tạo thiết bị nhờ một bộ chỉ thị ở trên đối  
tượng kích tạo thiết bị của chúng; ngược lại, chúng là thành phần của một danh  
sách đối tượng của bộ kúch tạo, với vái đó, trình điều hành I/O có thể kiểm tra  
lại khi thoát khỏi bộ kích tạo (unload driver), mà một trong các đối tượng thiết bị  
nào đó được gặp lại. Hình 5.12 minh hoạ một kiểu kết nối đó.  
hình 5.12 trang 202  
Ngoài các chức năng của bkích tạo thiết bị, người ta còn lưu ý tới những điều  
kiện phụ khác nhau của chúng. Một trong các nhân tố quan trọng việc hệ  
thống thể được thực hiện như thế nào trên các vi xử lý khác nhau của hệ thống  
đa vi xử lý.  
Khi truy cập trên các dữ liệu, điều này cưỡng bức một sự sắp xếp để thể sử  
dụng được các dữ liệu toàn cục hay các dữ liệu chia sẻ khác nhau. Điều đó có ý  
nghĩa đối với một bộ kích tạo khi mã của được làm việc đồng thời trên nhiều  
bộ vi xử lý, cho nên phải lưu ý việc truy cập của nó trên các thanh ghi của một  
thiết bị . tất nhiên, cả việc truy cập trên cấu trúc dữ liệu của bộ kích tạo (với danh  
sách các nhiệm vụ) cũng phải được chú ý trước.  
Khác với các hệ thống điưn vi xử lý, ở hệ thống ngắt, cần phải tôn trọng viẹc  
truy cập trên cấu trúc dự liệu của bộ kích tạo. Lập thức dịch vụ ngát làm việc khi  
ưutiên cao nhất, nó có thể không xuất phát từ đó để một vài lối dẫn vào  
thanh ghi thiết bị, danh sách nhiệm vụ... Một bản coppy của bộ kích tạo trên bộ vi  
xử lý khác có ưu tiên thấp thể đồng thời truy cập trên các dữ liệu/ cho nên, ở  
trong nhân hệ điều hành có các thủ tục đồng bộ nhân đặc biệt để dẫn tới các thủ  
tục như: các thủ tục bận chờ (busy wait), thủ tục khoá vòng (spin lock)...  
Một nhiệm vụ tiếp theo của bộ kích tạo việc phản ứng lại sự sụt áp nguồn  
điện (power failure). Ở đây, được lưới điện dự kiến, nó có thể nhận được sự  
cung cấp ngay lập tức sai khi tín hiệu mất nguồn điện khoảng vài mili giây. Khi  
đó, các dữ liệu quan trọng được bảo vệ. Một bộ kích tạo để phân biệt được các  
phần nhân tử trong hoạt động của nó; các phần này khôngđược phép phá hỏng dữ  
liệu để nhằm đảm bảo việc tích hợp các dữ liệu. Ngoài ra, trong giai đoạn này phải  
đảm bảo không để xảy ra tình trạng mất nguồn điện lâu hơn; sau khi ngăn cản việc  
ngắt mất nguồn điện, các dữ liệu riêng lẻ được chép lại tiếp đến ngắt được trả  
tự do. Ngược lại, khi mất nguồn điện, thiết bị phải được đặt vào trnạg thái được  
điều khiển quen thuộc trước khi nguồn điện đựơc đóng lại.  
Nếu hệ thống cung cấp một khoảng RAM có nuôi pin, thì khi đó, thể tất cả  
các dữ liệu tiến trình quan trọng (ngữ cảnh tiến trình) được cứu, do đó, nó có thể  
phải tiếp tục thực hiện chương trình sau khi tái phục hồi điện áp nguồn.  
5.4. Các chiến lước tối ưu các thiết bị nhờ bộ kích tạo.  
Nếu chúng ta viết một bộ kích tạo cho một thiết bị, thì trong đó, chúng ta phải  
làm thoả mãn các Bit điều khiển thiết bị. Với các tài liệu ít ỏi của nhà sản xuất, các  
bộ kích tạo này phải đựoc thông dịch một cách sáng tạo.bằng các chiến lược sẽ  
được nghiên cứu dưỡi đây, chúng ta có điều kiện để thực thi các bộ kích tạo để  
tối ưu việc truy cập đối với một thiết bị. Cụ thể, một khả năng duy nhất đối với  
chúng ta, đó việc thiết kế một chiến lược định thời cho việc truy cập ổ đĩa.  
5.4.1. Các chiến lược định thời cho truy cập ổ đĩa  
Bộ kích tạo của một thiết bị địa chỉ xác định thì nó gần như thực hiện liên  
tục một dãy các nhiệm vụ. Đối với một thiết bị, chẳng hạn một ổ đĩa từ tính, bao  
giờ cũng thơhì gian trễ cơ học, do đó, mỗi nhiệm vụ đựơc kết nối theo một thời  
gian chờ. Thời gian chờ này thì phụ thuộc vào trạng thái của thiết bị khi phân bổ  
nhiệm vụ. Khi truy cập ổ đĩa thì đó trạng thái đọc/viết của đầu từ, tức là khi đó  
một track (có một chỉ số nào đó) mà trên đó chứa đựng các block (gồm nhiều  
sector) tồn tại kế cạnh nhau cần đọc viết. Nếu bộ kích tạo của thiết bị mặt  
trong các hàng chờ đợi nhiệm vụ, đó, nó có thể thử tìm kiếm để tăng tốc độ  
công việc nhờ sắp xếp theo lớp các nhiệm vụ ở trong danh sách. Điều này thì thích  
hợp với chiến lựơc định thời giiống như chiến lược phân bổ các tiến trình tại một  
bộ vi xử đã nghiên cứu ở chương 2.  
Đối với chiến lược định thời, đến nay có rất nhiều phương pháp khác nhau.  
Hình 5.13 giới thiệu phương pháp nổi tiếng nhất đang thịnh hành trên thế giới.  
Phương pháp này quy tụ các chiến lược sau:  
hình 5.13 trang 204  
Chiến lược đến trước dịch vụ trước (first come first serve: FCFS):  
Chiến lược này là đơn giản nhất nhưng mỹ mãn nhất; vì nó thực hiện theo  
nguyên tắc công bằng hội: tất cả mọi nhiệm vụ được thực hiện theo một dãy  
tuần tự mà trong đó chúng xuất hiện.  
Thí dụ: Giả sử một đĩa cứng có 20 track và chứa đựng một danh sách các  
nhiêmh vụ. Đầu từ đang ở vtrí track số 6, dãy nhiệm vụ của được xác định: nó  
phải chuyển vị đến làm việc tại các track theo thứ tự 8, 19, 3, 14, 2, 15, 7. Nếu lấu  
bề rộng track làm đơn vị tình thì đoạn đường đầu từ phải dịch chuyển cơ học  
là:  
2+11+16+11+12+13+8 = 73 track  
Chiến lược thời gian tìm kiếm ngắn nhất trước nhất (shortest seek time  
first:SSTF):  
Nội dung của chiến lược này là, đầu từ thể chuyển đổi từ một track này tới  
một track kia mà không cần phải lưu ý khoảng cách giữa chúng. Điều đó có ý  
nghĩa, đầu tiên, người ta có thể hoàn thành các nhiệm vụ phạm vi gần nhau  
nhằm tránh được đầu từ phải di chuyển nhiều.  
Để lần lượt lựa chọn nhiệm vụ kế cạnh, địa chỉ track của khoảng cách  
nhỏ nhất tới trạng thái địa chỉ hiện hành, thì chiến lược này thích hợp với trường  
hợp chuyển động tìm kiếm track của đầu từ ngắn nhất.  
Thí dụ: Danh sách nhiệm vụ của đầu từ có dãy tuần tự với các số của track: 7,  
8, 3, 2, 14, 15, 19. Theo chiến lược này, quỹ đạo của đầu từ được chỉ trong hình  
5.13 và đoạn đường của được xác định:  
1+1+5+12+1+14 = 25 track.  
Người ta có thể so sánh chiến lược này với chiến lược Job ngắn nhất trước  
nhất của phương pháp định thời đã nói ở mục 2.2 ở trước. Còn vấn đề cần nói: Khi  
dãy tuần tự các nhiệm vụ không thuận tiện, tức một nhiệm vụ nằm ở cuối đĩa từ  
(hay cuối khoảng đĩa chỉ) thể bị thiêtj thòi và dẫn đến trạng thái chết đói  
(hurry-status).  
Chiến lược quét ổ đĩa (Scan, C-Scan)  
Ý tưởng bản của chiến lược này là ở chỗ, các track được rà (SCAN) lần lượt  
một cách hệ thống và trên con đường này tất cả các nhiệm vụ được thực hiện.  
Thí dụ: Việc xử lý công việc SCAN có một danh sách các nhiệm vụ được thiết  
lập; chẳng hạn đầu từ đang ở vị trí track số 6, được khởi hành theo hướng các  
track có chỉ số lớn dần, với dãy tuần tự:7, 8, 14, 15, 19, 3, 2. Do vậy, tổng quảng  
đường đầu từ phải đi qua là;  
1+1+6+1+4+16+1 = 30 track.  
Tải về để xem bản đầy đủ
doc 27 trang Thùy Anh 27/04/2022 14420
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Hệ điều hành - Chương 5: Quản lý vào ra", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • docgiao_trinh_he_dieu_hanh_chuong_5_quan_ly_vao_ra.doc
  • htmbtc5.htm
  • xmlfilelist.xml
  • gifimage001.gif
  • gifimage002.gif
  • gifimage003.gif
  • gifimage004.gif