CHƯƠNG 3 : QUẢN LÝ BỘ NHỚ
3.3. PHÂN CHƯƠNG BỘ NHỚ
3.3.5. Trao đổi giữa bộ nhớ và đĩa (swapping)
Khái niệm. Trong các hệ đa chương trình, để có thể thực hiện nhiều tiến trình một lúc,
các tiến trình đang thực hiện có thể bị tạm thời tải ra đĩa nhường chỗ để tải các tiến trình khác vào và thực hiện. Sau đó các tiến trình bị tải ra lại được tải vào thực hiện tiếp từ vị trí tạm dừng. Thao tác này được gọi là trao đổi giữa bộ nhớ và đĩa (swapping).
Khi bị trao đổi ra đĩa, hệ thống sẽ chép ra đĩa “ảnh” của tiến trình, tức là tồn bộ tiến trình ở trạng thái hiện thời với giá trị dữ liệu, nội dung ngăn xếp, lưu lại con trỏ lệnh. Nhờ vậy, khi được chuyển lại vào bộ nhớ, tiến trình có thể thực hiện tiếp từ vị trí bị dừng khi trao đổi ra đĩa.
Việc trao đổi giữa đĩa và bộ nhớ như vậy có thể thực hiện khi một tiến trình đã hết khoảng thời gian sử dụng CPU của mình và phải đợi cho tới khi đến lượt. Tiến trình khi đó bị tải ra để nhường chỗ cho tiến trình khác đến lượt sử dụng CPU. Tiến trình cũng có thể bị tải ra để nhường chỗ cho một tiến trình khác có thứ tự ưu tiên cao hơn. Nhờ kỹ thuật này, tổng không gian nhớ của tất cả tiến trình có thể lớn hơn so với khơng gian nhớ vật lý do một số tiến trình được giữ tạm trên đĩa.
Vấn đề tốc độ. Các tiến trình thường được tải ra và tải vào từ các đĩa tốc độ cao. Thời
gian tải phụ thuộc vào tốc độ truy cập đĩa, tốc độ truy cập bộ nhớ và kích thước tiến trình. Với những tiến trình có kích thước lớn từ vài trăm megabyte tới vài gigabyte và tốc độ truyền dữ liệu giữa bộ nhớ với đĩa cứng hiện nay, thời gian trao đổi một tiến trình ra đĩa có thể lên tới vài giây. Như vậy, thời gian chuyển đổi ngữ cảnh giữa các tiến trình, bao gồm cả thời gian trao đổi đĩa, là tương đối lớn.
Khi được tải vào lại, tiến trình có thể được chứa vào vị trí cũ hoặc được cấp cho một chương địa chỉ hoàn toàn mới.
Một số hạn chế. Một hạn chế với các tiến trình bị trao đổi là tiến trình đó phải ở trạng
thái nghỉ, đặc biệt không thực hiện các thao tác vào ra do việc trao đổi các tiến trình đang vào/ra sẽ gây lỗi. Để minh họa, ta xét ví dụ sau. Giả sử, tiến trình P1 có một yêu cầu vào ra đang ở trong hàng đợi do thiết bị vào ra bận. Ta tải P1 ra đĩa và tải P2 vào vị trí của P1. Khi thao tác vào ra của P1 được đáp ứng, thao tác này sẽ truy cập vùng địa chỉ của P1 trước kia. Tuy nhiên, do vùng bộ nhớ này hiện giờ thuộc về P2 nên dữ liệu của P1 sẽ được đọc vào vùng bộ nhớ của P2 và gây ra lỗi. Để tránh những tình huống như vậy có thể sử dụng hai giải pháp. Giải pháp thứ nhất, đã nói ở trên, là khơng trao đổi các tiến trình đang có u cầu vào/ra dữ liệu. Giải pháp thứ hai là thay vì đọc/ghi dữ liệu trực tiếp giữa thiết bị với vùng nhớ của tiến
trình, dữ liệu sẽ được đọc/ghi vào vùng bộ nhớ đệm (buffer) của hệ điều hành và được chứa tạm ở đây. Khi tiến trình được chuyển vào bộ nhớ, dữ liệu mới đọc/ghi sẽ được đồng bộ giữa bộ nhớ đệm và vùng nhớ của tiến trình.
Ở trên, ta đã xem xét việc trao đổi tồn bộ tiến trình ra đĩa. Do các hạn chế về tốc độ, kỹ thuật này ít khi sử dụng trong các hệ điều hành hiện nay. Thay vì vậy, việc trao đổi từng phần tiến trình thường ra đĩa được sử dụng trong các hệ thống bộ nhớ ảo.
Trao đổi bộ nhớ - đĩa trong các hệ điều hành di động
Do đặc điểm của thiết bị di động, các hệ điều hành cho thiết bị di động hầu như không sử dụng kỹ thuật trao đổi giữa bộ nhớ và đĩa. Có hai ngun nhân chính của việc khơng sử dụng kỹ thuật này. Thứ nhất, thiết bị di động không sử dụng đĩa cứng mà dùng bộ nhớ flash hay bộ nhớ SSD với dung lượng tương đối nhỏ so với đĩa cứng và do vậy khơng có nhiều khơng gian để chuyển các tiến trình từ bộ nhớ trong ra bộ nhớ ngồi. Ví dụ, iPhone hiện nay chỉ có bộ nhớ ngồi dung lượng 16GB – 64GB so với dung lượng hàng trăm GB của đĩa cứng thông thường. Thứ hai, công nghệ bộ nhớ flash của thiết bị di động chỉ cho phép ghi dữ liệu lên đó một số lần nhất định, sau khi đạt được giới hạn này, bộ nhớ làm việc không ổn định. Do vậy, cần tránh việc ghi ra bộ nhớ ngồi q nhiều.
Thay vì trao đổi ra đĩa, hệ điều hành di động thường xóa tiến trình khi khơng đủ bộ nhớ. Ví dụ, hệ điều hành iOS sử dụng chiến lược sau. Khi bộ nhớ trong cịn ít, hệ điều hành báo cho các ứng dụng giải phóng bớt bộ nhớ. Thơng thường, ứng dụng sẽ giải phóng vùng bộ nhớ dùng chứa mã chương trình và dữ lại những vùng chứa dữ liệu. Chiến lược này giúp ứng dụng khôi phục lại trạng thái cũ nhanh chóng khi có đủ bộ nhớ. Tuy nhiên, nếu cách này không giúp ứng dụng giải phóng đủ lượng bộ nhớ hệ điều hành yêu cầu, iOS sẽ xóa ứng dụng khỏi bộ nhớ trong.
Tương tự iOS, hệ điều hành Android cũng kết thúc và xóa tiến trình khỏi bộ nhớ khi thiếu bộ nhớ. Tuy nhiên, Android ghi một số thông tin trạng thái tiến trình ra bộ nhớ ngồi trước khi kết thúc tiến trình. Các thơng tin này có thể giúp cho việc chạy lại các ứng dụng được nhanh hơn.