FreeBSD phân bổ bộ nhớ như thế nào?


9

Tôi biết rằng điều này được đơn giản hóa / giải thích tổng quát, nhưng top(1)bộ nhớ chia tiện ích trong FreeBSD thành sáu pools- Active, Inactive, Wired, Cache, BuffersFree. Ví dụ từ top(1)đầu ra:

Mem: 130M Active, 42M Inact, 51M Wired, 14M Cache, 34M Buf, 648K Free
Swap: 512M Total, 512M Free

Activeđược sử dụng bởi các tiến trình đang chạy và Wiredđược sử dụng chủ yếu cho kernel. Inactivelà bộ nhớ từ các tiến trình đóng vẫn được lưu trong bộ nhớ cache trong trường hợp cần sử dụng lại, Cachelà dữ liệu được lưu trong bộ đệm, Bufferslà bộ đệm đĩa (tôi đoán nó tương tự như cachedtrong free(1)đầu ra Linux (?)) và Freelà bộ nhớ hoàn toàn không được sử dụng. Tôi thích hợp mà FreeBSD hạt nhân tự động phân bổ không gian từ Inactive, CacheBuffershồ bơi để Activehoặc Wirednếu cần thiết?

Câu trả lời:


13

Để làm cho nó ngắn, hoạt độngcó dây được sử dụng bộ nhớ không nên hoặc không thể hoán đổi sang bộ nhớ trống. Mặc dù không hoạt động có thể được hoán đổi đúng cách, nhưng vẫn được sở hữu (không được giải phóng) bởi một tiến trình hoặc kernel, vì vậy đây không phải là bộ nhớ được sử dụng nhiều, nhưng vẫn được sử dụng.

Mới là đồ giặt là một danh sách các trang bộ nhớ bẩn, có thể cần phải ghi vào thiết bị trao đổi. Hoặc nếu bộ nhớ bẩn cần được hoán đổi hoặc không, chúng sẽ được thêm lại vào hàng không hoạt động.

Bộ nhớ có dây không được trao đổi, để đảm bảo an toàn (trong trường hợp kernel) hoặc tối ưu hóa quy trình người dùng (như ZFS). Bộ nhớ có dây được sử dụng để lưu trữ hệ thống tập tin, có thể được giải phóng bởi kernel. Ít nhất cho ZFS, đây có thể được coi là bộ nhớ miễn phí.

Bộ nhớ miễn phí chắc chắn là miễn phí.

Bộ nhớ đệm (hiện không dùng nữa, tôi đoán vậy) đã sẵn sàng để được giải phóng, vì nó đã được hoán đổi và chỉ ở đó để có thể tái phân bổ.

Bộ đệm được sử dụng làm bộ đệm bởi hầu hết các hệ thống tệp (UFS, FAT, ...) và là dung lượng bộ nhớ được sử dụng bởi các hệ thống tệp. Nó có thể là Actice, không hoạt động hoặc có dây.

ARC (Bộ đệm thay thế thích ứng) là bộ đệm được ZFS sử dụng và nó là bộ nhớ có thể được giải phóng khi cần.

Từ Wiki FreeBSD trên bộ nhớ

Lớp học bộ nhớ

Hoạt động

  • Chứa các trang "tích cực" (gần đây) được tham chiếu bởi userland
  • Chứa hỗn hợp các trang sạch và bẩn
  • Các trang được quét thường xuyên bởi trình nền của trang (mỗi trang được truy cập một lần mỗi vm.pageout_update_apse giây)
  • Quét kiểm tra xem trang đã được tham chiếu từ lần quét trước chưa
  • Nếu quét đủ hoàn thành mà không thấy tham chiếu, trang sẽ được chuyển sang hàng không hoạt động
  • Thực hiện giả-LRU

Không hoạt động

  • Chứa các trang nằm ngoài hàng đợi hoạt động
  • Chứa các trang bị đuổi khỏi bộ đệm
  • Chứa hỗn hợp các trang sạch và bẩn
  • Các trang được quét bởi daemon trang (bắt đầu từ đầu hàng đợi) khi thiếu bộ nhớ:
    • Các trang đã được tham chiếu được chuyển trở lại hàng đợi hoạt động hoặc đuôi của hàng đợi không hoạt động
    • Các trang bị bẩn được chuyển đến đuôi của hàng giặt
    • Không được kiểm duyệt, các trang sạch có thể được giải phóng và tái sử dụng ngay lập tức
  • Triển khai LRU cơ hội thứ hai

Giặt ủi

  • Hàng đợi để quản lý các trang không hoạt động bẩn, phải được làm sạch ("giặt") trước khi chúng có thể được sử dụng lại
  • Được quản lý bởi một luồng riêng, luồng giặt, thay vì daemon trang
  • Giặt ủi giặt một số lượng nhỏ các trang để cân bằng hàng đợi không hoạt động và giặt
  • Tần suất giặt là tùy thuộc vào:
    • Có bao nhiêu trang sạch daemon trang được giải phóng; nhiều giải phóng hơn góp phần vào tần suất giặt cao hơn
    • Kích thước của hàng giặt liên quan đến hàng đợi không hoạt động; nếu hàng giặt đang tăng, chúng tôi sẽ giặt thường xuyên hơn
  • Các trang được quét bởi luồng giặt (bắt đầu từ đầu hàng đợi):
    • Các trang đã được tham chiếu được chuyển trở lại hàng đợi hoạt động hoặc đuôi của hàng giặt
    • Các trang bẩn được giặt và sau đó được chuyển đến gần đầu của hàng đợi không hoạt động

Miễn phí

  • Bộ nhớ có sẵn để sử dụng bởi phần còn lại của hệ thống.

Có dây

  • Bộ nhớ không thể phân trang: không thể được giải phóng cho đến khi chủ sở hữu phát hành rõ ràng
  • Bộ nhớ người dùng có thể được nối dây bằng mlock (2) (tùy theo giới hạn hệ thống và mỗi người dùng)
  • Bộ cấp phát bộ nhớ kernel trả về bộ nhớ có dây
  • Nội dung của ARC và bộ đệm bộ đệm có dây
  • Một số bộ nhớ được nối dây vĩnh viễn và không bao giờ được giải phóng (ví dụ: chính tệp kernel)

Từ Thiết kế và triển khai hệ điều hành FreeBSD chương 6.12 Thay thế trang (Không hoàn toàn chính xác nữa, nhưng ở đây để giới thiệu câu hỏi cũ):

Nhân chia bộ nhớ chính thành năm danh sách:

  1. Có dây : Các trang có dây bị khóa trong bộ nhớ và không thể được phân trang. Thông thường các trang này đang được sử dụng bởi kernel hoặc máy nhắn tin bộ nhớ vật lý, hoặc chúng đã bị khóa bằng mlock . Ngoài ra, tất cả các trang đang được sử dụng để giữ ngăn xếp luồng của các quá trình được tải (tức là không tráo đổi) cũng có dây.
  2. Hoạt động : Các trang hoạt động đang được sử dụng bởi một hoặc nhiều vùng bộ nhớ ảo. Mặc dù kernel có thể loại chúng ra, nhưng làm như vậy có khả năng khiến một quy trình hoạt động khiến chúng bị lỗi trở lại.
  3. Không hoạt động : Các trang không hoạt động có thể bị bẩn và có nội dung vẫn được biết đến, nhưng chúng thường không phải là một phần của bất kỳ khu vực hoạt động nào. Nếu nội dung của trang bị bẩn, nội dung phải được ghi vào cửa hàng sao lưu trước khi trang có thể được sử dụng lại. Khi trang đã được xóa, nó sẽ được chuyển đến danh sách bộ đệm. Nếu hệ thống bị thiếu bộ nhớ, trình nền trang có thể cố gắng di chuyển các trang đang hoạt động sang danh sách không hoạt động với hy vọng tìm thấy các trang không thực sự được sử dụng. Tiêu chí lựa chọn được sử dụng bởi daemon pageout để chọn các trang để chuyển từ danh sách hoạt động sang danh sách không hoạt động được mô tả sau trong phần này. Khi danh sách bộ nhớ trống và bộ nhớ cache giảm xuống mức thấp, trình nền trang sẽ đi qua danh sách không hoạt động để tạo thêm bộ đệm và trang miễn phí.
  4. Bộ nhớ cache : Các trang bộ đệm có nội dung vẫn được biết, nhưng chúng không phải là một phần của ánh xạ. Nếu chúng bị lỗi vào vùng hoạt động, chúng không phải là một phần của bất kỳ ánh xạ nào. Nếu chúng bị lỗi trong vùng hoạt động, chúng sẽ được chuyển từ danh sách bộ đệm sang danh sách hoạt động. Nếu chúng được sử dụng để đọc hoặc ghi, chúng sẽ được chuyển từ danh sách bộ đệm trước tiên sang bộ đệm bộ đệm và cuối cùng được phát hành vào danh sách không hoạt động. Một cuộc gọi hệ thống mlock có thể lấy lại một trang từ danh sách bộ đệm và nối nó. Các trang trong danh sách bộ đệm tương tự như các trang không hoạt động ngoại trừ chúng không bẩn, vì chúng không được sửa đổi kể từ khi chúng được phân trang hoặc do chúng đã được ghi vào cửa hàng sao lưu của chúng. Chúng có thể được yêu cầu sử dụng mới khi cần một trang.
  5. Miễn phí : Các trang miễn phí không có nội dung hữu ích và sẽ được sử dụng để thực hiện các yêu cầu tìm kiếm trang mới.

Để trả lời câu hỏi ban đầu của bạn

Tôi có đúng không khi nhân FreeBSD tự động phân bổ không gian từ nhóm Không hoạt động, Bộ đệm và Bộ đệm thành Hoạt động hoặc Có dây nếu cần?

Các trang hoạt động có thể trở nên không hoạt động nếu chúng không được sử dụng trong một thời gian. Nếu kernel hoán đổi một trang không hoạt động, trang này sẽ được chuyển đến danh sách bộ đệm . Trang trong danh sách bộ đệm không phải là một phần của ánh xạ ảo của bất kỳ quy trình nào nhưng có thể dễ dàng được thu hồi, dưới dạng hoạt động hoặc có dây . Hoặc khi cần cho I / O làm bộ đệm bộ đệm .

Bộ nhớ có dây không thể bị loại ra khỏi bộ nhớ chính. Nếu nó được nối bởi một quá trình, nó cần phải được thực hiện với munlockcuộc gọi để trở lại bộ nhớ hoạt động .

Hoạt động , không hoạt độngcó dây bộ nhớ có thể được giải phóng bởi các quá trình hoặc kernel và thêm vào miễn phí danh sách.


Tôi chỉ nhận thấy một lỗi trong câu hỏi ban đầu của tôi. Tôi hỏi "Am I correct rằng FreeBSD hạt nhân tự động phân bổ không gian từ Inactive, Wired, CacheBuffershồ bơi để Activehoặc Wirednếu cần thiết?" trong khi tôi có nghĩa là để hỏi "Am I correct rằng FreeBSD hạt nhân tự động phân bổ không gian từ Inactive, CacheBuffershồ bơi để Activehoặc Wirednếu cần thiết?". Tôi cập nhật câu hỏi ban đầu của tôi. Vì vậy, trong Tóm lại, sử dụng bộ nhớ trong FreeBSD là Wired+ Activevà nếu những hai hồ cần khối lượng bổ sung bộ nhớ thì đây được lấy từ Inacative, Cached, Buffershoặc Freehồ bơi?
Martin

@Martin vâng, nghe có vẻ đúng. Tôi cập nhật câu trả lời của tôi cho câu hỏi của bạn.
Raphael Ahrens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.