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

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.

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.

doc 27 trang xuanthi 30/12/2022 1040
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ý ra vào", để 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_ra_vao.doc

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

  1. trợ giúp của tính chẵn lẻ giữa các biến được khai khẩn và 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 có 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 và 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 tà của tất cả các block thì đựơc nạp trên một ổ đĩa từ duy nhất, do đó, ở đây chỉ có 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 đó là ở 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 và đơn giản mới là một hệ thống an toàn và tiện lợi. Hạn chế lỡi nhờ ở đĩa ánh xạ và hệ thống RAID ở trong Windows NT Ơ trong hệ điều hành Windows NT, đối với việc quản lý một tệp tin có sai số lỗi sẽ có một bộ kích tạo đặc biệt (special driver), gọi là 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ư là 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 và chưa nhận biết được. Nếu bây giờ có 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
  2. 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ị là một phương pháp để chỉ các dữ liệu phải và sẽ được đưa chuyển như thế nào(?): Đó là 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 lý đối với bộ kích tạo các thiết bị định hưởng khối và đị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) và 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 ký tự nhận được đầu tiên, rồi nó được bộ kích tạo đọc tại đó. Ở thanh ghi xuất (dữ liệu), ký 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 ký 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 đó, nó 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 có đủ thời gian để tiếp nhận và thông dịch ký tự điều khiển, và chuyển vào bộ kích tạo trước khi bộ đệm bên bị tràn.
  3.  XX_ioctl là một gọi hệ thống, nó nhận được các thông số, mà 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 và đìề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ớ. Vì 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 có 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 và đượ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 đó nó đượ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ư là 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ị và đượ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 là 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 ký 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*/ 0, B_TAPE }, { nodev, nodev, nodev, nodev, /*1*/ 0,B_TAPE }, {xyopen, nulldev, xystrategy, xydump, /*2*/ xysize, 0} }; struct cdevsw cdevsw[ ] = { {cnopen, cnclose, cnread, cnwrite, /*0*/ cnioctl, nullev, cnselect, 0, 0, 0, }, { nodev, nodev, nodev, nodev, /*1*/
  4.  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 đó, nó 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, nó 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 có 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, mà 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 bộ kí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 là việc mà hệ thống có 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 để có 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 nó đượ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
  5. Đố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 xã 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 ở vị trí track số 6, dãy nhiệm vụ của nó đượ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 mà đầ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ừ có 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ụ có 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, mà địa chỉ track của nó 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ừ là 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 nó đượ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 là một nhiệm vụ nằm ở cuối đĩa từ (hay cuối khoảng đĩa chỉ) có 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 có 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 mà đầu từ phải đi qua là; 1+1+6+1+4+16+1 = 30 track.
  6. công việc sẽ diễn biến bình thường khi danh sách chỉ chứa đựng một nhiệm vụ duy nhất. Trong trường hợp này, tất cả các chiến lược đều tốt, nhất là chiến lược FCFS vừa đơn giản vừa tốt nhất. Các chiến lược để xử lý danh sách nhiệm vụ của block thì không phải là khả năng duy nhất để tối ưu thời gian truy cập. Điều quyết định để có thể thực hiện việc truy cập nhanh hơn là: Nếu chúng ta mô phỏng block logic với chỉ số trung tâm (central index) không phải trên sector 0 hay track 0 ở cuối đĩa từ; do đó, hành trình trung bình của đầu từ khi truy cập tới tất cả các track thì nhỏ hơn ở cuối và việc truy cập rõ ràng nhanh hơn. Ngược lại, nếu chỉ số trung tâm được giữ lại như một bản photocopy ở trong bộ nhở chính, do đó, chỉ có dãy các lệnh định vị trí là quyết định chứ không phải vị trí của chỉ số trung tâm. 5.4.2. Kểu bố trí đĩa từ xen kẽ (interleaving) Một khả năng tối ưu tiếp theo được dẫn ra cho trường hợp: Khi các blocks được ổ đĩa chuyển cho bộ điều khiển nhanh hơn khi chúng có thể được chuyển vận tiếp theo nhờ đầu từ. Trong trường hợp này, block số 4 không được đọc ngay sau block số 3; vì đĩa từ đã quay tiếp trong khi vận chuyển block số3; và bấy giờ nó đọc block số 5 chưa không đọc block số 4. khi đó, bộ điều khiển chờ đợi vòng quay kế tiếp của đĩa từ để cuối cùng có thể đọc được block số 4. Bây giờ, nếu chúng ta đổi việc đánh số các block, chẳng hạn block số 5 nhận số 4, nhờ vậy, chúng ta có thể tiếp tục đọc mà không cần thời gian chờ đợi. Trong trường họp này, nếu chỉ mỗi block vật lý thứ 2 được chọn để đánh số logic, do đó, cần dành nhiều thời gian cho việc xác định các block và gia tăng lưu lượng dữ liệu. Hình 5.14 (a) cho thấy việc đánh số vật lý được ghi chép ở ngời ổ đĩa. Trên các cung đĩa từ (semgent) ở phần bên trong, việc đánh số logic thích hợp được ghi nhận. Kiểu dông nghệ này được gọi là phép bố trí xen kẻ (interleaving) đĩa từ; số lượng các block (bị bỏ sót lần đầu khi đánh số) là yếu tố xen kẽ. Hình 5.14 (b) là cách đánh số đối với yếu tố xen kẻ 1 và 2 được đặt đối diện nhau. Yếu tố này phải được bộ phận kích tạo thông báo đối với việc tạo kiểu dáng cho bộ điều khiển và nó phụ thuộc vào tốc độ vận chuyển của hệ thông I/O của hệ điều hành. hình 5.14 trang 207 Những cơ chế được đàm luận cho đến nay để gia tăng hiệu suất bộ kích tạo cần phải được xem xét một cách toàn diện trong ngữ cảnh của bộ điều khiển. Một cách nguyên tắc, trường hợp có thể xuất hiện một cách dễ dàng: tất cả các biện pháp tối ưu đối với các bộ kích tạo đều được trang bị với những bộ vi xử lý độc đáo. Thí dụ, các bộ điều khiển như vậy có khả năng thay thế các block bị hư hỏng của đĩa từ nhờ các block dự trữ ở trên các track (chuyên dụng bình thường nhưng không dễ xen vào). Hình thái đặc biệt luôn luôn có hiệu lực, nếu có một block hư hỏng được nhận biết và được thuyên chuyển đo khỏi, tuy có thể không được bộ kích tạo nhận thấy. Với cái đó, tất cả sự nổ lực của bộ kích tạo cho thấy, cần phải hạn chế
  7. mà các block này cần đọc/viết. Danh sách các block trống bị làm trễ gấp đôi và được liên kết lại thành một vùng nhớ tập trung. Ngoài ra, có 2 con đường dẫn tới các thiết bị block: con đường thứ 1 qua tên một tệp tin và do đó, qua hệ thống tệp tin nguyên sơ, tức là qua thủ tục XX_stragety và con đường thư 2 qua tệp tin đặc biệt như là một thiết bị nguyên sơ, tức là qua thủ tục XX_read/XX_write. Vì nhờ việc đệm thêm của nút chỉ số (index node), mà khi có sự tổn thất mạng, hệ thống tệp tin hay bị làm tổn hại; do đó, ở nhịp độ đều đặn (khoảng 30 giây) của thủ tục sync(), tất cả các bộ đệm được viết lên đĩa từ và qua đó, chúng định dạng các dữ liệu. Điều đó sẽ được thực hiện khi thoát khỏi hệ thống (shut down). Thí dụ đệm thêm ở windows 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
  8. đượ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