Bài giảng Hệ điều hành - Chương 5: Quản lý vào ra
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 độ, mà với nó, các dữ liệu có 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.) và 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ụ mà 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 và cấu trúc vận chuyển dữ liệu.
indows NT: Để quản lý bộ đệm Cache cho việc xuất-nhập có một trình điều hành Cache đặc biệt. Trình điều hành này cấp phát các trang một cách năng động ở trong bộ nhớ chính và tạo ra một sự ảnh xạ bộ nhớ giữa các trang bộ nhớ chính và một tệp tin. Số lượng các đối tượng đoạn (section object) là năng động: nó phụ thuộc vào bộ nhớ chính đựơc sử dụng cũng phụ thuộc vào sự thường xuyên truy cập trên các phần tệp tin. Điều đó sẽ xảy ra: các trang của trình điều hành bộ đệm Cache giống như các trang của một tiến trình xẽ được trình điều hành bộ nhớ ảo quản lý. Số lượng các trang tồn tại trong bộ nhớ chính sẽ được điều chỉnh qua cơ chế tập công tác (working set) hay cơ chế ảnh xạ (mapping mechanismus), xem mục 3.3 ở trên. Đối với việc đệm thêm khi xuất-nhập nối tiếp, các cơ chế đặc biệt phải được phát triển để nhằm nhận đựơc các kết quả của các chương trình từ đa tác vụ không có chặn trước của Windows 3.1 (16 Bit) đến đa tác vụ có chặn trước của Windows NT. Đối với mỗi thiết bị, ở trong Windows 3.1, có một hàng đợi I/O duy nhất và đối với các thiết bị nối tiếp cũng vậy. Nếu trong cửa sổ khác nhau, các việc nhập cào (nhập ký tự, kích chuột...) được dẫn ra, do đó, chúng sẽ đặt một đơn vị nhập vào bộ đệm nhập. Một cách tiện lợi, một tiến trình đọc/viết đưới Windows 3.1 kép dài bất kỳ (không có chặn trước), cho đến khi nó hoàn thành công việc nhập vào và bị hãm lại khi đọc trên bộ đệm nhập, nếu công việc tiếp theo không còn nữa đối với chúng. Tiến trình thuộc cửa sổ này được hoạt động bởi bộ điều hành cửa sổ và đọc vào phần bộ đệm của nó. Bây giờ, nếu chúng ta đi qua một giứoi hạn chặn trước, ở đó, một tiến trình có thể cùng được hoạt động ngay, nếu khoảng thời gian (time slice) của nó đã trôi qua, do đó, điều đó sẽ dẫn tới những vấn đề tại bộ nhớ đệm nhập: tiến trình (mới được tăng cường) này sẽ đọc các dữ liệu đã được xác định. Đó là trường hợp, khi tiến trình được dựng lại và được kết nối đầu cuối mà trước đó còn chứa đựng lỗi. Từ lý do này, ở Windows NT, mỗi tiến trình thread có một hàng đợi nhập riêng lẻ; việc nhập vào chưa được đọc này đối với một tiến trình thread được giữ lại tiến trình này và không được đọc thực thụ bới tiến trình thread kế cạnh; đó là hệ thống mạnh mẽ đối diện với các tiến trình chứa đựng lỗi. Chúng ta có thể tích hợp 2 hệ thống khác nhau như Windows 3.1 và Windows NT như thế nào? Tính logic của các tiến trình không chặn trước ở Windows 3.1 cũng được dự đoán như tính logic của tiến trình trọng lượng nhẹ (thread), Bây giừo, ý tưởng này chỉ ra, cần phải sử dụng cơ chế của tiến trình thread ở trong Windows NT. Do đó, những nhà thiết kế hệ điều hành Windớ NT đã lý giải Windows 3.1 như một hệ thống con 16 Bit. Hệ thống này đã cho xuất phát các tác vụ 16 Bit như các tiến trình threads riêng lẻ. Tuy nhiên, một cách đúng mức, một bộ vi xử lý đã cứu thoát tiến trình này (cùng như tiến trình NT khác); khi trả lại bộ vi xử lý, tiến trình thread (xuất hiện sau cùng) nhận lại việc điều khiển một cách tự động; khi đó, coi như không xảy ra việc thay đổi tiến trình. Do đó, ở trong hệ thống Windows/DOS cũ, một số đặc điểm đạt được một cách tiện dụng. Tuy nhiên, nó còn có thể hơn thế: ở trong không gian địa chỉ bị tách chía, các ứng dụng 16 Bit được diễn biến như những tiến trình độc đáo. Trong trường hợp này chúng tỏ ra không còn ép buộc như trước đây dưới Windows 3.1; cho nên, điều này không còn có ý nghĩa ở tất cả các áp dụng cũ. 5.4.4. Đồng bộ và không đồng bộ việc vào-ra. Việc vào-ra trong một chương trình thì cần thiết phải chờ đợi cho tới khi một gọi hệ thống được kết thúc một cách mỹ mãn. Khi đó, người ta gọii quá trình này là làm đồng bộ việc vào-ra (I/O synchrone). Bấy giườ, nó cần một khoảng thời gian cố định nào đó, cho tới khi việc vao-ra được thực hiện. thời gian này có thể được chương trình sử dụng một cách tốt hơn cho các công việc khác nhau. Ngay trong các chương trình đang tồn tại tiến trình thread, thì đều không thể nhận ra: tại sao tất cả các tiến trình thread chờ đợi việc vào-ra(!). Một khả năng để loại bỏ việc hãm chặn vừa nói là việc thừa nhận các tiến trình threads như là những tiến trình trọng lượng nhẹ nhờ hệ điều hành Windows NT. Khi đó, một cách phổ biến, chỉ có một thread bị hãm, còn các threads khác của tiến trình thì không. Tuy nhiên, điều này không phải bao giờ cũng xảy ra trong hệ điều hành. Một khả năng khác cho vấn đề này là vấn đề không đồng bộ tiến trình vào-ra (I/O asynchrone). Khi đó, gọi hệ thống sẽ dẫn tới chỉ một tác vụ xuất-nhập; kết quả sẽ được một tiến trình thread đón nhận một cách muộn hơn nhờ một lệnh đặc biệt. Kiểu gọi hệ thống này đặt ra cho hệ điều hành những yêu cầu đặc biệt; bởi vì ở đây, nhiệm vụ cũng như kết quả phải được quản lý và phải được lưu trữ trung gian thì phụ thuộc vào tiến trình uỷ nhiệm. Không đồng bộ I/O ở Unix: Ở các ấn bản thông thường của Unix, các gọi hệ thống cho phép chuyển đổi khi đọc/viết không bị ngăn hãm. Khi nhảy lui khỏi các thủ tục đọc/viết, số lượng các Bytes đọc/viết được hoàn trở lại. Nếu nó bằng 0 thì quá trình đọc/viết không xảy ra. Việc dẫn tới một quá trình không đồng bộ I/O đối với một tiến trình thì bình thường là không thể được. Tuy nhiên với một sự khéo léo, chúng ta có thể đạt được điều này. Cho cái đó, chúng ta sử dụng cơ chế fork() theo mục 2.1.1 (với hình minh hoạ 2.4) để nhận được bản copy của tiến trình. Tại quá trình I/O, bản copy bị hãm lại một cách đại diện. Sau đó, nếu tại bản copy chúng ta dự định một cơ chế exit(), do đó tiến trình chính có thể tiếp tục làm việc, cho tới khi, với một cơ chế wait(), nó có thể đón nhận kết quả của tác vụ I/O. Tuy nhiên, khả năng này là không thể thực tiến: để tạo lập được một tiến trình như vậy, phải tốn quá nhiều thời gian; vì rằng, kiểu vào-ra không đồng bộ này thì hầu như không mang lại lợi thế nào. Một quyết định cho cái đó là một sự kết nối nhanh chóng việc trao đổi thông tin với một tiến trình con (thí dụ qua bộ nhớ chia sẽ). Tiến trình con nay được tạo ra một lần và được sử dụng một bộ móc nối I/O và đới với tiến trình con này được tạo ra một lần và được sử dụng như một bộ móc nối I/O và đối với tiến trình chính, nó chờ đợi một cách đại diện. Cả hai cơ chế vừa nêu là một bộ phận thay thế không thể thiếu được với các khả năng không đồng bộ I/O ở trong Unix. Không đồng bộ I/O ở Windows NT: Trong hệ điều hành Windows NT, nếu việc vao-ra được thực hiện thì nó phụ thuộc vào một tham số, mà tham số này được dẫn ra bới các cơ chế WriteFile(), ReadFile(), CreateFile()... Trong trường hợp bình thường, gọi hệ thống được dẫn qua tất cả các lớp (dịch vụ hệ thống, trình điều hành I/O, bộ kích tạo thiết bị, ngắt chuyển đổi, nhảy lui) và dừng tiến trình tại một gọi hệ thống ReadFile(), cho tới khi các dữ liệu mong muốn trải ra. Ngược lại, nếu một thông số được chỉ ra overlapped (bị chồng lên nhau), do đó, dòng điều khiển sẽ đi tới việc hoãn lại và dẫn ra bộ chuyển đổi dữ liệu ngay lập tức trở lại gọi hệ thống. Tiến trình có thể tiếp tục làm việc, nhưng làm công việc khác. Để nhận được các số liệu mong muốn, một gọi hệ thống Wait (fileHandle) được thay thế, nó sẽ hãm chặn tiến trình thread, cho tới khi số liệu mong muốn được đưa ra. Đối tượng fileHandle được thuyên chuyển thành trạng thái báo trước và do đó, tiến trình được đánh thức. Bây giờ, nó có thể thực hiện gọi hệ thống ReadFile() và cuối cùng nó đọc các dữ liệu. Tuy nhiên, người ta phải lưu ý, không sử dụng một tiến trình thread thứ hai (chẳng hạn fileHandle) để dẫn tới hay chờ đợi mộttiến trình I/O không đồng bộ; tức là, với đối tượng fileHandle, một tín hiệu đánh thức cả hai tiến trình threads, mà chỉ một trong hai của nó khi đón nhận sai, do đó, khi xuất nhập các dữ liệu đã cho thấy rằng tiến trình đã được chuyển đổi. Một lối thoát khỏi tình trạng này là sử dụng các đối tượng biến cố riêng lẻ hay sử dụng các gọi thủ tục không đồng bộ (asynchronous procedủe calls:APCs) cho mỗi tiến trình thread. Một cách độc lấp với cái đó, tiến trình thread (vừa gọi) lập tức nhận được sự điều khiển trở lại và có thể tiếp tục làm việc. Sau đó, tiến trình thread này phải tự dẫn vào trạng thái chờ đợi, thí dụ nhờ các gọi hệ thống SleepEx(), WaitForSingleObjectEx() hay WaitForMultipleObjectEx(). Nếu việc đọc/viết được kết thúc một cách không đồng bộ, do đó, tiến trình thread lại được đánh thức và cũng khi đó, thủ tục kết thúc được gọi, thủ tục này có thể tạo thời có cho bước tiếp theo. 5.5. Các bài tập của chương 5 Bài tập 5.1. Về định thời truy cập ổ đĩa Trong chương này, bạn đã nghiên cứu các chiến lược định thời đối với việc truy cập ổ đĩa như FCFS, SSTF, LOOK, và SCAN. a). Việc dò tìm khi truy cập ổ đĩa có thể bị làm đói như thế nào? b). Các chiến lựơc riêng lẻ được biến hoá như thế nào, mà với điều này, khả năng làm đói không còn nữa? Bài tập 5.2. Về phân bố đan chen nhau trên ổ đĩa từ a). Sự phân bố đan chen trên ổ đĩa từ dùng để làm gì? b). Một ổ đĩa từ có một hệ số đan chen nhau bằng 2. Ổ đĩa chứa trên mỗi vòng xuyến khoảng 80 sector, mỗi sector có 256 Byte và quay với tốc độ 3600 vòng/phút. Để đọc thông tin trên tất cả các sector của một vòng xuyến một cách tuần tự thì cần bao nhiêu thời gian? Giả thiết rằng, đầu từ đọc/viết luôn luôn định vị đúng và một nữa vòng quay được sử dụng cho tới kho sectors số 0 nằm dưới đầu từ. c). bạn hãy nhắc lại vấn đề đối với một ổ đĩa tương tự, nhưng không có hệ số đan chen, và một ổ đĩa với hệ số đanchen bằng 3. Hỏi tỷ phần dữ liệu tăng gat giảm như thế nào Bài tập 5.3 Lưu trữ trên bộ nhớ đệm Bạn hãy quan sát mô hình các lớp sau đây: Hệ thống tệp tin Bộ kích tạo đao thiết bị Bộ kích tạo đơn thiết bị Bộ điều khiển Thiết bị Những ưu điểm và khuyết điểm nào đã được dẫn ra, khi lưu trữ đệm vào một trong các lớp được thực hiện? cho cái đó, bạn hãy phân biệt thành 4 trường hợhp. Bạn hãy lưu ý một cách đặc biệt khi dữ liệu linh động.
File đính kèm:
- HDH_chuong 5.pdf