Để thực hiện loại trừ lẫn nhau này hệ điều hành đưa thêm hai trường vào các entry trong bảng danh mục người sử dụng: Trường va mang trinh, do choi tinh duc, am dao gia, phau thuat tham my
Bítghi, = 1 đang có một tiến trình ghi vào file, = 0 không có tiến trình nào ghi vào file. Trường thứ hai, Bộ đếm, = <số các tiến trình đang mở file để đọc>. Theo đó một tiến trình chỉ có thể mở file để đọc khi Bít ghi = 0, mở file để ghi khi Bít ghi = 0 và Bộ đếm = 0. Như vậy, ngay sau khi chấp nhận yêu cầu mở file để ghi từ một tiến trình thì hệ điều hành phải gán Bít ghi = 1, ngay sau khi chấp nhận yêu cầu mở file để đọc từ một tiến trình thì hệ điều hành phải tăng Bộ đếm lên 1 đơn vị, Bộ đếm = bộ đếm + 1. Khi một tiến trình đọc file đóng file thì Bộ đếm = bộ đếm + 1, khi một tiến trình ghi file đóng file thì Bít ghi được gán = 1. Rõ ràng kỹ thuật này có thể dẫn đến lỗi khi hệ thống không giám sát tốt việc thay đổi giá trị trên các trường Bítghi và Bộ đếm, điều này chúng ta đã thấy trong chương Quản lý tiến trình của tài liệu này.
Bítghi, = 1 đang có một tiến trình ghi vào file, = 0 không có tiến trình nào ghi vào file. Trường thứ hai, Bộ đếm, = <số các tiến trình đang mở file để đọc>. Theo đó một tiến trình chỉ có thể mở file để đọc khi Bít ghi = 0, mở file để ghi khi Bít ghi = 0 và Bộ đếm = 0. Như vậy, ngay sau khi chấp nhận yêu cầu mở file để ghi từ một tiến trình thì hệ điều hành phải gán Bít ghi = 1, ngay sau khi chấp nhận yêu cầu mở file để đọc từ một tiến trình thì hệ điều hành phải tăng Bộ đếm lên 1 đơn vị, Bộ đếm = bộ đếm + 1. Khi một tiến trình đọc file đóng file thì Bộ đếm = bộ đếm + 1, khi một tiến trình ghi file đóng file thì Bít ghi được gán = 1. Rõ ràng kỹ thuật này có thể dẫn đến lỗi khi hệ thống không giám sát tốt việc thay đổi giá trị trên các trường Bítghi và Bộ đếm, điều này chúng ta đã thấy trong chương Quản lý tiến trình của tài liệu này.
IV.1.6. Hiệu suất hệ thống file
Như đã biết, tốc độ truy xuất dữ liệu trên đĩa chậm hơn rất nhiều so với tốc độ truy xuất dữ liệu trên bộ nhớ, tốc độ truy xuất dữ liệu trên đĩa tính bằng đơn vị milliseconds, trong khi đó tốc độ truy xuất dữ liệu trên bộ nhớ chỉ tính bằng đơn vị nanoseconds. Do đó, để tạo ra sự đồng bộ trong việc trao đổi dữ liệu trên bộ nhớ và trên đĩa, cũng như tăng tốc độ truy xuất dữ liệu trên bộ nhớ, các hệ điều hành phải thiết kế hệ thống file của nó sao cho tốc độ đọc dữ liệu là nhanh nhất và giảm số lần truy cập đĩa mỗi khi truy xuất file xuống mức thấp nhất.
Một trong những kỹ thuật được hệ điều hành sử dụng ở đây là tạo ra các block cache hoặc buffer cache. Trong ngữ cảnh này, cache là một tập các block logic trên đĩa, nhưng được tạo ra và được giữ trong bộ nhớ chỉ để phục vụ cho mục đích cải thiện hiệu suất của hệ thống.
Có nhiều thuật toán khác nhau được sử dụng để quản lý cache, nhưng tất cả đều hướng tới mục đích của việc sử dụng cache và nguyên lý hoạt động của cache: Khi nhận được một yêu cầu đọc dữ liệu từ tiến trình của người sử dụng thì bộ phận quản lý cache sẽ kiểm tra block dữ liệu cần đọc đã có trong cache hay chưa, nếu có trong cache thì đọc trực tiếp trong cache mà không cần truy cập đĩa, nếu không có trong cache thì dữ liệu cần đọc sẽ được đọc và ghi vào trong cache trước rồi sau đó được chép đến bất cứ nơi nào cần thiết. Việc ghi vào cache này nhằm chuẩn bị cho các lần đọc dữ liệu sau này. Tức là, nếu sau này có một yêu cầu đọc cùng một block dữ liệu như trên thì nó sẽ được đọc trực tiếp từ cache mà không cần truy cập đĩa.
Khi cache bị đầy các block thì một vài block trong đó phải bị xoá hoặc bị xoá và ghi trở lại về đĩa nếu block này có sự thay đổi kể từ khi nó được mang vào bộ nhớ kể từ lần được mang vào gần đây nhất. Trong trường hợp này hệ điều hành cũng sử dụng các thuật toán thay trang trong quản lý bộ nhớ như FIFO, LRU, … để chọn một block trong cache để đưa ra đĩa. Tuy nhiên cache được truy xuất ít thường xuyên hơn, nên hệ điều hành có thể tổ chức một danh sách liên kết để theo dõi việc truy xuất các block trong cache, danh sách liên kết này được sử dụng cho thuật toán thay block: LRU.
Không có nhận xét nào:
Đăng nhận xét