2010-06-13 49 views
5

Từ docs:Lỗi trang bộ nhớ chính xác là gì?

Lưu ý: Core Data tránh được hạn unfaulting vì nó là khó hiểu. Không có lỗi "không hoạt động" một lỗi trang lỗi ảo . Lỗi trang là đã kích hoạt, gây ra, kích hoạt hoặc gặp phải. Tất nhiên, bạn có thể bộ nhớ phát hành quay lại hạt nhân theo một cách khác nhau (sử dụng các hàm vm_deallocate, munmap hoặc sbrk). Core Dữ liệu mô tả điều này là “chuyển một đối tượng thành lỗi”.

Dữ liệu lỗi trong lõi có phải là lỗi trang bộ nhớ không? Tôi chỉ có một ý tưởng nhỏ về trang bộ nhớ là gì. Tôi tin rằng đó là một loại "đoạn mã trong bộ nhớ" cần thiết để thực hiện các thủ tục và nội dung như vậy, và khi ứng dụng đang chạy, các đoạn mã được hút vào bộ nhớ dưới dạng "trang" và bị bỏ đi khi chúng không cần thiết nữa. Có thể là 99% sai;)

Bất kỳ ai?

Trả lời

7

Tôi chỉ có một ý tưởng nhỏ về trang bộ nhớ là gì. Tôi tin rằng đó là một loại "đoạn mã trong bộ nhớ" cần thiết để thực hiện các thủ tục và nội dung như vậy, và khi ứng dụng đang chạy, các đoạn mã được hút vào bộ nhớ dưới dạng "trang" và bị bỏ đi khi chúng không cần thiết nữa.

Nội dung (ví dụ: mã và dữ liệu) tồn tại trong bộ nhớ.

Mỗi thứ tồn tại trong bộ nhớ đều có địa chỉ (địa chỉ bộ nhớ).

Không gian địa chỉ bộ nhớ (ví dụ: 4GB trên máy 32 bit) được chia thành 'trang', trong đó mỗi trang là một phần bộ nhớ liền kề (ví dụ: 4KB trên mỗi trang).

Không gian địa chỉ được ánh xạ (bởi CPU và O/S) vào RAM (hoặc có thể ánh xạ tới cổng I/O, nhưng đó là một câu chuyện khác).

Có thể có ít RAM được cài đặt (ví dụ: 1 GB) so với không gian địa chỉ (ví dụ 4 GB), do đó một số nội dung (ví dụ: công cụ ít được sử dụng gần đây nhất) có thể được hoán đổi (bằng O/S) từ RAM lên tệp trang trên đĩa. Toàn bộ, các trang không tách rời (ví dụ: khối 4KB) là những gì được hoán đổi (không phải byte riêng lẻ).

Khi ứng dụng tìm cách truy cập địa chỉ không được ánh xạ tới RAM, thì đó là lỗi trang được gọi là. Để xử lý một lỗi trang, O/S có thể:

  • miễn phí một số RAM, bằng cách trao đổi một cái gì đó (ví dụ gần đây ít được sử dụng) từ RAM vào đĩa
  • Map đó mới giải phóng RAM bây giờ có sẵn cho địa chỉ mà ứng dụng đang cố gắng truy cập
  • Hoán đổi vào RAM, từ đĩa, bất kỳ nội dung nào được cho là tại địa chỉ đó (một thời điểm nào đó trong quá khứ đã được hoán đổi từ địa chỉ đó ra đĩa)
  • Tiếp tục lại ứng dụng mà nó đã tắt: ứng dụng sẽ thử lại để truy cập địa chỉ bộ nhớ đó, chỉ lần này mà không có lỗi trang khác.
+1

I đừng bận tâm khi bạn lướt qua toàn bộ bộ nhớ ảo (như tôi đã làm), nhưng với mức độ chi tiết bạn đã đưa ra, bạn có nghĩ rằng bạn nên đề cập đến nó? Cách bạn mô tả nó, có vẻ như mỗi ứng dụng được ánh xạ tới bộ nhớ vật lý. Nói chung, những gì được trao đổi không phải là một cái gì đó gắn liền với một địa chỉ vật lý mà là một trang (ảo) khác của ứng dụng của riêng bạn. Không cần các đặc điểm sử dụng bộ nhớ của ứng dụng của bạn để ảnh hưởng đến ứng dụng của người khác. – tvanfosson

+1

@tvanfosson Nó đã không xảy ra với tôi để đề cập đến nó, và bây giờ mà bạn đã gợi ý nó tôi không chắc chắn làm thế nào để tóm tắt nó. Nhưng theo cách mà mỗi ứng dụng * được ánh xạ tới bộ nhớ vật lý: mỗi ứng dụng sẽ nhìn thấy toàn bộ không gian địa chỉ (hoặc hầu hết) như không gian địa chỉ được sở hữu bởi ứng dụng đó và bản đồ O/S giải quyết không gian cho RAM . Nhiều ứng dụng ngụ ý nhiều cá thể không gian địa chỉ và các phiên bản khác nhau cạnh tranh với nhau cho RAM. – ChrisW

+0

Quyết định xem cần trao đổi gì (ví dụ: có nên chọn trang đang được ứng dụng này sử dụng hay ứng dụng khác) là chi tiết triển khai cụ thể cho O/S (và tôi không biết chi tiết về iPhone). – ChrisW

2

Trong khi chương trình của bạn không chạy tất cả chương trình được lưu trữ trên RAM.
Có các cơ chế phân trang như một phần của hệ điều hành chỉ lưu trữ trang bộ nhớ được sử dụng nhiều nhất trong RAM để truy cập nhanh hơn.
Khi bạn chương trình cố gắng truy cập vào một vị trí bộ nhớ hiện không được tải vào RAM, lỗi trang xảy ra và trang được lấy từ đĩa.
Vì RAM có sẵn chỉ giới hạn các trang bộ nhớ quan trọng nhất được lưu trong RAM.

Cơ chế này phải tuân theo cài đặt hệ điều hành.
Để tìm hiểu thêm về lý thuyết hệ điều hành, tôi sẽ giới thiệu cuốn sách Hệ điều hành hiện đại của A.S.Tenenbaum.

3

Trang bộ nhớ là đơn vị dữ liệu cơ bản cho ứng dụng của bạn từ góc nhìn của hệ điều hành. Tất cả mã và dữ liệu của bạn được sắp xếp theo các nhóm trang. Khi chương trình của bạn tham khảo một vị trí bộ nhớ hợp pháp trong ứng dụng của bạn - hoặc bằng cách cố gắng đọc hoặc ghi dữ liệu hoặc tải hướng dẫn, địa chỉ được dịch sang một vị trí tại một trong các trang này. Một lỗi trang xảy ra khi trang giữ địa chỉ không thực sự xuất hiện trong bộ nhớ vật lý. Tại thời điểm đó hệ điều hành cần tải trang từ đĩa vào bộ nhớ để chương trình của bạn có thể tiếp tục.

+0

Vì vậy, trang được tải vào bộ nhớ tự động, khi con trỏ trỏ tới vị trí hiện không được tải? – dontWatchMyProfile

+0

Có - nó được tải bởi hệ điều hành. Khi ứng dụng của bạn tiêu thụ quá nhiều bộ nhớ, ví dụ như có rất nhiều lỗi trang khiến cho điều khiển quay trở lại hạt nhân để đọc các trang từ đĩa và thường khiến chương trình rất chậm. –

+0

có liên quan đến cái gọi là "tệp hoán đổi" không? – dontWatchMyProfile

Các vấn đề liên quan