Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore Bài giảng Hệ điều hành

Bài giảng Hệ điều hành

Published by Nguyen Thi Thuy Linh, 2021-11-05 15:32:48

Description: Biên soạn: Nguyễn Thị Thùy Linh
Khoa SP Toán - Tin Trướng ĐH Đồng Tháp

Search

Read the Text Version

hoặc trình biên dịch có thể gán các chương trình và dữ liệu đến các đoạn nhớ khác nhau.  Trong hệ thống sử dụng kỹ thuật phân đoạn, hiện tượng phân mảnh ngoài lại xuất hiện khi các khối nhớ tự do đều quá nhỏ, không đủ để chứa một phân đoạn. Kỹ thuật phân đoạn thể hiện được cấu trúc logic của chương trình, nhưng nó phải cấp phát các khối nhớ có kích thước khác nhau cho các phân đoạn của chương trình trên bộ nhớ vật lý, điều này phức tạp hơn nhiều so với việc cấp phát các khung trang. Để dung hòa vấn đề này các hệ điều hành có thể kết hợp cả phân trang và phân đoạn. 3.4.2.3. Phân đoạn kết hợp phân trang (Paged segmentation) Cả hai kỹ thuật phân trang và phân đoạn đều có những thế mạnh của nó. Sự phân trang, là trong suốt đối với người lập trình, loại bỏ được hiện tượng phân mảnh trong. Sự phân đoạn, là thấy được đối với người lập trình, có khả năng điều khiển các cấu trúc dữ liệu lớn dần và hỗ trợ chia sẻ và bảo vệ bộ nhớ. Để kết hợp những thuận lợi của cả hai kỹ thuật phân trang và phân đoạn, một số hệ thống được trang bị sự hỗ trợ của cả phần cứng CPU và phần mềm hệ điều hành để cài đặt kết hợp cả hai kỹ thuật này. Trong các hệ thống kết hợp phân trang và phân đoạn, không gian địa chỉ bộ nhớ của người dùng được chia thành các đoạn theo ý muốn của người lập trình, sau đó mỗi đoạn lại được chia thành các trang có kích thước cố định bằng nhau. Theo cách nhìn của người lập trình thì địa chỉ logic bao gồm một segment number và một segment offset. Theo cách nhìn của hệ thống thì segment offset được xem như một page number và page offser cho một trang trong phạm vi một segment được chỉ ra. Không gian địa chỉ luận lý là một tập các phân đoạn, mỗi phân đoạn được chia thành nhiều trang. Khi một tiến trình được đưa vào hệ thống, hệ điều hành sẽ cấp phát cho tiến trình các trang cần thiết để chứa đủ các phân đoạn của tiến trình.  Cơ chế MMU trong kỹ thuật phân đoạn kết hợp phân trang Để hỗ trợ kỹ thuật phân đoạn, cần có một bảng phân đoạn, nhưng giờ đây mỗi phân đoạn cần có một bảng trang phân biệt. 200

Hình 3.31. Mô hình phân đoạn kế hợp phân trang  Chuyển đổi địa chỉ: Mỗi địa chỉ logic là một bộ ba: <s,p,d>  số hiệu phân đoạn (s): sử dụng như chỉ mục đến phần tử tương ứng trong bảng phân đoạn.  số hiệu trang (p): sử dụng như chỉ mục đến phần tử tương ứng trong bảng trang của phân đoạn.  địa chỉ tương đối trong trang (d): kết hợp với địa chỉ bắt đầu của trang để tạo ra địa chỉ vật lý mà trình quản lý bộ nhớ sử dụng. 201

Hình 3.32. Hỗ trợ phần cứng của phân đoạn kết hợp phân trang Tất cả các mô hình tổ chức bộ nhớ trên đây đều có khuynh hướng cấp phát cho tiến trình toàn bộ các trang yêu cầu trước khi thật sự xử lý. Vì bộ nhớ vật lý có kích thước rất giới hạn, điều này dẫn đến hai khuyết điểm:  Kích thước tiến trình bị giới hạn bởi kích thước của bộ nhớ vật lý.  Khó có thể bảo trì nhiều tiến trình cùng lúc trong bộ nhớ, và như vậy khó nâng cao mức độ đa chương của hệ thống. 3.5. QUẢN LÝ BỘ NHỚ ẢO Nếu đặt toàn bộ không gian địa chỉ luận lý vào bộ nhớ vật lý, thì kích thước của chương trình bị giới hạn bởi kích thước bộ nhớ vật lý. Thực tế, trong nhiều trường hợp, chúng ta không cần phải nạp toàn bộ chương trình vào bộ nhớ vật lý cùng một lúc, vì tại một thời điểm chỉ có một chỉ thị của tiến trình được xử lý. Ví dụ, các chương trình đều có một đoạn mã lệnh xử lý lỗi, nhưng đoạn mã lệnh này hầu như rất ít khi được sử dụng vì hiếm khi xảy ra lỗi, trong trường hợp này, không cần thiết phải nạp đoạn mã lệnh xử lý lỗi từ đầu. Từ nhận xét trên, một giải pháp được đề xuất là cho phép thực hiện một chương trình chỉ được nạp từng phần vào bộ nhớ vật lý. Ý tưởng chính của giải pháp này là tại 202

mỗi thời điểm chỉ lưu trữ trong bộ nhớ vật lý các chỉ thị và dữ liệu của chương trình cần thiết cho việc thi hành tại thời điểm đó. Khi cần đến các chỉ thị khác, những chỉ thị mới sẽ được nạp vào bộ nhớ, tại vị trí trước đó bị chiếm giữ bởi các chỉ thị nay không còn cần đến nữa. Với giải pháp này, một chương trình có thể lớn hơn kích thước của vùng nhớ cấp phát cho nó. Một cách để thực hiện ý tưởng của giải pháp trên đây là sử dụng kỹ thuật phủ lắp. Kỹ thuật phủ lắp không đòi hỏi bất kỳ sự trợ giúp đặc biệt nào của hệ điều hành, nhưng trái lại, lập trình viên phải biết cách lập trình theo cấu trúc phủ lắp, và điều này đòi hỏi khá nhiều công sức. Để giải phóng lập trình viên khỏi các suy nghỉ về giới hạn của bộ nhớ, mà cũng không tăng thêm khó khăn cho công việc lập trình của họ, người ta nghĩ đến các kỹ thuật tự động, cho phép xử lý một chương trình có kích thước lớn chỉ với một vùng nhớ có kích thước nhỏ. Giải pháp được tìm thấy với khái niệm bộ nhớ ảo (Virtual Memory). 3.5.1. Khái niệm bộ nhớ ảo Bộ nhớ ảo là một kỹ thuật cho phép xử lý một tiến trình không được nạp toàn bộ vào bộ nhớ vật lý. Bộ nhớ ảo mô hình hóa bộ nhớ chính như một bảng lưu trữ rất lớn và đồng nhất, tách biệt hẳn khái niệm không gian địa chỉ luận lý và không gian địa chỉ vật lý. Người dùng chỉ nhìn thấy và làm việc trong không gian địa chỉ ảo (luận lý), việc chuyển đổi sang không gian địa chỉ vật lý được thực hiện tự động tại thời điểm thực thi chương trình.  Ưu điểm:  Nhờ việc tách biệt bộ nhớ ảo và bộ nhớ vật lý, có thể tổ chức một bộ nhớ ảo có kích thước lớn hơn bộ nhớ vật lý.  Bộ nhớ ảo cho phép giảm nhẹ công việc của lập trình viên vì họ không cần bận tâm đến giới hạn của vùng nhớ vật lý, cũng như không cần tổ chức chương trình theo cấu trúc phủ lắp. Người dùng có thể viết chương trình có không gian địa chỉ ảo rất lớn, đơn giản hoá công việc lập trình.  Vì mỗi chương trình người dùng có thể lấy ít hơn bộ nhớ vật lý nên nhiều chương trình hơn có thể được thực thi tại một thời điểm. Điều này giúp gia tăng việc sử dụng CPU và thông lượng nhưng không tăng thời gian đáp ứng. 203

 Yêu cầu ít nhập/xuất hơn để nạp hay hoán vị mỗi chương trình người dùng trong bộ nhớ vì thế mỗi chương trình người dùng sẽ chạy nhanh hơn.  Các quá trình dễ dàng chia sẻ tập tin và không gian địa chỉ, cung cấp cơ chế hữu hiệu cho việc tạo lập quá trình. Do đó, chạy một chương trình mà nó không nằm hoàn toàn nằm trong bộ nhớ có lợi cho cả người dùng và hệ thống.  Khuyết điểm:  Cần kết hợp kỹ thuật hoán vị để chuyển các phần của chương trình vào/ra giữa bộ nhớ chính và bộ nhớ phụ khi cần thiết.  Bộ nhớ ảo không dễ cài đặt và về thực chất có thể giảm năng lực nếu nó được dùng thiếu thận trọng. Trong chương này, chúng ta thảo luận bộ nhớ ảo được quản lý theo kỹ thuật phân trang theo yêu cầu và xem xét độ phức tạp và chi phí. Hình 3.33. Mô hình bộ nhớ ảo 3.5.2. Cài đặt bộ nhớ ảo Nguyên lý cơ bản của bộ nhớ ảo là vẫn dựa trên 2 kỹ thuật phân trang và phân đoạn, nhưng trong kỹ thuật bộ nhớ ảo:  Bộ phận quản lý bộ nhớ không nạp tất cả các trang/đoạn của một tiến trình vào bộ nhớ để nó hoạt động, mà chỉ nạp các trang/đoạn cần thiết tại thời điểm khởi tạo. Sau đó, khi cần bộ phận quản lý bộ nhớ sẽ dựa vào PCT hoặc SCT của mỗi tiến trình để nạp các trang/đoạn tiếp theo. 204

 Nếu có một trang/đoạn của một tiến trình cần được nạp vào bộ nhớ trong tình trạng trên bộ nhớ không còn khung trang/phân đoạn trống thì bộ phận quản lý bộ nhớ sẽ đưa một trang/đoạn không cần thiết tại thời điểm hiện tại ra bộ bộ nhớ ngoài (swap out), để lấy không gian nhớ trống đó nạp trang/đoạn vừa có yêu cầu. Trang/đoạn bị swap out sẽ được đưa vào tại thời điểm thích hợp hoặc cần thiết sau này (swap in). Cơ chế này gọi là kỹ thuật phân trang/đoạn theo yêu cầu. Vì vậy hệ điều hành có thể cài đặt bộ nhớ ảo theo 2 kỹ thuật:  Phân trang theo yêu cầu: Tức là phân trang kết hợp với swap.  Phân đoạn theo yêu cầu: Tức là phân đoạn kết hợp với swap. Cả hai kỹ thuật trên đều phải có sự hỗ trợ của phần cứng máy tính, cụ thể là CPU. Đa số các hệ điều hành đều chọn kỹ thuật phân trang theo yêu cầu, vì nó đơn giản, dễ cài đặt và chi phí thấp hơn. Hình 3.34. Phân biệt phân trang đơn và phân trang trang theo yêu cầu Trường hợp a, là trường hợp phân trang đơn: trong trường hợp này nếu bộ nhớ chỉ còn 3 frame trống thì tiến trình cũng sẽ không nạp vào bộ nhớ được. Vì phân trang 205

đơn đòi hỏi tất cả 4 page của tiến trình đều được nạp vào bộ nhớ. Rõ ràng sẽ là lãng phí bộ nhớ nếu biết rằng tiến trình này chỉ cần nạp vào bộ nhớ 2 trang P0, P2 là tiến trình có thể khởi tạo và bắt đầu hoạt động được. Trường hợp b, là trường hợp bộ nhớ ảo sử dụng kỹ thuật phân trang theo yêu cầu: trong trường hợp này hệ điều hành không nạp tất cả các page của tiến trình vào bộ nhớ mà chỉ nạp 2 page cần thiết ban đầu để tiến trình có thể khởi tạo và bắt đầu hoạt động được, mặc dầu trên bộ nhớ chính còn một vài frame còn trống. Rõ ràng trong trường hợp này hệ điều hành đã tiết kiệm được không gian bộ nhớ chính và nhờ đó mà hệ điều hành có thể nạp vào bộ nhớ nhiều tiến trình hơn và cho phép các tiến trình này hoạt động đồng thời với nhau. Bộ nhớ ảo là một kỹ thuật cho phép xử lý một tiến trình mà không cần nạp tất cả tiến trình vào bộ nhớ. Các trang/đoạn của một tiến trình, đang ở trên bộ nhớ phụ, mà chưa được nạp vào bộ nhớ chính sẽ được định vị tại một không gian nhớ đặc biệt trên bộ nhớ phụ (đĩa HDD), có thể gọi không gian nhớ này là bộ nhớ ảo của tiến trình. Với sự hỗ trợ của phần cứng hệ điều hành đã đưa ra các cơ chế thích hợp để nhận biết một trang/đoạn của tiến trình đang thực hiện là đang ở trên bộ nhớ chính hay trên bộ nhớ phụ. Như vậy bộ nhớ ảo đã mở rộng (ảo) được không gian bộ nhớ vật lý của hệ thống. Chương trình của người dùng chỉ nhìn thấy và làm việc trên không gian địa chỉ ảo, việc chuyển đổi từ địa chỉ ảo sang địa chỉ vật lý do bộ phận quản lý bộ nhớ MMU của hệ điều hành và CPU thực hiện. Để cài đặt được bộ nhớ ảo hệ điều hành cần phải có:  Một lượng không gian bộ nhớ phụ (đĩa HDD) cần thiết đủ để chứa các trang/đoạn bị swap out, không gian đĩa này được gọi là không gian hoán vị.  Có cơ chế để theo dõi các trang/đoạn của tất cả các tiến trình đang hoạt động trên bộ nhớ chính, là đang ở trên bộ nhớ chính hay ở trên bộ nhớ phụ. Trong trường hợp này hệ điều hành thường đưa thêm một bit trạng thái (bit present) vào các phần tử trong PCT hoặc SCT.  Dựa vào các tiêu chuẩn cụ thể để chọn một trang nào đó trong số các trang đang ở trên bộ nhớ chính để swap out trong trường hợp cần thiết. Các hệ điều hành đã đưa ra các thuật toán cụ thể (Thuật toán thay thế trang ở cuối chương) để phục vụ cho mục đích này. 206

Sự khác biệt giữa các kỹ thuật phân trang, phân đoạn trong các kỹ thuật bộ nhớ ảo thông qua bảng sau đây: Phân trang đơn Phân đoạn đơn Phân trang theo Phân đoạn theo yêu yêu cầu cầu Bộ nhớ chính được Bộ nhớ chính không Bộ nhớ chính được Bộ nhớ chính không chia thành các phần được phân vùng chia thành các phần được phân vùng nhỏ có kích thước trước. nhỏ có kích thước cố trước cố định, được gọi định, được gọi là các là các khung trang. khung trang Chương trình của Các đoạn của Chương trình của Các đoạn của người dùng được chia chương trình được người dùng được chương trình được thành các trang bởi chỉ ra bởi người lập chỉ ra bởi người lập trình biên dịch hoặc trình và được gởi chia thành các trang trình và được gởi hệ thống quản lý bộ đến cho trình biên bởi trình biên dịch đến cho trình biên nhớ. dịch. hoặc hệ thống quản dịch. lý bộ nhớ. Có thể xảy ra phân Không xảy ra phân Có thể xảy ra phân Không xảy ra phân mảnh trong, nhưng mảnh trong (trong mảnh trong, nhưng mảnh trong (trong có thể xảy ra phân phạm vi các frame). có thể xảy ra phân phạm vi các frame). mảnh ngoài. Không xảy ra phân mảnh ngoài. Không xảy ra phân mảnh ngoài. mảnh ngoài. Hệ điều hành phải Hệ điều hành phải Hệ điều hành phải Hệ điều hành phải duy trì một bảng duy trì một bảng duy trì một bảng duy trì một bảng trang cho mỗi tiến đoạn cho mỗi tiến trang cho mỗi tiến đoạn cho mỗi tiến trình để theo dõi các trình để theo dõi các trình để theo dõi các trình để theo dõi các trang được nạp vào đoạn của tiến trình trang của tiến trình đoạn của tiến trình trên bộ nhớ (được trên bộ nhớ (được trên bộ nhớ (được các khung trang nạp vào địa chỉ nào nạp vào các khung nạp vào địa chỉ nào và độ dài của đoạn) và độ dài của đoạn) trang nào) 207

Hệ điều hành phải Hệ điều hành phải Hệ điều hành phải Hệ điều hành phải duy trì một danh sách duy trì một danh duy trì một danh duy trì một danh để theo dõi các khung sách để theo dõi các sách để theo dõi các sách để theo dõi các trang còn trống trên phần còn trống trên phần còn trống trên bộ nhớ chính. bộ nhớ chính. khung trang còn bộ nhớ chính. trống trên bộ nhớ chính. CPU sử dụng CPU sử dụng CPU sử dụng CPU sử dụng (page number và (segment number (page number và offset) để tính địa và offset) để tính offset) để tính địa (segment number và chỉ tuyệt đối. địa chỉ tuyệt đối. chỉ tuyệt đối. offset) để tính địa chỉ tuyệt đối. Tất cả các trang Tất cả các đoạn Không phải nạp tất Không phải nạp tất của tiến trình phải của tiến trình phải cả các đoạn của tiến được nạp vào bộ được nạp vào bộ cả các trang của tiến nhớ chính để chạy nhớ chính để chạy trình vào các khung trừ khi khi sử dụng trừ khi khi sử trình vào các khung trang trên bộ nhớ các kỹthuật phủ lắp. dụng các kỹ thuật trang trên bộ nhớ chính khi tiến trình phủ lắp. chính khi tiến trình chạy. Các trang có chạy. Các trang có thể được đọc khi thể được đọc khi cần. cần. Đọc một trang vào Đọc một trang vào bộ nhớ chính có thể cần phải đưa một bộ nhớ chính có thể trang ra đĩa. cần phải đưa một hoặc đoạn ra đĩa. Bảng 3.2. Phân biệt giữa kỹ thuật phân trang và phân đoạn trong kỹ thuật bộ nhớ ảo 3.5.3. Kỹ thuật bộ nhớ ảo 3.5.3.1. Phân trang theo yêu cầu (Demand Paging) 208

Một hệ thống phân trang theo yêu cầu là hệ thống sử dụng kỹ thuật phân trang kết hợp với kỹ thuật hoán vị. Một tiến trình được xem như một tập các trang, thường trú trên bộ nhớ phụ (thường là đĩa). Khi cần xử lý, tiến trình sẽ được nạp vào bộ nhớ chính. Nhưng thay vì nạp toàn bộ chương trình, chỉ những trang cần thiết trong thời điểm hiện tại mới được nạp vào bộ nhớ. Như vậy một trang chỉ được nạp vào bộ nhớ chính khi có yêu cầu. Với mô hình này, cần cung cấp một cơ chế phần cứng giúp phân biệt các trang đang ở trong bộ nhớ chính và các trang trên đĩa. Có thể sử dụng lại bit valid-invalid nhưng với ngữ nghĩa mới:  valid : trang tương ứng là hợp lệ và đang ở trong bộ nhớ chính.  invalid : hoặc trang không hợp lệ (không thuộc về không gian địa chỉ của tiến trình) hoặc trang hợp lệ nhưng đang được lưu trên bộ nhớ phụ. Một phần tử trong bảng trang mô tả cho một trang không nằm trong bộ nhớ chính, sẽ được đánh dấu invalid và chứa địa chỉ của trang trên bộ nhớ phụ. 209

Hình 3.35. Bảng trang với một số trang trên bộ nhớ phụ 3.5.3.2. Cấu trúc bảng trang Cấu trúc bảng trang phải cho phép phản ánh tình trạng của một trang là đang nằm trong bộ nhớ chính hay bộ nhớ phụ. Bộ nhớ phụ lưu trữ những trang không được nạp vào bộ nhớ chính. Bộ nhớ phụ thường được sử dụng là đĩa, và vùng không gian đĩa dùng để lưu trữ tạm các trang trong kỹ thuật hoán vị được gọi là không gian hoán vị. Một bảng trang có nhiều mục từ. Mỗi mục từ là một phần tử trong bảng trang. Trong kỹ thuật bộ nhớ ảo một phần tử trong bảng trang sẽ chứa nhiều thông tin phức tạp hơn như sau: 210

Hình 3.36. Cấu trúc một phần tử của bảng trang  Page frame number - chỉ số khung trang là trường quan trọng nhất cho biết số thứ tự khung trang nơi mà trang này được định vị trong bộ nhớ vật lý.  Referenced: Khi một quá trình được nạp vào bộ nhớ bit này = 0. Khi có sự tham chiếu trên trang này thì bit Referenced được đặt lại =1.  Modified: Khi một quá trình được nạp vào bộ nhớ bit này = 0. Khi có sửa đổi nội dung trên trang này thì bit Modified được đặt lại =1.  Protection: chỉ ra kiểu truy xuất cho phép, Protection = 1: chỉ đọc ; Protection = 0: đọc/viết.  Present/absent: giá trị 1thì mục từ hợp lệ và có thể dùng; giá trị 0 thì trang không hợp lệ vì đây là trang ảo tức là mục từ này hiện không có trong bộ nhớ vật lý. Nếu CPU cố gắng truy xuất đến mục từ này sẽ gây lỗi về trang. Dựa vào 2 bit Modified và Referenced sẽ giúp hệ điều hành quyết định lựa chọn trang nào sẽ hoán vị ra không gian hoán vị và dành không gian bộ nhớ vật lý nạp cho một yêu cầu khác. Ngoài ra kích thước của trang còn ảnh hưởng đến tỉ lệ xảy ra lỗi trang. Ví dụ: khi kích thước của trang là rất nhỏ thì sẽ có một lượng lớn các trang của tiến trình trên bộ nhớ chính, sau một thời gian thì tất cả các trang của bộ nhớ sẽ chứa các tiến trình được tham chiếu gần đây, vì thế tốc độ xảy ra lỗi trang được giảm xuống. 3.5.3.3. Lỗi trang Mỗi một truy cập của CPU đến dữ liệu/chỉ thị phải thực hiện hai truy cập bộ nhớ: một truy cập đến bảng trang và một truy cập đến dữ liệu/chỉ thị trong bộ nhớ. Khi Truy xuất đến một trang được đánh dấu không hợp lệ trong bảng trang sẽ làm phát sinh một lỗi trang (page fault). Cơ chế phần cứng sẽ phát sinh một ngắt để báo (trap) cho hệ điều hành biết. Hệ điều hành sẽ xử lý lỗi trang như sau: 211

Hình 3.37. Các giai đoạn xử lý lỗi trang  Bước 1: Kiểm tra truy xuất đến bộ nhớ là hợp lệ hay không hợp lệ (đúng là không gian địa chỉ của tiến trình không?)  Bước 2: Nếu truy xuất không hợp lệ (truy xuất trái phép): sẽ kết thúc tiến trình Ngược lại : đến bước 3 (xử lý lỗi trang)  Bước 3 : Tìm vị trí chứa trang muốn truy xuất trên đĩa (không gian hoán vị)  Bước 4 : Tìm một khung trang trống trong bộ nhớ chính:  Nếu tìm thấy : đến bước 5.  Nếu không còn khung trang trống, chọn một khung trang « nạn nhân » và chuyển trang « nạn nhân » ra bộ nhớ phụ (swap out), cập nhật bảng trang tương ứng (trang vừa hoán vị ra sẽ trở nên không hợp lệ) rồi đến bước 5.  Bước 5: Chuyển trang muốn truy xuất từ bộ nhớ phụ vào bộ nhớ chính: nạp trang cần truy xuất vào khung trang trống đã chọn (swap in); cập nhật nội dung bảng trang tương ứng (trang vừa hoán vị vào là hợp lệ). 212

 Bước 6: Tái kích hoạt tiến trình người dùng. 3.5.3.4. Thay thế trang Khi xảy ra một lỗi trang, cần phải mang trang vắng mặt vào bộ nhớ. Nếu không có một khung trang nào trống, hệ điều hành cần thực hiện công việc thay thế trang – chọn một trang đang nằm trong bộ nhớ mà không được sử dụng tại thời điểm hiện tại và chuyển nó ra không gian hoán vị trên đĩa để giải phóng một khung trang dành chỗ nạp trang cần truy xuất vào bộ nhớ. Như vậy nếu không có khung trang trống, thì mỗi khi xảy ra lỗi trang cần phải thực hiện hai thao tác chuyển trang: chuyển một trang từ bộ nhớ chính ra bộ nhớ phụ (swap out) và nạp một trang khác từ bộ nhớ phụ vào bộ nhớ chính (swap in). Có thể giảm bớt số lần chuyển trang bằng cách sử dụng bit M (Modified bit). Bit này được gắn với mỗi trang để phản ánh tình trạng trang có bị cập nhật hay không: giá trị của bit được cơ chế phần cứng đặt là 1 mỗi lần có một từ được ghi vào trang, để ghi nhận nội dung trang có bị sửa đổi. Khi cần thay thế một trang, nếu bit cập nhật có giá trị là 1 thì trang cần được lưu lại trên đĩa, ngược lại, nếu bit cập nhật là 0, nghĩa là trang không bị thay đổi, thì không cần lưu trữ trang trở lại đĩa (bỏ qua thao tác swap out). Sự thay thế trang là cần thiết cho kỹ thuật phân trang theo yêu cầu. Nhờ cơ chế này, hệ thống có thể hoàn toàn tách rời bộ nhớ ảo và bộ nhớ vật lý, cung cấp cho lập trình viên một bộ nhớ ảo rất lớn so với bộ nhớ vật lý có kích thước nhỏ hơn rất nhiều. 3.5.3.4.1. Sự thi hành phân trang theo yêu cầu Việc áp dụng kỹ thuật phân trang theo yêu cầu có thể ảnh hưởng mạnh đến tình hình hoạt động của hệ thống. Gỉa sử p là xác suất xảy ra một lỗi trang (0 ≤ p ≤ 1): p = 0 : không có lỗi trang nào p = 1 : mỗi truy xuất sẽ phát sinh một lỗi trang Thời gian thật sự cần để thực hiện một truy xuất bộ nhớ (TEA) là: TEA = (1-p)ma + p (tdp) [+ swap out ] + swap in + tái kích hoạt 213

Trong công thức này, ma là thời gian truy xuất bộ nhớ, tdp thời gian xử lý lỗi trang. Có thể thấy rằng, để duy trì ở một mức độ chấp nhận được sự chậm trễ trong hoạt động của hệ thống do phân trang, cần phải duy trì tỷ lệ phát sinh lỗi trang thấp. Hơn nữa, để cài đặt kỹ thuật phân trang theo yêu cầu, cần phải giải quyết hai vấn đề chủ yếu: xây dựng một thuật toán cấp phát khung trang, và thuật toán thay thế trang. 3.5.3.4.2. Các thuật toán thay thế trang Vấn đề chính khi thay thế trang là chọn lựa một trang «nạn nhân» để chuyển ra bộ nhớ phụ. Có nhiều thuật toán thay thế trang khác nhau, nhưng tất cả cùng chung một mục tiêu: chọn trang «nạn nhân» là trang mà sau khi thay thế sẽ gây ra ít lỗi trang nhất. Có thể đánh giá hiệu qủa của một thuật toán bằng cách xử lý trên cùng một chuỗi các địa chỉ cần truy xuất và tính toán số lượng lỗi trang phát sinh. Ví dụ: Xét chuỗi các trang cần truy xuất là : 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 Để xác định số các lỗi trang xảy ra khi sử dụng một thuật toán thay thế trang nào đó trên cùng một chuỗi truy xuất cụ thể, cần phải biết số lượng khung trang còn trống đang sử dụng trong hệ thống là bao nhiêu. 3.5.3.4.2.1. Thuật toán FIFO Ý tưởng: Ghi nhận thời điểm một trang được mang vào bộ nhớ chính. Khi cần chọn trang để thay thế trang, trang vào bộ nhớ trước nhất sẽ được chọn. Ví dụ : sử dụng 3 khung trang , ban đầu cả 3 khung đều trống : 70120304230321201701 77722224440000000777 0000333222221111100 111100033333222221 **** ****** ** *** Ghi chú : * : có lỗi trang Tổng số lỗi trang : 15 lỗi 214

 Nhận xét:  Để áp dụng thuật toán FIFO, thực tế không nhất thiết phải ghi nhận thời điểm mỗi trang được nạp vào bộ nhớ, mà chỉ cần tổ chức quản lý các trang trong bộ nhớ dạng một danh sách FIFO, khi đó trang đầu danh sách sẽ được chọn để thay thế.  Thuật toán thay thế trang FIFO dễ hiểu, dễ cài đặt. Tuy nhiên thuật toán không lường trước trường hợp: trang được chọn để thay thế có thể là trang mà CPU đang cần. Vì vậy sau khi thay thế sẽ tiếp tục gây ra lỗi trang.  Số lượng lỗi trang xảy ra sẽ tăng lên khi số lượng khung trang sử dụng tăng. Hiện tượng này gọi là nghịch lý Belady. Ví dụ: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5 Sử dụng 3 khung trang, sẽ có 9 lỗi trang phát sinh 123412512345 111444555555 22211111333 3332222244 ******* ** Sử dụng 4 khung trang , sẽ có 10 lỗi trang phát sinh 123412512345 111111555544 22222211115 3333332222 444444333 **** ****** 3.5.3.4.2.2. Thuật toán tối ưu (OPTIMAL) Ý tưởng: Thay thế trang sẽ lâu được sử dụng nhất trong tương lai. Ví dụ: sử dụng 3 khung trang, khởi đầu đều trống: 215

70120304230321201701 77722222222222222777 0000004440000000000 111333333331111111 **** * * * * * Tổng số lỗi trang : 9 lỗi  Nhận xét: Thuật toán này bảo đảm số lượng lỗi trang phát sinh là thấp nhất , nó cũng không gánh chịu nghịch lý Belady. Tuy nhiên, khó khăn ở chổ hệ thống không thể biết trước chuỗi truy xuất của tiến trình trong tương lai. 3.5.3.4.2.3. Thuật toán «Lâu nhất chưa sử dụng » (Least-recently-used LRU) Ý tưởng: Với mỗi trang, ghi nhận thời điểm cuối cùng trang được truy cập, trang được chọn để thay thế sẽ là trang lâu nhất chưa được truy xuất. Ví dụ: sử dụng 3 khung trang, khởi đầu đều trống: 70120304230321201701 77722224440001111111 0000000033333300000 111333222222222777 **** * **** *** Tổng số lỗi trang: 12 lỗi  Nhận xét: Thuật toán này đòi hỏi phải được cơ chế phần cứng hỗ trợ để xác định một thứ tự cho các trang theo thời điểm truy xuất cuối cùng. Có thể cài đặt theo một trong hai cách:  Sử dụng bộ đếm: thêm vào cấu trúc của mỗi phần tử trong bảng trang một trường ghi nhận thời điểm truy xuất mới nhất, và thêm vào cấu trúc của CPU một bộ đếm. Mỗi lần có sự truy xuất bộ nhớ, giá trị của bộ đếm tương ứng 216

tăng lên 1. Mỗi lần thực hiện truy xuất đến một trang, giá trị của bộ đếm được ghi nhận vào trường thời điểm truy xuất mới nhất của phần tử tương ứng với trang trong bảng trang. Thay thế trang có giá trị trường thời điểm truy xuất mới nhất là nhỏ nhất.  Sử dụng stack: Tổ chức một stack lưu trữ các số hiệu trang. Mỗi khi thực hiện một truy xuất đến một trang, số hiệu của trang sẽ được xóa khỏi vị trí hiện hành trong stack và đưa lên đầu stack. Trang ở đỉnh stack là trang được truy xuất gần nhất, và trang ở đáy stack là trang lâu nhất chưa được sử dụng. 3.5.3.4.2.4. Các thuật toán xấp xỉ LRU Có ít hệ thống được cung cấp đầy đủ các hỗ trợ phần cứng để cài đặt được thuật toán LRU thật sự. Tuy nhiên, nhiều hệ thống được trang bị thêm một bit tham khảo (Reference):  Bit Reference, được khởi tạo là 0 cho mỗi phần tử trong bảng trang. Bit Reference này có giá trị 1 mỗi lần trang tương ứng được truy cập, và được phần cứng gán trở về 0 sau từng chu kỳ qui định trước.  Sau từng chu kỳ qui định trước, kiểm tra giá trị của các bit Reference, có thể xác định được trang nào đã được truy xuất đến và trang nào không, sau khi đã kiểm tra xong, các bit Reference được phần cứng gán trở về 0.  Với bit Reference, có thể biết được trang nào đã được truy xuất, nhưng không biết được thứ tự truy xuất. Thông tin không đầy đủ này dẫn đến nhiều thuật toán xấp xỉ LRU khác nhau.  Thuật toán với các bit tham khảo phụ Ý tưởng: Có thể thu thập thêm nhiều thông tin về thứ tự truy xuất hơn bằng cách lưu trữ các bit References sau từng khoảng thời gian đều đặn:  Với mỗi trang, sử dụng thêm 8 bit lịch sử (history) trong bảng trang  Sau từng khoảng thời gian nhất định (thường là100 millisecondes), một ngắt đồng hồ được phát sinh, và quyền điều khiển được chuyển cho hệ điều hành. Hệ điều hành đặt bit Reference của mỗi trang vào bit cao nhất trong 8 bit phụ trợ của trang đó bằng cách đẩy các bit khác sang phải 1 vị trí, bỏ luôn bit thấp nhất. 217

 Như vậy 8 bit thêm vào này sẽ lưu trữ tình hình truy xuất đến trang trong 8 chu kỳ cuối cùng.  Nếu gía trị của 8 bit là 00000000, thì trang tương ứng đã không được dùng đến suốt 8 chu kỳ cuối cùng, ngược lại nếu nó được dùng đến ít nhất 1 lần trong mỗi chu kỳ, thì 8 bit phụ trợ sẽ là 11111111. Một trang mà 8 bit phụ trợ có giá trị 11000100 sẽ được truy xuất gần thời điểm hiện tại hơn trang có 8 bit phụ trợ là 01110111.  Nếu xét 8 bit phụ trợ này như một số nguyên không dấu, thì trang LRU là trang có số phụ trợ nhỏ nhất.  Nhận xét: Số lượng các bit lịch sử có thể thay đổi tùy theo phần cứng, và phải được chọn sao cho việc cập nhật là nhanh nhất có thể.  Thuật toán «cơ hội thứ hai » Ý tưởng: Sử dụng một bit Reference duy nhất. Thuật toán cơ sở vẫn là FIFO, tuy nhiên khi chọn được một trang theo tiêu chuẩn FIFO, kiểm tra bit Reference của trang đó:  Nếu giá trị của bit Reference là 0, thay thế trang này.  Ngược lại, cho trang này một cơ hội thứ hai, và chọn trang FIFO tiếp theo.  Khi một trang được cho cơ hội thứ hai, giá trị của bit Reference được đặt lại là 0, và thời điểm vào Ready List được cập nhật lại là thời điểm hiện tại.  Một trang đã được cho cơ hội thứ hai sẽ không bị thay thế trước khi hệ thống đã thay thế hết những trang khác. Hơn nữa, nếu trang thường xuyên được sử dụng, bit Reference của nó sẽ duy trì được giá trị 1, và trang hầu như không bao giờ bị thay thế.  Nhận xét: Có thể cài đặt thuật toán «cơ hội thứ hai » với một xâu vòng. 218

Hình 3.38. Thuật toán thay thế trang cơ hội thứ hai  Thuật toán «cơ hội thứ hai» nâng cao (Not Recently Used - NRU) Ý tưởng : xem các bit Reference và bit Modified như một cặp có thứ tự . Với hai bit này, có thể có 4 tổ hợp tương đương 4 lớp sau: Lớp 1: (0,0) không truy xuất, không sửa đổi: đây là trang tốt nhất để thay thế. Lớp 2: (0,1) không truy xuất gần đây, nhưng đã bị sửa đổi: trường hợp này không thật tốt, vì trang cần được lưu trữ lại trước khi thay thế. Lớp 3: (1,0) được truy xuất gần đây, nhưng không bị sửa đổi: trang có thể nhanh chóng được tiếp tục được sử dụng. 219

Lớp 4: (1,1) được truy xuất gần đây, và bị sửa đổi: trang có thể nhanh chóng được tiếp tục được sử dụng, và trước khi thay thế cần phải được lưu trữ lại. Lớp 1 có độ ưu tiên thấp nhất, và lớp 4 có độ ưu tiên cao nhất. Một trang sẽ thuộc về một trong bốn lớp trên, tùy vào bit Reference và bit Modified của trang đó. Trang được chọn để thay thế là trang đầu tiên tìm thấy trong lớp có độ ưu tiên thấp nhất và khác rỗng.  Các thuật toán thống kê Ý tưởng: sử dụng một biến đếm lưu trữ số lần truy xuất đến một trang, và phát triển hai thuật toán sau:  Thuật toán LFU (The Least Frequently Used): thay thế trang có giá trị biến đếm nhỏ nhất, nghĩa là trang ít được dùng thường xuyên nhất.  Thuật toán MFU (The Most Frequently Used): thay thế trang có giá trị biến đếm lớn nhất, nghĩa là trang được sử dụng nhiều nhất. 3.5.3.4.3. Các giải thuật cấp phát khung trang Có 2 chiến lược  Cấp phát cố định:  Cấp phát công bằng: nếu có m khung trang và n quá trình, mỗi quá trình được cấp m/n khung trang.  Cấp phát tương xứng: dựa vào kích thước của tiến trình để cấp phát số khung trang tương xứng: Bước 1: Gọi si = kích thước của bộ nhớ ảo cho quá trình pi Bước 2: S = ∑ si Bước 3: m = tổng số khung trang có thể sử dụng Bước 4: Cấp phát ai khung trang tới quá trình pi : ai = (si / S) m  Cấp phát theo độ ưu tiên Sử dụng ý tưởng cấp phát tương xứng, nhưng thay vì sử dụng kích cỡ của quá trình, ta dùng độ ưu tiên. Nếu quá trình pi phát sinh lỗi trang, chọn một trong các khung trang của nó để thay thế, hoặc chọn một khung trang của quá trình khác với độ ưu tiên thấp hơn để thay thế. 220

Khi xử lý lỗi trang, trong trường hợp hệ thống không còn khung trống hệ điều hành phải chú ý đến các vấn đề sau:  Nên chọn trang nào trong số các trang trên bộ nhớ chính để swap out: Về vấn đề này chúng ta đã biết hệ điều hành sẽ áp dụng một thuật toán thay thay thế cụ thể nào đó, nhưng ở đây cần chú ý thêm rằng đối tượng của các thuật toán thay thế trang là chỉ các trang của tiến trình xảy ra lỗi trang, hay tất cả các trang của các tiến trình đang có trên bộ nhớ chính. Tức là, nên chọn trang của tiến trình xảy ra lỗi trang để thay thế (thay thế cục bộ), hay chọn một trang của tiến trình khác để thay thế (thay thế toàn cục). Nếu chọn trang của tiến trình xảy ra lỗi trang thì sẽ đơn giản hơn với hệ điều hành và không ảnh hưởng đến các tiến trình khác, nhưng cách này có thể làm cho tiến trình hiện tại lại tiếp tục xảy ra lỗi trang ngay sau khi hệ điều hành vừa xử lý lỗi trang cho nó, vì trang mà hệ điều hành vừa chọn để đưa ra (swap out) lại là trang cần truy xuất ở thời điểm tiếp theo. Nếu chọn trang của tiến trình khác thì tiến trình hiện tại sẽ ít có nguy cơ xảy ra lỗi trang ngay sau đó hơn, nhưng cách này sẽ phức tạp hơn cho hệ điều hành, vì hệ điều hành phải kiểm soát lỗi trang của nhiều tiến trình khác trong hệ thống, và hệ điều hành khó có thể dự đoán được nguy cơ xảy ra lỗi trang của các tiến trình trong hệ thống. Trong trường hợp này có thể lỗi trang sẽ lan truyền đến nhiều tiến trình khác trong hệ thống, khi đó việc xử lý lỗi trang của hệ điều hành sẽ phức tạp hơn rất nhiều. Đa số các hệ điều hành đều chọn cách thứ nhất vì nó đơn giản và không ảnh hưởng đến các tiến trình khác trong hệ thống.  “Neo” một số trang: Trên bộ nhớ chính tồn tại các trang của các tiến trình đặc biệt quan trọng đối với hệ thống, nếu các tiến trình này bị tạm dừng thì sẽ ảnh hưởng rất lớn đến hệ thống và có thể làm cho hệ thống ngừng hoạt động, nên hệ điều hành không được đưa các trang này ra đĩa trong bất kỳ trường hợp nào. Để tránh các thuật toán thay thế trang chọn các trang này hệ điều hành tổ chức đánh dấu các trang này, bằng cách đưa thêm một bit mới vào các phần tử trong các PCT, bit này được gọi là bit neo. Như vậy, các thuật toán thay thế trang sẽ không xem xét đến các trang được đánh dấu neo khi cần phải đưa một trang nào đó ra đĩa.  Phải tránh được trường hợp hệ thống xảy ra hiện tượng “trì trệ hệ thống”: Trì trệ hệ thống là hiện tượng lỗi trang xảy ra liên tục làm cho hệ thống luôn ở trong tình 221

trạng xử lý lỗi trang, tức là đa phần thời gian xử lý của CPU đều dành cho việc xử lý lỗi trang của hệ điều hành.  Đánh dấu các trang bị thay đổi: Khi xử lý lỗi trang, ta thấy hệ điều hành thường phải thực hiện thao tác swap out. Tức là, hệ điều hành phải tốn thời gian cho thao tác swap out, điều này sẽ làm giảm tốc độ của hệ thống và có thể gây lãng phí thời gian xử lý của CPU. Hệ điều hành có thể hạn chế được điều này bằng cách: hệ điều hành chỉ thực sự swap out một trang khi trang đó đã bị thay đổi kể từ lần nó được nạp vào bộ nhớ gần đây nhất. Khi quyết định swap out một trang để lấy khung trang trống để nạp một trang mới vào bộ nhớ, mà trang cần swap này không bị thay đổi kể từ lần nạp gần đây nhất, hệ điều hành sẽ không swap out nó mà hệ điều hành chỉ nạp trang mới vào bộ nhớ và ghi đè lên nó, điều này có nghĩa là hệ điều hành đã tiết kiện được thời gian swap out một trang ra đĩa. Để làm được điều này hệ điều hành phải giải quyết hai vấn đề sau: Thứ nhất, làm thế nào để xác định được một trang là đã bị thay đổi hay chưa kể từ lần nạp vào bộ nhớ gần đây nhất. Thứ hai, nếu không swap out một trang thì khi cần hệ điều hành sẽ swap in nó từ đâu. Đối với vấn đề thứ nhất: hệ điều hành chỉ cần xét bit modified của trang này trong bảng trang bằng 1thì nội dung của trang này đã bị thay đổi so với lần nạp vào bộ nhớ gần đây nhất. Đối với vấn đề thứ hai: hệ điều hành có thể swap in một trang mà ví trí ban đầu của nó trên đĩa, hoặc tại không gian hoán vị của nó. Trong một số hệ điều hành khi một tiến trình được tạo thì lập tức hệ điều hành sẽ cấp cho nó một không gian hoán vị trên đĩa, bất kỳ khi nào tiến trình bị swap out nó đều được chuyển nó đến không gian hoán vị của nó, khi tiến trình kết thúc thì không gian hoán vị của nó sẽ được giải phóng. Như vậy để chuẩn bị cho việc swap in sau này, khi nạp một trang của tiến trình vào bộ nhớ hệ điều hành sẽ ghi nội dung của trang này vào không gian hoán vị của nó. 3.6. TÓM TẮT Có nhiều cách tiếp cận khác nhau để tổ chức quản lý bộ nhớ, nhưng nhìn chung đều đạt đến các mục tiêu sau :  Cấp phát kịp thời và đầy đủ đáp ứng yêu cầu của quá tiến trình.  Quá trình chuyển đổi địa chỉ, tổ chức cấp phát bộ nhớ là trong suốt với người dùng, và có khả năng tái định vị.  Tận dụng hiệu quả bộ nhớ (ít có vùng nhớ không sử dụng được) 222

 Bộ nhớ được bảo vệ tốt  Có khả năng chia sẻ bộ nhớ giữa các tiến trình Tổ chức bộ nhớ chính có thể cấp phát liên tục hoặc cấp phát không liên tục. Khi không gian bộ nhớ chính cạn kiệt người dùng vẫn có thể chạy chương trình của mình với kích thước lớn vì nhờ sự có mặt của bộ nhớ ảo. Bộ nhớ ảo là một kỹ thuật cho phép không gian địa chỉ luận lý được ánh xạ vào bộ nhớ vật lý nhỏ hơn. Bộ nhớ ảo cũng cho phép cấp độ đa chương được gia tăng, tăng khả năng sử dụng CPU. Ngoài ra, người lập trình không phải bận tâm về không gian giới hạn của bộ nhớ. 223

Câu hỏi ôn tập 1. Chức năng bộ quản lý bộ nhớ là gì? 2. Quản lý bộ nhớ thực hiện nhiệm vụ gì? Giai đoạn nào do hệ điều hành thực hiện, giai đoạn nào cần sự trợ giúp của phần cứng? 3. Phân biệt địa chỉ luận lý và địa chỉ vật lý? 4. Phân biệt phân mảnh trong, phân mảnh ngoài. Các giải thuật cấp phát bộ nhớ nào thì gặp phải các vấn đề này? Cho ví dụ? 5. Phân tích ưu điểm, khuyết điểm của tổ chức bộ nhớ theo cơ chế phân trang và phân đoạn? 6. Tìm hiểu bộ nhớ Ram của MS-DOS. 7. Tìm hiểu sự phân trang/đoạn trong Windows NT. 8. Tìm hiểu quản lý bộ nhớ trong Windows 2000. 9. Xét một hệ thống trong đó một chương trình khi được nạp vào bộ nhớ sẽ phân biệt hoàn toàn phân đoạn mã lệnh và phân đoạn dữ liệu. Giả sử CPU sẽ xác định được khi nào cần truy xuất lệnh hay dữ liệu, và phải truy xuất ở đâu. Khi đó mỗi chương trình sẽ được cung cấp 2 bộ thanh ghi base-limit: một cho phân đoạn mã lệnh, và một cho phân đoạn dữ liệu. Bộ thanh ghi base-limit của phân đoạn mã lệnh tự động được đặt thuộc tính read-only. Thảo luận các ưu và khuyết điểm của hệ thống này. 10. Tại sao kích thước trang luôn là lũy thừa của 2 ? 11. Tại sao trong hệ thống sử dụng kỹ thuật phân trang, một tiến trình không thể truy xuất đến vùng nhớ không được cấp cho nó? Làm cách nào hệ điều hành có thể cho phép sự truy xuất này xảy ra? Hệ điều hành có nên cho phép điều đó không ? Tại sao? 12. Nếu cho phép hai phần tử trong bảng trang cùng lưu trữ một số hiệu khung trang trong bộ nhớ thì sẽ có hiệu quả gì ?Giải thích làm cách nào hiệu quả này có thể được sử dụng để giảm thời gian cần khi sao chép một khối lượng lớn vùng nhớ từ vị trí này sang vị trí khác. Khi đó nếu sửa nội dung một trang thì sẽ tác động đến trang còn lại thế nào? 13. Vì sao đôi lúc người ta kết hợp hai kỹ thuật phân trang và phân đoạn? 224

14. Mô tả cơ chế cho phép một phân đoạn có thể thuộc về không gian điạ chỉ của hai tiến trình. 15. Giải thích vì sao chia sẻ một module trong kỹ thuật phân đoạn lại dễ hơn trong kỹ thuật phân trang? Bài Tập Bài 1: Hệ thống bộ nhớ dùng cơ chế phân khu động, kích thước ban đầu 1024M. Các tiến trình đến lần lược theo thứ tự sau. Hãy cấp phát bộ nhớ cho các tiến trình? Request A 130K Request B 100K Return A Request C 50K Return B Request D 80K Return C Request E 60K Returrn D Request F 80K Retrun E Request G 80K Retrun F Retrun G Bài 2: Cho hiện trạng các tiến trình nằm trong bộ nhớ chính như sau: a) Giả sử tiến trình mới F yêu cầu 3 đơn vị cấp phát. Hãy vẽ lại hiện trạng bộ nhớ sau khi dùng giải thuật Best – fit để cấp phát bộ nhớ cho tiến trình F trên. b) Vẽ lại hiện trạng bộ nhớ (dùng bảng đồ bit) sau khi thực hiện câu a và tiến trình E kết thúc. Bài 3: Giả sử bộ nhớ chính gồm các phân vùng trống có kích thước theo thứ tự là 600K, 500K, 200K, 300K. Các tiến trình đến theo thứ tự yêu cầu kích thước tương ứng 225

P1(250K) , P2(400K) , P3(150K) và P4(250K) sẽ được cấp phát bộ nhớ như thế nào, nếu sử dụng: a) Thuật toán First fit b) Thuật toán Best fit c) Thuật toán Worst fit Thuật toán nào cho phép sử dụng bộ nhớ hiệu quả nhất trong các trường hợp trên? Bài 4: Bộ nhớ chính kích thước 2M. Hãy cấp phát bộ nhớ theo hệ thống bạn thân cho các tiến trình đến theo thứ tự sau: P1 (100K), P2 (60K) , P3 (120K), P4 (76K), RETURN (P3) , P5 (50K) , RETURN (P1), RETURN (P2) , RETURN (P4) , RETURN (P5). Bài 5: Bộ nhớ gồm 4 quá trình và 4 lỗ trống như sau. Mỗi đvcp là 4KB. Qúa trình A 3 B CD Địa chỉ 0 4 7 12 15 18 20 24 Tổng số đvcp 3 5 3 3 2 4 10 a) Vẽ bản đồ bit để quản lý hiện trạng bộ nhớ trên. b) Vẽ lại hiện trạng bộ nhớ sau khi thực hiện các yêu cầu sau (các câu sau là độc lập nhau):  Quá trình A yêu cầu 2 đvcp theo giải thuật First-fit  Quá trình F yêu cầu 5KB theo giải thuật Best-fit và D kết thúc.  G yêu cầu 7KB theo giải thuật worst-fit và C kết thúc.  H yêu cầu 10KB theo First-fit. Và yêu cầu của I(2KB), J(5KB), K(1KB) theo Next-fit. Bài 6: Xét một không gian địa chỉ có 8 trang, mỗi trang có kích thước 1K. ánh xạ vào bộ nhớ vật lý có 32 khung trang. a) Địa chỉ ảo gồm bao nhiêu bit? b) Địa chỉ thật gồm bao nhiêu bit? c) Địa chỉ độ dời bao nhiêu bit? 226

Bài 7: Một hệ thống bộ nhớ dùng cơ chế phân trang theo yêu cầu, sử dụng địa chỉ luận lý 8bit, dung lượng bộ nhớ chính 64M, hệ điều hành sử dụng 4bit để làm địa chỉ độ dời. a) Tính tổng số trang luận lý, tổng số trang vật lý? b) Tính kích thước trang? c) Dùng bao nhiêu bit để đánh địa chỉ cho bộ nhớ thật, bao nhiêu bit để đánh địa chỉ cho trang và bao nhiêu bit để đánh địa chỉ cho khung trang? Bài 8: Xét một hệ thống sử dụng kỹ thuật phân trang, với bảng trang được lưu trữ trong bộ nhớ chính. a) Nếu thời gian cho một lần truy xuất bộ nhớ bình thường là 200 nanoseconds, thì mất bao nhiêu thời gian cho một thao tác truy xuất bộ nhớ trong hệ thống này? b) Nếu sử dụng TLBs với hit-ratio (tỉ lệ tìm thấy) là 75%, thời gian để tìm trong TLBs xem như bằng 0, tính thời gian truy xuất bộ nhớ trong hệ thống? Bài 9: Giả sử bộ nhớ chính có 4 khung trang trống. Tương ứng mỗi giải thuật sau đây, hãy tính tổng số lỗi trang và vẽ lại khung trang ở từng trường hợp phát sinh lỗi ứng với chuỗi tham khảo sau: 9 1 452 8 1 3 2 1 8 9 4 3 3 6 5 a) Giải thuật thay thế trang FIFO. b) Giải thuật thay thế trang OPT. c) Giải thuật thay thế trang LRU. Giải thuật nào được xem là tối ưu nhất trong các trường hợp trên? Bài 10: Hệ thống bộ nhớ theo cơ chế phân trang gồm bộ nhớ chính 32KB, bộ nhớ ảo 64KB, kích thước trang và khung trang là 4KB, bảng trang được cho như sau. Xác định địa chỉ vật lý khi biết các địa chỉ luận lý sau: a. 2798 b. 3:300 c. 2,5 d. 16A0H e. 0011 0000 0000 1011 227

Bài 11: Các tiến trình P1,P2,P3 cùng tồn tại trong bộ nhớ, tại thời điểm biên dịch các tiến trình được cấp phát các trang như sau: page P1 P2 P3 0 Symbol table Symbol table Symbol table 1 common routines common routines common routines 2 data1 data2 data2 Với danh sách các khung trang trống sau. Hãy định vị các trang vào các khung trang trống trong bộ nhớ vật lý và vẽ bảng trang (PCT)? Danh sách 12 20 18 16 4 15 5 2 30 11 7 khung trang trống 228

Bài 12: Một tiến trình được nạp vào bộ nhớ theo mô hình phân trang với kích thước trang là 1024 byte. Bảng trang như sau. Hãy chuyển các địa chỉ logic sau thành địa chỉ vật lý? a) 1225 1 b) 3255 5 c) 3:1000 3 d) 96721 6 Bài 13: Một bộ nhớ quản lý theo cơ chế phân đoạn, có bảng phân đoạn sau đây: Segment Base Length 0 219 600 1 2300 14 2 90 100 3 1327 580 4 1952 96 Hãy tìm địa chỉ vật lý tương ứng với các địa chỉ logic sau đây và vẽ hình minh họa. a. 0,430 d. 3,400 b. 1,10 e. 4,112 c. 2,500 f. 1,15 229

TÀI LIỆU THAM KHẢO [1] Trần Hạnh Nhi, Giáo trình hệ điều hành nâng cao, Đại học Khoa học Tự nhiên TP.HCM, 2004. [2] [Lê Khắc Nhiên Ân, Hoàng Kiếm], Giáo trình Nhập môn hệ điều hành, Đại học Khoa học Tự nhiên, TP.HCM 2004. [3] Nguyễn Kim Tuấn, Giáo trình Hệ điều hành, Đại học Huế, 2004. [4] Nguyễn Phú Trường, Giáo trình Hệ điều hành, Đại học Cần Thơ, 2005 230

CHƯƠNG 4: QUẢN LÝ TẬP TIN VÀ ĐĨA 4.1. MỤC TIÊU Trong hầu hết các ứng dụng, tập tin là thành phần chủ yếu. Cho dù mục tiêu của ứng dụng là gì nó cũng phải bao gồm phát sinh và sử dụng thông tin. Thông thường đầu vào của các ứng dụng là tập tin và đầu ra cũng là tập tin cho việc truy xuất của người dùng và các chương trình khác sau này. Bài học này này xoay quanh các vấn đề:  Hiểu được khái niệm về tập tin?  Hiểu cách thức tổ chức và quản lý tập tin như thế nào?  Hiểu các cơ chế cài đặt hệ thống tập tin trên các hệ điều hành.  Biết các thao tác với tập tin, một số tính chất của tập tin.  Biết cấu trúc và tổ chức lưu trữ của đĩa.  Vận dụng cấu trúc dữ liệu và kiến trúc máy tính để cài đặt hệ thống tập tin. Trong khi một tiến trình đang chạy nó có thể lưu trữ một lượng giới hạn thông tin trong phạm vị không gian địa chỉ sở hữu của nó. Tuy nhiên khả năng lưu trữ này bị giới hạn bởi kích thước không gian địa chỉ ảo của hệ thống. Đối với một vài ứng dụng thì không gian này là vừa đủ, nhưng đối với một số ứng dụng khác thì nó là quá nhỏ. Mặt khác, nếu lưu giữ thông tin trong không gian địa chỉ của tiến trình thì thông tin này sẽ bị mất khi tiến trình kết thúc. Vấn đề thứ ba là phải đáp ứng việc truy cập thông tin đồng thời giữa các tiến trình trong môi trường hệ điều hành đa nhiệm. Những vấn đề trên chúng ta đã biết trong các chương Quản lý tiến trình và Quản lý bộ nhớ của tài liệu này. Để giải quyết những vấn đề trên hệ điều hành phải thiết kế một hệ thống lưu trữ thông tin sao cho: Thứ nhất là phải lưu trữ được một khối lượng lớn thông tin. Thứ hai là thông tin phải được bảo toàn khi tiến trình sử dụng nó kết thúc. Và cuối cùng là có thể có nhiều tiến trình truy xuất thông tin đồng thời. Giải pháp cho tất cả vấn đề trên là lưu trữ thông tin trên đĩa và các thiết bị media khác trong các đơn vị dữ liệu, được gọi là các tập tin (file). Các tiến trình có thể đọc 231

thông tin của tập tin và rồi ghi mới thông tin vào tập tin nếu cần thiết. Thông tin được lưu trữ trong tập tin phải không bị tác động bởi việc tạo và kết thúc tiến trình. Các tập tin được quản lý bởi hệ điều hành. Thành phần hệ điều hành tham gia trực tiếp vào quá trình quản lý các tập tin trên đĩa được gọi là hệ thống tập tin. Hệ điều hành phải xây dựng cấu trúc và tổ chức hoạt động của hệ thống tập tin. Một trong những nhiệm vụ quan trọng của hệ thống tập tin là theo dõi việc lưu trữ tập tin trên đĩa, theo dõi và điều hành việc truy cập tập tin của các tiến trình, bảo vệ tập tin và nội dung của tập tin, …Cấu trúc, tổ chức hoạt động và những nhiệm vụ của hệ thống tập tin của hệ điều hành, của các hệ điều hành cụ thể, sẽ được chúng ta xem xét trong chương này. 4.2. TỔNG QUAN VỀ QUẢN LÝ TẬP TIN VÀ ĐĨA 4.2.1. Tập tin và hệ thống quản lý tập tin 4.2.1.1. Tập tin (file) - Tập tin: là đơn vị logic được lưu trữ và xử lý bởi thành phần quản lý tập tin của hệ điều hành. - Nội dung của tập tin: có thể là một chương trình, một tập các thủ tục hoặc một khối dữ liệu. Nó có thể là một dãy tuần tự các Byte không cấu trúc, hệ điều hành không biết nội dung của tập tin. Một dãy các record có chiều dài cố định. Hay là một cấu trúc cây, gồm cây của những record có thể không có cùng độ dài, mỗi record có một trường khoá để giúp cho việc tìm kiếm nó được nhanh hơn. - Các kiểu tập tin:  Tập tin thường: là tập tin văn bản hay tập tin nhị phân chứa thông tin của người dùng.  Tập tin thư mục: là những tập tin hệ thống dùng để lưu giữ cấu trúc của hệ thống tập tin.  Tập tin có ký tự đặc biệt: liên quan đến nhập xuất thông qua các thiết bị nhập xuất tuần tự như màn hình, máy in, mạng.  Tập tin khối: dùng để truy xuất trên các thiết bị lưu trữ khối (đĩa là thiết bị lưu trữ khối). 232

- Thiết bị lưu trữ tập tin: thường được chia thành các block có kích thước cố định bằng nhau, các block được đánh địa chỉ để phân biệt. Thành phần quản lý tập tin của hệ điều hành có nhiệm vụ cấp phát và thu hồi các block cho các tập tin khi cần thiết. Vì kích thước tập tin có thể thay đổi, nên các hệ điều hành thường tổ chức cấp phát động các block cho các tập tin. Hệ điều hành có thể tổ chức cấp phát tĩnh block cho các tập tin có kích thước không thay đổi như các tập tin thực thi, các tập tin thư viện, … Cấp phát tĩnh sẽ nhanh và đơn giản hơn nhiều so với cấp phát động. - Các hệ điều hành cho phép truy xuất tập tin theo 2 cách tuần tự và ngẫu nhiên:  Truy xuất tuần tự: Các tiến trình có thể đọc tất cả các Byte hoặc các record trong tập tin, theo thứ tự, từ một vị trí bắt đầu nào đó mà không thể bỏ qua một Byte hay một record nào.  Truy cập ngẫu nhiên: Thì ngược lại, các tiến trình có thể truy xuất tại bất kỳ một Byte hay một record nào đó trong tập tin. Trong cả hai cách trên đều phải chỉ ra vị trí bắt đầu đọc. Trong cách thứ nhất, mỗi thao tác đọc cần phải xác định ví trí bắt đầu đọc trong tập tin. Trong cách thứ 2, trước khi đọc hệ thống phải tìm đến (SEEK) vị trí bắt đầu đọc, sau đó tiến hành đọc tuần tự như cách thứ nhất. 4.2.1.2. Hệ thống quản lý tập tin (File management System) Hệ thống quản lý tập tin, hay gọi ngắn gọn là hệ thống tập tin, là một tập các dịch vụ mà hệ điều hành cung cấp cho người dùng và chương trình người dùng để các đối tượng này sử dụng các tập tin trên hệ thống. Người dùng và chương trình của người dùng chỉ có thể truy xuất các tập tin thông qua hệ thống tập tin. Hệ thống quản lý tập tin của hệ điều hành phải đáp ứng các mục tiêu cơ bản sau đây: Đáp ứng các yêu cầu về lưu trữ dữ liệu của người dùng, bao gồm:  Khả năng lưu trữ, độ tin cậy và hiệu suất.  Cực tiểu hay loại bỏ các nguy cơ có thể dẫn đến hỏng hoặc mất dữ liệu.  Cung cấp sự hỗ trợ vào/ra cho nhiều loại thiết bị lưu trữ khác nhau.  Cung cấp sự hỗ trợ vào/ra cho nhiều người dùng trong các hệ thống đa người dùng.  Cung cấp một tập chuẩn các thủ tục giao diện vào/ra. 233

Đối với người dùng thì hệ thống quản lý tập tin của một hệ điều hành phải đáp ứng các yêu cầu tối thiểu sau đây:  Mỗi người dùng phải có thể tạo (create), xoá (delete) và thay đổi (change) các tập tin.  Mỗi người dùng có thể được điều khiển để truy cập đến các tập tin của người dùng khác.  Mỗi người dùng phải có thể di chuyển dữ liệu giữa các tập tin.  Mỗi người dùng phải có thể truy cập đến các tập tin của họ thông qua tên tượng trưng của tập tin.  Mỗi người dùng phải có thể dự phòng và khôi phục lại các tập tin của họ trong trường hợp hệ thống bị hỏng. 4.2.1.3. Kiến trúc hệ thống tập tin (File System Architecture): Các hệ điều hành khác nhau có cách tổ chức hay kiến trúc của hệ thống tập tin khác nhau. Hình vẽ sau đây trình bày một kiến trúc hệ thống tập tin chung nhất mà các hệ điều hành thường sử dụng. Hình 4.1. Kiến trúc hệ thống quản lý tập tin  Cấp thấp nhất: device driver là các điều khiển thiết bị truyền thông trực tiếp với các thiết bị ngoại vi. Device driver chịu trách nhiệm khởi tạo một thao tác vào/ra trên thiết bị và xử lý các yêu cầu vào/ra. Các device driver trong hệ thống tập tin thường là các điều khiển đĩa. 234

 Basic file system: hệ thống tập tin cơ sở hoặc cấp vào/ra vật lý, đó là giao diện chính giữa môi trường bên ngoài với hệ thống máy tính. Nó giao tiếp với các block dữ liệu trao đổi giữa các đĩa với hệ thống. Vì thế nó được kết nối với các block trên đĩa và các buffer trên bộ nhớ chính. Nó không hiểu các dữ liệu cũng như các cấu trúc tập tin phức tạp.  Basic I/O supervisor: chịu trách nhiệm khởi tạo và kết thúc tất cả các thao tác vào/ra tập tin. Tại cấp này, các cấu trúc điều khiển được duy trì, các cấu trúc điều khiển này giao tiếp với thiết bị vào/ra, bộ phận lập lịch đọc đĩa và bộ phận quản lý trạng thái tập tin. Basic I/O supervisor kết hợp với các bộ phận lập lịch đọc đĩa để tối ưu các thao tác đọc đĩa, nhằm góp phần tăng tốc độ truy xuất tập tin của các chương trình người dùng.  Logical I/O: Cấp vào/ra logic là thành phần quan trọng của hệ thống tập tin, nó cho phép người dùng và chương trình người dùng truy cập đến các record. Trong khi hệ thống tập tin cơ sở giao tiếp với các block dữ liệu, thì logical I/O giao tiếp với các record file. Logical I/O cung cấp các công cụ chung nhất để thực hiện các thao tác vào/ra tập tin dựa trên record.  Cấp trên cùng của kiến trúc hệ thống tập tin kết hợp chặt chẽ với người dùng. Nó cung cấp một giao diên chuẩn giữa chương trình người dùng, hệ thống tập tin và thiết bị lưu trữ dữ liệu. Các phương pháp truy cập dữ liệu khác nhau phản ánh các cấu trúc tập tin khác nhau và các cách khác nhau để truy cập và xử lý dữ liệu. Các phương pháp truy cập đó là: Pile, Sequential file, Indexed- sequential file, Indexed file, Hashed, vv. 4.2.2. Bảng danh mục và tập tin chia sẻ 4.2.2.1. Bảng danh mục (Directory Table): Các hệ điều hành phải tổ chức bảng danh mục, để lưu trữ các thông tin liên quan đến các tập tin và các thư mục đang tồn tại trên đĩa (hoặc thiết bị lưu trữ khác), đặc biệt là thông tin cho biết vị trí lưu trữ nội dung của một tập tin trên đĩa. Để truy xuất đến một tập tin hệ điều hành cần phải thông qua bảng danh mục này. Bảng danh mục gồm nhiều Entry (phần tử/mục vào), mỗi phần tử dùng để chứa thông tin của một tập tin hay thư mục trên đĩa. Khi có một tập tin/ thư mục được tạo ra thì hệ điều hành sẽ dùng một phần tử trong bảng danh mục để chứa các thông tin của 235

nó. Khi một tập tin/ thư mục bị xoá khỏi đĩa thì hệ điều hành sẽ giải phóng phần tử của nó trong bảng danh mục. Có thể xem một phần tử trong bảng danh mục là một sự tương ứng giữa tập tin và vị trí lưu trữ của tập tin tên đĩa. Số lượng phần tử trong bảng danh mục có thể bị giới hạn cố định trước hoặc không có giới hạn và có thể tăng/giảm nếu cần. Bảng danh mục có thể được chứa tại một không gian đặc biệt nào đó trên đĩa, hoặc có thể chứa trong một tập tin metadata (tập tin dạng dữ liệu đặc biệt dùng cho hệ thống quản lý tập tin) nào đó trên đĩa. Trong quá trình hoạt động của hệ thống bảng danh mục thường được hệ điều hành nạp từ đĩa vào bộ nhớ, để sẵn sàng cho việc truy xuất tập tin của hệ điều hành sau này. Một phần tử trong danh mục phải chứa các thông tin tối thiểu sau đây:  Tên của tập tin  Kiểu của tập tin  Địa chỉ vật lý của tập tin trên đĩa.  Các thông tin kiểm tra truy nhập tập tin  Các thông tin quản trị tập tin; vv. Các hệ điều hành thường thiết kế và sử dụng bảng danh mục hai mức:  Mức 1: được gọi là bảng danh mục chủ, bao gồm các con trỏ trỏ tới bảng danh mục người dùng.  Mức 2: được gọi là bảng danh mục người dùng, bao gồm tên tập tin và địa chỉ vật lý của tập tin trên đĩa,… Tổ chức bảng thư mục gốc và bảng thư mục con là sự cài đặt cụ thể cấu trúc bảng danh mục hai mức của hệ điều hành MS-DOS. Muốn truy xuất đến tập tin thì người dùng và chương trình của người dùng phải thông qua danh mục chủ và danh mục người dùng hay thông qua thư mục gốc và thư mục con trong hệ điều hành MS-DOS. Để thực hiện bất kỳ một thao tác nào trên nội dung của tập tin thì trước hết tập tin phải được mở. Khi nhận được yêu cầu mở tập tin thì hệ điều hành sử dụng đường dẫn được chỉ ra bởi người dùng hay chương trình của người dùng để tìm đến một mục vào tương ứng với tập tin cần mở trong bảng danh mục. Phần tử trong bảng danh mục sẽ cung cấp các thông tin cần thiết để hệ điều hành tìm đến các block đĩa chứa nội dung của tập tin. Tùy vào từng hệ điều hành mà thông tin này có thể là địa chỉ của tất cả block đĩa chứa nội dung tập tin (trong chiến lược cấp phát liên tục), địa chỉ của block 236

đĩa đầu tiên chứa nội dung tập tin (trong chiến lược danh sách liên kết và danh sách kiên kết chỉ mục), hoặc số hiệu của I-node (trong chiến lược I-node). Các chiến lược này được trình bày trong phần quản lý các block chứa tập tin trên đĩa ngay sau đây. Tổ chức bảng thư mục gốc của MS-DOS, Windows98 và MFT (Master File Table) của Windowsnt/2000 là các sự cài đặt cụ thể về cấu trúc của bảng danh mục của các hệ điều hành. Tổ chức của bảng thư mục gốc của MS-DOS, Windows98, Windowsnt/2000 sẽ được xem xét ở phần sau của chương này. 4.2.2.2. Tập tin chia sẻ (Shared File) Tập tin chia sẻ xuất hiện trong các môi trường nhiều người dùng, đây là một kỹ thuật của hệ điều hành, nhằm giúp nhiều người dùng trên hệ thống có thể cùng nhau sử dụng một tập tin nào đó. Đối với người dùng, tập tin chia sẻ là tập tin được xuất hiện đồng thời trong các thư mục khác nhau của các người dùng khác nhau. - Kỹ thuật chia sẻ tập tin thường được các hệ điều hành sử dụng nhất là, cho phép các phần tử trong các bảng danh mục người dùng khác nhau chứa thông tin của cùng một tập tin chia sẻ nào đó, đặc biệt là thông tin về địa chỉ của các block đĩa chứa nội dung của tập tin chia sẻ. Khi có một liên kết chia sẻ mới được thiết lập đến một người dùng nào đó, hệ điều hành chỉ cần sao chép danh sách các block đĩa của tập tin chia sẻ đến phần tử tương ứng trong bảng danh mục người dùng của người dùng đó. + Ưu điểm : Kỹ thuật này đơn giản dễ cài đặt + Khuyết điểm: nếu tập tin được cập nhật bởi một người dùng nào đó thì sự cập nhật này sẽ không được nhìn thấy bởi các người dùng khác (điều này sẽ vi phạm mục đích của việc chia sẻ tập tin). Vì khi tập tin được cập nhật thì hệ điều hành phải cung cấp thêm một vài block đĩa cho nó, địa chỉ của các block đĩa mới này chỉ được liệt kê thêm trong phần tử tương ứng trong bảng danh mục của người dùng thực hiện sự cập nhật tập tin mà không được liệt kê trong các bảng danh mục của người dùng khác. + Giải pháp: danh sách địa chỉ các block đĩa chứa tập tin chia sẻ không được liệt kê trong phần tử bảng danh mục, mà được chứa trong một khối dữ liệu có cấu trúc nào đó, tạm gọi là khối dữ liệu mô tả lưu trữ tập tin hay nói gọn hơn là khối mô tả lưu trữ. Khối mô tả lưu trữ này có thể được gắn vào chính tập tin chia sẻ nếu kích thước nhỏ, hoặc được đặt ở một vị trí nào đó trên đĩa, nếu kích thước lớn (trường hợp này có thể dùng chung cho nhiều tập tin chia sẻ). Mọi sư thay đổi về danh sách địa chỉ các block 237

đĩa chứa tập tin chia sẻ đều được phản ánh ở khối mô tả lưu trữ của nó. Các phần tử trong bảng danh mục bây giờ chỉ đóng vai trò như một con trỏ trỏ đến khối mô tả lưu trữ của các tập tin chia sẻ, nhờ vậy mà một sự thay đổi tập tin chia sẻ từ bất kỳ một người dùng nào trong số những người dùng được chia sẻ tâp tin đều được nhìn thấy từ tất cả những người dùng còn lại. Trong môi trường nhiều người dùng, việc chia sẻ một tập tin cho nhiều người dùng là rất cần thiết và nó đã mang lại nhiều thuận lợi. Nhưng nó cũng phát sinh nhiều lỗi trong quá trình sử dụng tập tin chia sẻ giữa nhiều người dùng và chương trình người dùng, mà nếu hệ điều hành không tổ chức giám sát tốt thì có thể dẫn đến tình trạng hỏng tập tin chia sẻ hoặc nội dung của tâp tin chia sẻ. Chúng ta đã biết hệ điều hành giải quyết vấn đề này như thế nào trong chương Quản lý tiến trình của tài liệu này. Đây là một vấn đề lớn đối với các hệ điều hành đa nhiệm đặc biệt là các hệ điều hành mạng. Các hệ điều hành này cung cấp đầy đủ các công cụ để người dùng và chương trình của người dùng kết hợp cùng với hệ điều hành khai thác, sử dụng tốt các tập tin chia sẻ nhưng hạn chế thấp nhất các lỗi có thể xảy ra. Trong phần sau của chương này chúng ta sẽ xem xét những thao tác mà hệ điều hành phải thực hiện để đáp ứng yêu cầu mở tập tin từ người dùng trong môi trường nhiều người dùng. 4.2.3. Quản lý không gian đĩa 4.2.3.1. Kích thước block Để tổ chức lưu trữ nội dung các tập tin trên đĩa, các hệ điều hành đều chia không gian lưu trữ của đĩa thành các phần có kích thước bằng nhau được gọi là khối (block) lưu trữ. Nội dung của tập tin cũng được chia thành các block có kích thước bằng nhau, trừ block cuối cùng, và bằng với kích thước các block đĩa. Khi cần lưu trữ tập tin trên đĩa hệ điều hành cấp cho mỗi tập tin một số lượng block vừa đủ để chứa hết nội dung của tập tin. Kích thước của một block phụ thuộc vào qui định của vi xử lý và hệ điều hành, thường là 128 Byte, 256 Byte, hoặc 512 Byte, vv. Khi chọn kích thước của block hệ điều hành phải xem xét các vấn đề sau:  Nếu kích thước block lớn thì dễ lãng phí đĩa, trong trường hợp kích thước của tập tin không phải là bội số của kích thước block.  Nếu kích thước block nhỏ thì đĩa được chia thành nhiều block, dẫn đến kích thước danh sách quản lý block của đĩa, danh sách quản lý block của một tập 238

tin, bảng các block, .v.v, sẽ tăng lên do đó dung lượng bộ nhớ chứa nó sẽ tăng lên.  Kích thước của block phải là bội của kích thước khối dữ liệu mà hệ thống dùng khi thực hiện truyền dữ liệu giữa bộ nhớ chính và bộ nhớ phụ. 4.2.3.2. Theo dõi các block tự do Khi cần lưu trữ nội dung của các tập tin lên đĩa, hệ điều hành cấp cho tập tin một số lượng block đĩa nhất định để chứa hết nội dung của nó, các block đĩa này có thể nằm tại các vị trí bất kỳ trên đĩa. Trong quá trình sử dụng tập tin kích thước của tập tin có thể thay đổi, tăng lên hay giảm xuống, do đó hệ điều hành phải tổ chức cấp phát động các block đĩa cho các tập tin. Khi kích thước của tập tin tăng lên thì hệ điều hành phải cấp phát thêm block cho nó, khi kích thước tập tin giảm xuống hoặc khi tập tin bị xoá khỏi đĩa thì hệ điều hành phải thu hồi lại các block đĩa đã cấp cho nó để có thể cấp cho các tập tin khác sau này. Để tổ chức cấp phát động các block đĩa cho tập tin hệ điều hành phải quản lý được trạng thái của các block, còn tự do hay đã cấp phát, trên đĩa. Trong trường hợp này các hệ điều hành có thể sử dụng 2 kỹ thuật: Dùng bảng bit và/hoặc dùng danh sách liên kết.  Trong bảng bit: mỗi bit cho biết trạng thái của một block tương ứng trên bộ nhớ phụ, bit 0 thì block tương ứng còn tự do, bit 1 thì block tương ứng đã cấp phát cho một tập tin nào đó. Như vậy, để tìm N block tự do hệ điều hành chỉ cần tìm N bit 0 trong bảng bit, do đó tốc độ tìm và cấp phát block cho các tập tin sẽ tăng lên rất nhiều.  Trong danh sách liên kết: để quản lý các block còn tự do hệ điều hành dùng một danh sách liên kết. Mỗi phần tử trong danh sách cho biết địa chỉ của một block tự do trên đĩa. Như vậy khi cần cấp phát block cho cho một tập tin nào đó thì hệ điều hành sẽ dựa vào danh sách các block tự do này. Sau khi cấp phát hoặc thu hồi block hệ điều hành phải tiến hành cập nhật lại danh sách liên kết hay bảng bit. Trong trường hợp bảng bit hoặc danh sách liên kết lớn, hệ điều hành sẽ chứa nó ở đĩa và chỉ nạp phần cần thiết vào bộ nhớ chính. Khi lựa chọn các block trong tập các block tự do để cấp phát cho một tập tin hệ điều hành phải chọn 239

sao cho việc cấp phát được thực hiện nhanh và việc đọc sau này là tối ưu với một thuật toán đọc đĩa cụ thể nào đó. 4.2.3.3. Cấp hạn ngạch đĩa (Disk Quotas) Để ngăn chặn người dùng sử dụng quá nhiều không gian đĩa, các hệ điều hành đa người dùng thường cung cấp một chiến lược để người quản trị hệ thống giới hạn số lượng không gian đĩa tối đa (block) mà mỗi người dùng được phép sử dụng và hệ điều hành phải đảm bảo rằng người dùng không thể sử dụng quá không gian đĩa mà hệ điều hành cấp cho họ, chiến lược này được gọi là cấp hạn ngạch đĩa. Khi người dùng mở tập tin, thì các thuộc tính và các địa chỉ block đĩa mà hệ điều hành cấp cho tập tin được ghi vào bảng mở tập tin trong bộ nhớ chính, trong đó có cả thuộc tính cho biết người dùng nào sở hữu tập tin được mở. Bất kỳ một sự thay đổi nào về kích thước tập tin cũng thay đổi đến hạn ngạch của người dùng sở hữu tập tin18. Một bảng thứ hai chứa record quota, cho mỗi người dùng mở tập tin hiện tại, thậm chí nếu tập tin được mở bởi một người nào đó, bảng này được trình bày ở hình sau. Hình 4.2 cho thấy một phần của tập tin quota trên đĩa, cho biết tập tin của người dùng nào là đang được mở. Khi tất cả các tập tin đều được đóng, record sẽ ghi trở lại tập tin quota. Khi có một Entry mới được tạo ra trong bảng mở tập tin thì một con trỏ 18 Nguyễn Kim Tuấn, Giáo trình lý thuyết hệ điều hành, ĐH Huế, 2004,Tr.154 240

(quota pointer) trỏ tới record quota của người sở hữu tập tin, là được nhập vào nó. Mỗi khi có một block được thêm vào một tập tin thì tổng số block của người dùng được tăng lên và một check được gán đến cả Hard block limit và Soft block limit. Soft limit có thể được vượt quá, nhưng hard limit thì không thể. Một sự cố gắng thêm vào cuối tập tin khi hard block limit bị vượt quá giới hạn sẽ trả về thông báo lỗi. Khi một người dùng cố gắng login, hệ thống sẽ kiểm tra tập tin quota để xem người dùng đã vượt quá soft limit của block hoặc tập tin hay chưa (soft block limit hoặc soft file limit). Nếu cả hai limit đều bị vi phạm, thì một cảnh báo sẽ xuất hiện, và bộ đếm (count) tương ứng với cảnh báo sẽ giảm xuống một đơn vị. Nếu bộ đếm nhận được giá trị zero thì người dùng sẽ không được phép login. 4.2.4. Quản lý các block chứa tập tin trên đĩa Trong phần này chúng ta xem xét các phương pháp khác nhau mà các hệ điều hành sử dụng để theo dõi danh sách các block đĩa mà hệ điều hành đã cấp phát cho một tập tin, để chứa hết các block của một tập tin, của tất cả các tập tin đang được lưu trữ tên đĩa. 4.2.4.1. Cấp phát liên tục (contiguous allocation) - Ý tưởng: Các block tập tin được lưu trữ tại các block đĩa liên tục nhau. - Ví dụ: Nếu 1 block đĩa là 1K thì một tập tin 50K sẽ được lưu trữ tại 50 block liên tiếp nhau trên đĩa. - Ưu điểm: Đơn giản, dễ cài đặt, thời gian đọc tập tin giảm xuống đáng kể. Vì hệ điều hành chỉ cần biết block đĩa đầu tiên chứa các block tập tin và tổng số block đĩa chứa tập tin là có thể tiến hành đọc nội dung của tập tin mà không cần dò tìm danh sách các block đĩa chứa nội dung của tập tin nên thời gian đọc tập tin giảm xuống đáng kể. - Nhược điểm: Lãng phí trong việc sử dụng block đĩa, xảy ra hiện tượng phân mảnh trên đĩa. Chiến lược này chỉ có thể được sử dụng với các tập tin có kích thước cố định, không thay đổi so với thời điểm tạo ra tập tin, hoặc với các tập tin mà hệ điều hành biết trước được kích thước tối đa của tập tin, trong trường hợp này hệ điều hành phải dự trữ block đĩa cho tập tin, điều này dễ dẫn đến tình trạng lãng phí trong việc sử dụng block 241

đĩa. Chiến lược này có thể dẫn đến hiện tượng phân mảnh trên đĩa, tức là trên đĩa có thể xuất hiện các đoạn block trống nhỏ, không đủ để chứa một tập tin có kích thước tối thiểu, nằm giữa các đoạn block chứa tập tin, các đoạn block trống này có thể là nơi lưu trữ của một tập tin nào đó mà tập tin này đã bị xoá khỏi đĩa. Hiện tượng phân mảnh đĩa sẽ làm chậm tốc độ đọc tập tin của hệ điều hành. - Giải pháp: Các block tập tin được lưu trữ tại block đĩa rời rạc nhau. Với việc cải tiến này, hệ điều hành có thể đọc tập tin nhanh hơn, ít xảy ra phân mảnh hơn nhưng việc tổ chức lưu trữ sẽ phức tạp hơn. Chúng ta sẽ thấy cách tổ chức này trong hệ thống tập tin của hệ điều hành WindowsNT/2000 trong phần sau của chương này. 4.2.4.2. Cấp phát theo danh sách liên kết (linked list allocation) - Ý tưởng: Các block tập tin được lưu trữ tại một danh sách liên kết các block đĩa. Word đầu tiên của mỗi block đĩa được sử dụng như một con trỏ để trỏ đến block kế tiếp, trừ word của block cuối cùng được sử dụng để chứa tín hiệu báo kết thúc danh sách của một tập tin, phần còn lại của block đĩa dùng để chứa nội dung của tập tin. Trong trường hợp này kích thước của block đĩa phải lớn hơn kích thước của block tập tin 1 word. - Ví dụ: Tập tin A được chia thành 4 block: block 0, block 1, block 2, block 3 được lưu trữ tại các block đĩa, lần lượt là 3, 7, 5, 10. Với tập tin B được chia thành 3 block: block 0, block 1, block 2, được lưu trữ tại các block đĩa, lần lượt là 4, 8, 6. 242

Hình 4.3. Cấp phát block theo danh sách liên kết - Ưu điểm: Không xảy ra hiện tượng phân mảnh đĩa và khai thác tối đa không gian đĩa. - Nhược điểm: Tốc độ đọc tập tin rất chậm và tốn một word để chứa con trỏ đến block kế tiếp. - Giải pháp: Cấp phát theo danh sách liên kết sử dụng chỉ mục.  Cấp phát theo danh sách liên kết sử dụng chỉ mục (linked list allocation using an index): - Ý tưởng: Lưu các word con trỏ vào trong một bảng chỉ mục và nạp bảng chỉ mục này vào bộ nhớ khi hệ điều hành cần đọc nội dung của tập tin trên đĩa. Hình 4.4. Cấp phát block theo danh sách liên kết có chỉ mục - Ví dụ: tập tin A được chia thành 4 block: A1, A2, A3, A4 được lưu trữ tại các block đĩa, lần lượt là 4, 10, 7, 14 (cuối cùng). Với tập tin B được chia thành 4 block: B1, B2, B3, B4 được lưu trữ tại các block đĩa, lần lượt là 6, 9, 12, 15 (cuối cùng). - Ưu điểm: Tốc độ đọc tập tin nhanh và không tốn một word để chứa con trỏ đến block kế tiếp. - Nhược điểm: Tốn thời gian nạp bảng chỉ mục và làm lãng phí không gian bộ nhớ. 243

- Giải pháp: Chỉ nạp phần bảng chỉ mục liên quan đến các tập tin đang mở trên bộ nhớ tại một thời điểm cụ thể nào đó. + Với cách tổ chức này thì toàn bộ block đĩa được sử dụng để lưu trữ tập tin và việc truy cập ngẫu nhiên trong trường hợp này sẽ dễ dàng hơn. Tuy nhiên cũng phải tồn tại một móc xích để tìm ra tất cả các block đĩa chứa nội dung của một tập tin và móc xích này phải được nạp vào bộ nhớ để hệ điều hành có thể tìm đọc tập tin khi cần. Cũng như chiến lược trên block đầu tiên của một tập tin phải được chứa trong phần tử bảng danh mục tương ứng với mỗi tập tin, trong trường hợp này nó được xem như một con trỏ trỏ đến bảng chỉ mục để bắt đầu dò tìm dãy các block đĩa chứa nội dung của tập tin, mỗi khi hệ điều hành cần đọc tập tin. + Hệ điều hành MS-DOS tổ chức quản lý tập tin trên đĩa dựa theo chiến lược này. + Khái niệm cửa sổ bảng FAT trong hệ thống tập tin của hệ điều hành Windows98 là một ví dụ của trường hợp này. Chúng ta sẽ được nhắc đến điều này trong phần sau của chương này.  I-nodes (index-node): - Ý tưởng: hệ điều hành thiết kế một bảng nhỏ để theo dõi các blocks của một tập tin, được gọi là I-node. I-node liệt kê các thuộc tính và các địa chỉ đĩa của các block của tập tin. Hình sau đây minh hoạ cho chiến lược này. 244

Đầu tiên một phần địa chỉ đĩa (các block đĩa) được lưu trữ trong chính I-node. Sau đó, đối với các tập tin nhỏ thì tất cả các thông tin cần thiết là phải chứa trong chính I-node, đó là các thông tin được nhận từ đĩa vào bộ nhớ chính khi tập tin được mở. Đối với các tập tin lớn, gồm nhiều block, thì một trong các địa chỉ trong I-node là địa chỉ của một block đĩa, được gọi là block gián tiếp đơn. Block này chứa các địa chỉ đĩa được thêm vào. Nếu vẫn còn không đủ thì một địa chỉ khác trong I-node, được gọi là block gián tiếp đôi, sẽ chứa địa chỉ của một block mà nó chứa một danh sách các block gián tiếp đơn. Mỗi block gián tiếp đơn trỏ đến khoảng 100 block dữ liệu. Nếu vẫn còn không đủ thì có thể một block gián tiếp ba được sử dụng. Nhìn hình vẽ trên ta dẽ dàng phân biệt được sự khác nhau giữa: block gián tiếp đơn, block gián tiếp đôi và block gián tiếp ba. Chiến lược này được Windows 2000 cải tiến và sử dụng trong cấu trúc MFT trong hệ thống tập tin của nó. Chúng ta sẽ thấy điều này khi tìm hiểu hệ thống tập tin của Windows 2000 trong phần sau của chương này.  Cấp phát không liên tục với block chỉ mục: Cả hai chiến lược cấp phát, theo danh sách liên kết và theo liên kết chỉ mục đều tồn tại hạn chế là phải phân tích danh sách liên kết hay bảng chỉ mục để dò tìm ra danh sách các block đĩa chứa nội dung của tập tin cần đọc, khi đọc tập tin, dẫn đến làm chậm tốc độ đọc tập tin trên đĩa. Hình 4.6. Cấp phát không liên tục với block chỉ mục19 19 Nguyễn Kim Tuấn, Giáo trình lý thuyết hệ điều hành, ĐH Huế 2004, Tr.158 245

Để khắc phục điều này các hệ điều hành có thể cài đặt chiến lược cấp phát không liên tục với block chỉ số. - Block chỉ mục: Là một block đĩa chứa danh sách các block đĩa chứa nội dung của một tập tin nào đó. - Ý tưởng: Hệ điều hành chỉ cần thiết kế một con trỏ, tại phần tử trong bảng chỉ mục, trỏ tới block chỉ mục của tập tin trên đĩa là hệ điều hành có thể quản lý được danh sách các block đĩa chứa nội dung của một tập tin. - Ví dụ: File A được chia thành 4 block: A1, A2, A3, A4 được lưu trữ tại các block đĩa lần lượt là 4, 10, 7, 14 (cuối cùng). File B được chia thành 4 block: B1, B2, B3, B4 được lưu trữ tại các block đĩa lần lượt là 6, 9, 12, 15 (cuối cùng). - Ưu điểm: Tốc độ đọc tập tin nhanh đối với các tập tin nhỏ. - Nhược điểm:  Tập tin lớn thì một block có thể không chứa đủ danh sách các block đĩa chứa nội dung của một tập tin.  Nếu block chỉ mục của tập tin bị hỏng thì hệ điều hành không thể đọc được tập tin, mặc dù nội dung của tập tin vẫn còn tồn tại trên các block đĩa. Trong hình trên block 11 là chỉ mục của file A, block 8 là chỉ mục của file B. Như vậy chỉ cần thiết kế một con trỏ, tại phần tử trong bảng chỉ mục, trỏ tới block chỉ mục của tập tin trên đĩa là hệ điều hành có thể quản lý được danh sách các block đĩa chứa nội dung của một tập tin. 4.2.5. An toàn trong quản lý tập tin 4.2.5.1. Bảo toàn dữ liệu tập tin Một hệ quản trị tập tin phải cung cấp những cơ chế thích hợp để phục hồi nội dung của tập tin trong trường hợp hệ thống gặp sự cố về phần mềm hoặc phần cứng. Để thực hiện được điều này hệ điều hành phải luôn tạo bản sao của các tập tin đang mở trên hệ thống, để có thể phục hồi lại khi cần thiết. Có hai kỹ thuật được sử dụng trong cơ chế này: 246

 DUMP có chu kỳ: Sau một khoảng thời gian nhất định nội dung của các tập tin đang mở trên bộ nhớ chính sẽ được đổ (Dum/backup) ra lại đĩa. Nếu hệ thống gặp sự cố thì tất cả các tập tin đang mở sẽ được tái tạo lại kể từ trạng thái mà chúng được DUMP ra lần cuối cùng. Rõ ràng việc DUM này sẽ làm tốn thời gian thực hiện của hệ thống.  DUMP Incremental: Trong cách này, hệ thống chỉ lưu trữ các thông tin được sửa đổi kể từ lần Dump sau cùng, tức là chỉ có các tập tin được tạo lập hoặc sửa đổi so với lần đổ ra cuối cùng mới được Dump ra. Với kỹ thuật này thông tin cần lưu trữ ít hơn do đó hệ thống có thể thực hiện Dump thường xuyên hơn. Để biết được trong số những tập tin đang mở tập tin nào có sự cập nhật dữ liệu hoặc có sự thay đổi so với lần Dump ra trước đó hệ thống đưa thêm vào danh mục người dùng một trường mới, dài 2 bit, tạm gọi là trường kiểm tra cập nhật (KTCN).  Nếu KTCN = 00: mở không cập nhật  KTCN = 01: mở có cập nhật  KTCN = 10: không có thay đổi so với lần Dump trước  KTCN = 11: có thay đổi so với lần Dump trước. Với cách này hệ thống phải luôn kiểm tra bảng danh mục và phải cập nhật lại trường KTCN sau mỗi lần Dump, dẫn đến làm chậm tốc độ thực hiện của hệ thống. Để hệ thống không phải khảo sát tất cả các điểm vào của danh mục, hệ điều hành cài đặt thêm một bảng danh mục mới để ghi nhận thông tin của các tập tin đang được truy xuất (ghi/đọc) trên hệ thống và chỉ có Dump sử dụng bảng danh mục này, do đó hệ thống Dump có thể hoạt động song song với các thao tác khác của hệ thống. Dump Incremental là một tiến trình có độ ưu tiên thấp, thường trú trong bộ nhớ phân tích các bảng danh mục để tìm ra các tập tin cần phải thực hiện Dump. 4.2.5.2. Danh sách các quyền truy cập (Access Right) Trong phần tập tin chia sẻ ở trên, chúng tôi đã trình bày về kỹ thuật tạo ra tập tin chia sẻ của hệ điều hành, kỹ thuật này hoàn toàn trong suốt với người dùng. Trong phần này chúng tôi sẽ giới thiệu quyền truy cập, quyền truy cập và quản lý truy cập đồng thời là các công cụ cơ bản mà hệ điều hành dùng để quản lý và bảo vệ các tập tin chia sẻ trong các hệ thống nhiều người dùng (multiuser systems). 247

Quyền truy cập có thể được gán cho một người dùng (User) cụ thể, một nhóm người dùng (User Group) hay tất cả người dùng (All User) có trong các hệ thống multiuser. Một user group chứa nhiều user, khi một group được gán quyền nào đó thì tất cả các uer thành viên trong group này cũng đều được gán quyền truy cập đó. Sau đây là các quyền truy cập mà hệ điều hành thường dùng để gán cho một người dùng cụ thể đến một tập tin cụ thể nào đó:  None: Người dùng không biết được là tập tin có tồn tại hay không. Với giới hạn của quyền này, người dùng không được phép đọc thư mục chứa tập tin này.  Knowledge: Người dùng có thể xác định được là tập tin đang tồn tại và ai là người sở hữu tập tin.  Excution: Người dùng có thể nạp và thực hiện một chương trình nhưng không thể copy nó. Các chương trình thuộc dạng độc quyền của một nhà sản xuất nào đó thường được tạo với sự giới hạn với quyền này.  Reading: Người dùng có thể đọc tập tin cho bất kỳ mục đích nào, bao gồm cả copy và execution. Một vài hệ thống cho phép có sự khác nhau giữa xem và copy tập tin. Trong trường hợp này nội dung của tập tin có thể được hiển thị để người dùng xem, nhưng họ không được cung cấp công cụ để copy nội dung này.  Appending: Người dùng có thể thêm dữ liệu vào tập tin, thường là ở cuối tập tin, nhưng không thể thay đổi hoặc xoá bất kỳ một nội dung nào trong tập tin.  Updating: Người dùng có thể thay đổi, xoá và thêm dữ liệu vào tập tin.  Changing protection: Người dùng có thể thay đổi các quyền truy cập được gán đến người dùng khác. Quyền này thường chỉ được gán cho người sở hữu tập tin.  Deletion: Người dùng có thể xoá được tập tin từ hệ thống tập tin. Ví dụ: Người dùng A được gán quyền đọc (read) tập tin tailieu.doc, nhưng không được gán quyền xoá (delete) tập tin tailieu.doc thì người dùng A này chỉ có thể thực hiện thao tác mở tập tin tailieu.doc ra để đọc nội dung của tập tin, chứ không thể thay xóa hay thay đổi nội dung của tập tin (vì không được gán quyền thay đổi (modify) nội dung tập tin). 248

Người dùng có thể được gán nhiều quyền truy cập đến một tập tin, khi đó họ sẽ có đầy đủ các sự cho phép và sự giới hạn tương ứng với các quyền đã được gán. Tuy nhiên quyền truy cập có tính kế thừa, nên chỉ cần gán một quyền truy cập cao nhất thì họ có đủ các sự cho phép và sự giới hạn của các quyền khác. Ví dụ: Nếu người dùng được gán quyền Updating với một tập tin nào đó, thì xem như họ đã được gán các quyền Knowledge, execution, reading và appending đối với tập tin này. 4.2.5.3. Mở và đóng tập tin Hệ điều hành cho rằng các tập tin được lưu trữ trên đĩa đều ở trạng thái đóng, để thực hiện bất kỳ một thao tác đọc/ghi/thay đổi nội dung của tập tin thì trước hết chương trình, tiến trình của người dùng phải thực hiện thao tác mở tập tin. Khi nhận được yêu cầu mở tập tin bộ phận quản lý tập tin của hệ điều hành sẽ đọc nội dung của tập tin từ đĩa và nạp nó vào bộ nhớ chính, sau đó trả về cho chương trình, tiến trình của người dùng một thẻ tập tin (file handle) hoặc một biến tương ứng với tập tin này để chương trình, tiến trình theo dõi và thao tác trên tập tin này. Sau khi thực hiện xong một thao tác nào đó trên nội dung của tập tin thì chương trình, tiến trình và cả người dùng phải thực hiện thao tác đóng tập tin lại. Đối tượng yêu cầu đóng tập tin phải cung cấp đúng thẻ tập tin của tập tin cần đóng cho hệ điều hành. Một số hệ điều hành cho phép thực các thao tác trên tập tin (mở/cập nhật/đóng) bằng chính tên của tập tin. Các hệ điều hành đều cung cấp hai thủ tục chính để chương trình của người dùng thực hiện các thao tác mở/đóng tập tin:  Open (tên tập tin cần mở, chế độ mở): dùng để mở tập tin (chế độ: Đọc/ Viết/Tạo lập)  Close (tên tập tin cần đóng): dùng để đóng tập tin khi mở. Thao tác mở/đóng tập tin sẽ đơn giảm trong môi trường hệ điều hành đơn nhiệm và sẽ phức tạp hơn trong môi trường hệ điều hành đa nhiệm. Trong môi trường đa nhiệm, hệ điều hành chỉ thực sự đóng tập tin theo yêu cầu của một tiến trình từ một người dùng nào đó khi tất cả các thao tác ghi/đọc tập tin này từ các tiến trình người dùng khác đều đã kết thúc. Trong trường hợp này hệ điều hành phải luôn theo dõi các tiến trình người dùng tham gia vào việc mở tập tin này. Để đáp ứng yêu cầu mở tập tin từ một chương trình, tiến trình của người dùng trong môi trường đa nhiệm hệ điều hành 249


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook