Có bất kỳ mối quan hệ giữa phân mảnh bộ nhớ và liệu hoán đổi được kích hoạt trên một hệ thống?


8

Một trong những câu trả lời cho Tôi có cần dung lượng trao đổi nếu tôi có đủ dung lượng RAM không? làm tôi tự hỏi liệu có bất kỳ mối quan hệ giữa phân mảnh bộ nhớ như được đo bằng cat /proc/buddyinfo và liệu có sử dụng trao đổi hay không. Để cụ thể hơn, tôi tự hỏi nếu sử dụng trao đổi có thể làm giảm sự phân mảnh bộ nhớ. Trong một ngày bình thường làm việc với trao đổi tắt trên hệ thống của tôi, tôi có điều này:

tvbox@tvbox-G31M-ES2L:~$ cat /proc/buddyinfo
Node 0, zone      DMA      3      3      4     14     16      6      2      0      0      1      0 
Node 0, zone   Normal   1564   1052    462    356    240    109     33     21      6      1      0 
Node 0, zone  HighMem     43   1972    839    285    183    109     98     34     16      0      0 
tvbox@tvbox-G31M-ES2L:~$ free
             total       used       free     shared    buffers     cached
Mem:       2053888    1821904     231984     171376     299908     812940
-/+ buffers/cache:     709056    1344832
Swap:            0          0          0

Lưu ý: hệ thống này có thời gian hoạt động không bao giờ vượt quá 18 giờ.

Trên một hệ thống được sử dụng nhiều hơn, tôi có cái này:

me@me-zippy:~$ cat /proc/buddyinfo
Node 0, zone      DMA    149    106     70     26     15      5      4      0      0      2      0 
Node 0, zone   Normal   2455   3527   4651   1421    367    157     61     19     14      3      0 
Node 0, zone  HighMem      7     43     75    266    166    162     91     43     27      0      0 
me@me-zippy:~$ free -h
             total       used       free     shared    buffers     cached
Mem:          7.4G       7.0G       351M       281M       116M       6.0G
-/+ buffers/cache:       967M       6.4G
Swap:           0B         0B         0B
me@me-zippy:~$ uptime
 12:01:49 up 3 days,  3:20,  2 users,  load average: 0.52, 0.23, 0.17

Bạn sẽ lưu ý rằng cả hai hệ thống này đều không được trao đổi.


4
Vì tò mò, tại sao sẽ có vấn đề nếu bộ nhớ bị phân mảnh? Nó không giống như một đĩa cứng, nơi tìm kiếm vấn đề thời gian. Dù sao, bộ nhớ sẽ luôn xuất hiện liền kề nhau trong không gian địa chỉ ảo của quy trình, do đó, không gian người dùng thậm chí không thể biết liệu bộ nhớ có bị phân mảnh ở cấp độ vật lý hay không. Có phải vì các bảng dịch trang trở nên phức tạp hơn?
Celada

Câu hỏi hay. Các điều kiện đã được đưa ra như là một lý do để sử dụng trao đổi. Tôi vẫn còn hoài nghi vì vậy tôi đang tìm kiếm bất kỳ kết nối nào giữa việc sử dụng trao đổi và phân mảnh bộ nhớ. Tôi không mong đợi để tìm thấy một nhưng tôi luôn sẵn sàng thay đổi lập trường của mình khi đối mặt với thông tin mới. Tôi có thể tự mình trả lời câu hỏi này sau khi thử nghiệm thêm.
Anh Cả Geek

Câu trả lời:


3

Hoán đổi cho phép các trang vật lý được di chuyển xung quanh, theo nghĩa là một trang được sử dụng cho một mục đích có thể khiến nội dung của nó bị tráo đổi sau đó được sử dụng cho mục đích khác.

Trong một hệ thống quản lý bộ nhớ ảo đa dạng trong vườn, không có sự phân mảnh bộ nhớ vật lý nào liên quan đến các ứng dụng. Mỗi trang được phân bổ bởi một ứng dụng có thể được lấy ở bất kỳ đâu trong bộ nhớ vật lý, không có lý do gì mà hai trang liên tiếp trong bộ nhớ ảo sẽ cần có bất kỳ sự gần gũi cụ thể nào trong bộ nhớ vật lý.

Có nhiều trường hợp phân mảnh bộ nhớ là một mối quan tâm: bất kỳ trường hợp nào trong đó vị trí bộ nhớ vật lý quan trọng. Điêu nay bao gôm:

  • Paravirtualization , trong đó các máy ảo quyết định ai sở hữu trang vật lý nào ở mức độ chi tiết thô hơn một trang.
  • Tương tự, các cụm trong đó một số nút chia sẻ cùng một nhóm RAM.
  • Bộ nhớ được sử dụng bởi các thiết bị ngoại vi, thường đòi hỏi bộ đệm tiếp giáp lớn.
  • Tối ưu hóa như các trang lớn .

Trong trường hợp không có kịch bản phức tạp, các phân đoạn bộ nhớ vật lý có thể dẫn đến các sự cố khi kết nối một thiết bị mới đòi hỏi một bộ nhớ liền kề (hạt nhân giữ các nhóm như vậy cho điều đó, nhưng chúng có thể cần được mở rộng nếu trình điều khiển đột nhiên tạo ra một khối lớn yêu cầu). Nếu việc sử dụng thiết bị là không đổi, sự phân mảnh vật lý sẽ không thành vấn đề và đặc biệt sẽ không khiến ứng dụng chạy chậm hơn hoặc hết dung lượng.

Có thể việc phân mảnh không gian địa chỉ vật lý có thể dẫn đến việc sử dụng nhiều bộ nhớ hơn trong kernel để thể hiện danh sách miễn phí. Tôi không tin rằng đây là trường hợp của Linux nhưng tôi không phải là một chuyên gia về quản lý bộ nhớ.

Tóm lại, cho phép một phần của ứng dụng hoán đổi không cho phép ứng dụng này phân bổ thêm bộ nhớ, nhưng có thể cho phép một số trình điều khiển phần cứng phân bổ bộ nhớ mà họ cần.

Thêm trao đổi không ảnh hưởng đến không gian bộ nhớ ảo của ứng dụng. Rốt cuộc, đó là điểm trao đổi - rõ ràng đối với các ứng dụng.

Tuy nhiên, có thể việc thêm trao đổi vào máy sẽ có ảnh hưởng gián tiếp đến sự phân mảnh bên trong không gian bộ nhớ ảo của ứng dụng. Nếu hệ thống hết bộ nhớ ảo, thì ứng dụng sẽ phải thực hiện với những gì nó có. Nếu ứng dụng đang sử dụng hầu hết bộ nhớ được phân bổ từ hệ điều hành, điều này theo thời gian sẽ gây ra sự phân mảnh bên trong không gian đó khi các khối nhỏ được giải phóng ở đây và đó. Nếu ứng dụng có nhiều bộ nhớ ảo hơn (một số trong số đó bị tráo đổi), điều này sẽ giúp trình quản lý bộ nhớ có nhiều chỗ hơn để điều khiển và do đó giảm nguy cơ ứng dụng sẽ hết bộ nhớ, với ba khối 2kB riêng biệt có sẵn khi nó muốn Đối tượng 4kB.


Thật thú vị khi mọi câu trả lời đều dẫn đến một câu hỏi mới? Bây giờ tôi thấy mình tò mò về thứ tự quản lý bộ nhớ của các hoạt động và những kỹ thuật nào để giải phóng bộ nhớ phải thất bại trước khi đạt được điều kiện hết bộ nhớ. Giả định của tôi là bộ nhớ cache ít quan trọng nhất và sẽ bị loại bỏ trước tiên. Tôi biết có một hạt nhân sự thật ở đây ở đâu đó (ý định chơi chữ). ;-)
Anh Cả Geek

@ElderGeek - Tài liệu / cgroups / memory.txt có lẽ là một nơi tốt để bắt đầu. Mặc dù nó đã hết thời nhưng nó không có tổng quan tốt về bộ điều khiển bộ nhớ kernel.
mikeerv

@mikeerv Cảm ơn bạn vì điều đó. Tôi cũng đã tìm thấy - Landley.net/wr/memory-faq.txt cũng có vẻ "hết thời" nhưng ít nhất có vẻ như lý thuyết của tôi về việc bỏ bộ nhớ cache hợp lý vào RAM miễn phí trước khi dùng đến việc giết chết quy trình là chính xác. Tôi nghi ngờ tôi sẽ tìm hiểu nhiều hơn về nó mà không đi sâu vào mã. Điều đó có thể vượt xa tôi một chút vì tôi đã không viết bất kỳ mã nào ngoài kịch bản bash trong nhiều thập kỷ ...
Elder Geek
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.