Tại sao Linux sử dụng phân vùng trao đổi khi kernel vẫn hỗ trợ phân trang / bộ nhớ ảo?


23

Theo như tôi hiểu phân trang và hoán đổi, chúng là những khái niệm hoàn toàn khác nhau. Trong khi hoán đổi có nghĩa là một quá trình hoàn toàn nằm trong bộ nhớ vật lý hoặc trên ổ cứng, với các phần phân trang của một tiến trình có thể nằm trong bộ nhớ vật lý và các phần khác có thể nằm trên ổ cứng.

Nhưng tại sao linux cần một phân vùng trao đổi sau đó? Nếu bộ nhớ vật lý đầy, một số quy trình sẽ được gia công vào ổ cứng và một quy trình mới sẽ được ánh xạ từ bộ nhớ ảo sang bộ nhớ vật lý.

Tôi chỉ không hiểu tại sao người ta cần một phân vùng trao đổi (hoặc trao đổi nói chung) sau đó?

Hay đây chỉ là vấn đề thuật ngữ và swap partition == virtual memory?


5
Coi chừng "bộ nhớ ảo" trong kiến ​​trúc máy tính là một kỹ thuật, trong khi MS Windows (IMO không chính xác) định nghĩa nó là "Bộ nhớ ảo là không gian lưu trữ trên đĩa cứng của máy tính của bạn mà Windows sử dụng cùng với bộ nhớ truy cập ngẫu nhiên (RAM)." I E. Google cửa sổ "bộ nhớ ảo"
sawdust

Câu trả lời:


25

Vâng, đó chỉ là vấn đề về thuật ngữ, trong nhiều trường hợp, phân vùng trao đổi được sử dụng làm bộ nhớ ảo.

Lý do các hệ thống giống UNIX và UNIX thích phân vùng trao đổi thành tệp trang là vì chúng có thể liền kề nhau dẫn đến thời gian tìm kiếm thấp hơn so với tệp trang có thể bị phân mảnh.


6
Và theo cách này, việc chia sẻ một phân vùng trao đổi giữa các bản cài đặt Linux cũng dễ dàng hơn.
oKtosiTe

3
thường thì một pagefile được tạo hoàn toàn trong lần khởi động đầu tiên, vì vậy nó sẽ không bị phân mảnh (vâng .. vẫn còn một vài khả năng ..)
AndreaCi

11
Các UNIX đầu tiên chỉ có trao đổi, không phân trang và chỉ có thể trao đổi sang một phân vùng chuyên dụng. Phân trang được triển khai ngay khi phần cứng hỗ trợ, nhưng tên "phân vùng trao đổi" bị kẹt. Phân trang cho một tệp gần đây hơn và có hệ điều hành cao hơn cũng như có nguy cơ bị phân mảnh, vì vậy nó vẫn không được khuyến khích.
zwol

1
"phân vùng trao đổi được sử dụng làm bộ nhớ ảo." - Chỉ Microsoft Windows xác định bộ nhớ thứ cấp (ví dụ: tệp trang trên đĩa) là "bộ nhớ ảo". Nhưng thậm chí họ đang cố gắng tránh xa việc sử dụng này. Hãy thử cửa sổ "bộ nhớ ảo" và tóm tắt cho kết quả đầu tiên ("Bộ nhớ ảo là không gian lưu trữ ...") không khớp với nội dung trang. Một tuyên bố chính xác sẽ là "phân vùng trao đổi được sử dụng bởi bộ nhớ ảo."
sawdust

14

Tôi không biết bạn đã hiểu khái niệm hoán đổi ở đâu, rằng một quá trình hoàn toàn nằm trong bộ nhớ vật lý hoặc trên ổ cứng. Ý nghĩa đó đã không được sử dụng trong một vài thập kỷ. Trích dẫn Wikipedia :

Trong lịch sử, hoán đổi đề cập đến việc chuyển từ / sang lưu trữ thứ cấp toàn bộ chương trình tại một thời điểm, trong một sơ đồ được gọi là roll-in / roll-out. Vào những năm 1960, sau khi khái niệm về bộ nhớ ảo được đưa ra trong hai biến thể, sử dụng phân đoạn hoặc trang, thuật ngữ hoán đổi được áp dụng để di chuyển, tương ứng, là phân đoạn hoặc trang, giữa đĩa và bộ nhớ. Ngày nay với bộ nhớ ảo chủ yếu dựa trên các trang, không phải phân đoạn, việc hoán đổi đã trở thành một từ đồng nghĩa khá gần gũi với phân trang, mặc dù có một điểm khác biệt. [Nghi ngờ - thảo luận]

Thật vậy, trong bất kỳ bối cảnh nào liên quan đến Linux (hoặc các hệ thống unix khác cho vấn đề đó), phân trang hoán đổi là khá nhiều đồng nghĩa. Cả hai đều đề cập đến việc sử dụng bộ nhớ ảo trong đó dữ liệu của trang có thể được lưu trữ trong RAM hoặc trên đĩa. (Một trang có dung lượng 4kB trên bất kỳ thiết bị nào bạn có thể gặp phải.) Chương trình sử dụng trang bộ nhớ không quan tâm hoặc thậm chí không biết dữ liệu được lưu trữ ở đâu, nó chỉ tiếp tục sử dụng địa chỉ ảo. Nhân truyền dữ liệu giữa RAM và đĩa và cập nhật MMU các bảng sẽ đi cùng để mục nhập cho địa chỉ ảo chỉ vào một trang vật lý trong bộ nhớ hoặc chứa một giá trị đặc biệt khiến bộ xử lý thực thi một số mã hạt nhân sẽ tải dữ liệu phù hợp từ đĩa.

Phân trang đề cập đến quá trình chung này. Trao đổi đề cập đến trường hợp dữ liệu trên đĩa nằm trong vùng dành riêng: vùng trao đổi (phân vùng trao đổi hoặc tệp hoán đổi). Phân trang cũng có thể được thực hiện giữa RAM và tệp và trong trường hợp này thường không được gọi là hoán đổi . Ví dụ, khi bạn thực thi một chương trình, mã phải được tải vào bộ nhớ để được thực thi; nếu một trang mã cần phải được gỡ bỏ khỏi RAM để nhường chỗ cho thứ khác, thì không cần phải viết trang này lên vùng trao đổi, vì nó có thể được tải lại từ tệp chương trình. (Điều này có thể được thực hiện cho tất cả dữ liệu chỉ đọc, không chỉ mã chương trình.)

Nếu bộ nhớ vật lý đã đầy (gần như), kernel sẽ tìm một trang trong RAM (không phải toàn bộ quá trình) gần đây không được sử dụng. Nếu trang đó tái tạo nội dung của tệp đĩa (có các bảng trong kernel để chỉ ra điều này), trang có thể được lấy lại. Nếu không, trang được viết ra để trao đổi, sau đó được thu hồi. Dù bằng cách nào thì kernel cập nhật mục trong bảng bộ nhớ ảo của tiến trình (trở thành bảng MMU trong khi tiến trình thực thi) để đánh dấu nó là không có trong RAM và sau đó có thể sử dụng lại trang vật lý cho một thứ khác (một chương trình khác hoặc một trang khác cùng một chương trình).


9

Bộ nhớ ảo / tiện ích phân trang cho phép kernel "ảo hóa" bộ nhớ cho các quá trình không gian người dùng. Nhân có thể lấy các trang từ bộ nhớ vật lý và sắp xếp chúng thông qua phân trang để chúng xuất hiện liền kề với quy trình không gian người dùng.

Một giới hạn có thể được đặt trên bộ nhớ của quy trình không gian người dùng và nếu quá trình vượt quá "lỗi trang" xảy ra, điều này gây ra ngoại lệ CPU bị trả về kernel. Điều này ngăn chương trình không gian người dùng làm rối với bộ nhớ được cấp phát cho kernel hoặc các chương trình khác mà không có sự cho phép của kernel.

Thông thường các chương trình không gian người dùng yêu cầu kernel mở rộng giới hạn này thông qua các giao diện được xác định rõ (được gọi bởi các hàm C malloc()free() ví dụ.). Hạt nhân chịu trách nhiệm theo dõi số lượng và bộ nhớ mà chương trình được phân bổ.

Cơ chế "lỗi trang" này cũng có thể cho phép nhân trao đổi trang mà quá trình đang cố truy cập với một từ đĩa, nếu hạt nhân có thể cung cấp quá nhiều bộ nhớ (và cả Windows và Linux đều hỗ trợ điều này) do đó nó được gọi là trao đổi. Nếu quyền truy cập bộ nhớ thực sự không hợp lệ (nghĩa là quá trình đang cố truy cập vào bộ nhớ thì trước tiên nó không yêu cầu), thông thường quy trình sẽ bị hủy bằng SIGSEGV.

Vì vậy, "tráo đổi" là một tính năng bổ sung (trong Linux, bạn thực sự có thể vô hiệu hóa nó hoàn toàn nếu bạn muốn) phụ thuộc vào bộ nhớ / phân trang ảo, nhưng không bắt buộc chỉ vì CPU có bộ nhớ / phân trang ảo. Các khái niệm không giống nhau nhưng hoán đổi phụ thuộc vào phân trang / bộ nhớ ảo để tồn tại.


Ngoài ra, sau khi đọc kỹ câu hỏi của bạn, "phân trang" đôi khi được sử dụng như một từ đồng nghĩa với "hoán đổi" - nhưng tôi chưa bao giờ nghe nói về "hoán đổi" có nghĩa là toàn bộ bộ nhớ của quá trình bị tráo đổi so với "phân trang" chỉ là một phần của nó được hoán đổi

Nhưng tại sao linux cần một phân vùng trao đổi sau đó? Nếu bộ nhớ vật lý   đã đầy, một số quy trình sẽ được gia công cho ổ cứng và một quy trình mới   quá trình sẽ được ánh xạ từ bộ nhớ ảo sang bộ nhớ vật lý.

"Bộ nhớ ảo" bộ nhớ vật lý, chỉ "ánh xạ lại." Phần cứng MMU không thể ánh xạ trực tiếp tới bất kỳ thiết bị lưu trữ nào. MMU có thể đưa ra một lỗi báo cho kernel một tiến trình đã cố truy cập vào bộ nhớ mà nó không nên có - và kernel có thể sử dụng cơ chế này để thấy rằng một tiến trình muốn lấy lại thứ gì đó từ đĩa mà nó nghĩ là trong bộ nhớ và sau đó thực hiện " hoán đổi ". Vấn đề là hệ điều hành quyết định lưu các trang vào đĩa để nó có thể sử dụng các trang đó cho các quy trình khác chứ không phải phần cứng.


2

Trong phân vùng trao đổi chung không bằng bộ nhớ ảo.

Các quy trình có thể cần nhiều bộ nhớ hơn bộ nhớ vật lý thực tế, vì vậy các nhà phát triển hệ điều hành đã quyết định cho rằng có nhiều bộ nhớ trong hệ thống được gọi là "bộ nhớ ảo".

Bộ nhớ ảo này về cơ bản là bộ nhớ vật lý và là một phần của đĩa. Phần này của đĩa được gọi là "trao đổi" trong Linux.

Các nhà phát triển cũng đề xuất rằng việc sử dụng một phần của bộ nhớ ảo nằm trên đĩa cứng phải càng thấp càng tốt. Vì lợi ích của nó, tất cả bộ nhớ ảo được chia thành các phần nhỏ được gọi là "trang". Rất nhiều trang được sử dụng với tốc độ thấp, những trang này phải được ghi ra một phần của bộ nhớ ảo trên đĩa cứng. Hoạt động này được gọi là "trao đổi". HĐH phải theo dõi những trang nào không có trong bộ nhớ vật lý để tìm chúng khi cần. Lỗi trang xảy ra khi một chương trình muốn ghi / đọc một phần của bộ nhớ bị tráo đổi.

Để trả lời câu hỏi của bạn: Linux cần một phân vùng trao đổi để trao đổi một số trang của bộ nhớ và bạn có thể thấy một thống kê về việc sử dụng bộ nhớ ảo với vmstat:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache    si   so    bi    bo   in   cs us sy id wa
2  0  35424 524560 134164 1858728    0    0    13    11   55   42  5  1 94  0
0  0  35424 526720 134164 1857872    0    0     0     0 2774 5224  7  2 91  0
1  0  35424 516328 134172 1870116    0    0     0     6 3464 6561 13  3 84  0
0  0  35424 522992 134212 1862676    0    0     0   125 4135 7135 12  4 84  1

Cột 'hoán đổi' hiển thị trao đổi ra và theo thống kê. Cũng thế liên kết này giải thích bộ nhớ ảo và cách sử dụng vmstat cũng.

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.