2011-12-17 27 views
7

Trong một máy 32 bit, mỗi quá trình nhận được một không gian ảo 4GB. Trong trường hợp này người ta có thể lo lắng rằng chúng ta có thể gặp rắc rối do sự phân mảnh. Nhưng trong trường hợp của một máy tính 64-bit, về lý thuyết chúng tôi có một bộ nhớ ảo địa chỉ rất lớn, vậy tại sao phân mảnh bộ nhớ vẫn là một vấn đề (nếu có) trong một máy tính 64-bit?Tại sao phân mảnh bộ nhớ lại là vấn đề trên máy tính 64 bit?

+2

Nó không phải là một vấn đề trên hệ điều hành 64-bit. –

+0

Nhận xét này có phải là câu trả lời không? Câu trả lời hiện tại dường như ngụ ý rằng nó là một vấn đề trong 64bit – paulm

Trả lời

5

Mỗi địa chỉ ảo mà bạn cố gắng truy cập được ánh xạ bởi hệ điều hành vào bộ nhớ vật lý. Bộ nhớ vật lý được phân bổ trong các trang (ví dụ: kích thước 4K). Nếu bạn quản lý để phân bổ một byte tại offset 1000000 * n và làm điều đó cho n từ 1 đến 1000000 (tôi nghĩ rằng bạn có thể làm điều đó với mmap), thì hệ điều hành sẽ phải quay lại với một triệu trang của vật lý bộ nhớ, cái gì đó giống như 4G. Đó là bộ nhớ vật lý sẽ không có sẵn cho bất cứ điều gì khác. Nếu bạn đã phân bổ các byte liên tục, bạn chỉ cần khoảng 1 triệu bộ nhớ vật lý (256 trang) cho hàng triệu byte của bạn.

Bạn có thể gặp phải tình huống xấu tương tự nếu bạn phân bổ 4G vì lý do chính đáng và sau đó phân bổ các phần của nó, giữ một chút của mỗi trang được phân bổ. Hệ điều hành sẽ không thể sử dụng lại bộ nhớ được giải phóng cho bất cứ thứ gì khác bởi vì không có trang vật lý nào hoàn toàn miễn phí. Vì vậy, đó là một vấn đề phân mảnh.

Về lý thuyết, bạn có thể tưởng tượng rằng địa chỉ ảo 1000000 và 2000000 sẽ ánh xạ tới cùng một trang của bộ nhớ vật lý, tránh phân mảnh. Nhưng trong thực tế, và vì lý do tốt, việc lập bản đồ bộ nhớ ảo được thực hiện trên cơ sở từng trang. Bạn có thể đọc thêm tại đây: http://en.wikipedia.org/wiki/Page_table.

+0

Vì 64 bit có một không gian địa chỉ ảo điên không có vấn đề gì trong số này? Trừ khi bạn có TB của ram và tiếp tục làm điều này với 50TB như vậy? – paulm

+0

Đọc kỹ hơn: nó giải thích lý do tại sao các trang * vật lý bị lãng phí khi bạn có phân mảnh. –

+0

Vâng, nhưng câu hỏi đặt ra là "Tại sao phân mảnh bộ nhớ lại là vấn đề trên máy tính 64 bit?" Vì vậy, chắc chắn sự bắt đầu của câu trả lời nên là "Nó không phải là"? – paulm

0

Vì tất cả bộ nhớ đó bị "lãng phí" nên xem xét một ứng dụng mà bạn có nhiều phân mảnh nội bộ. Quá trình đó đòi hỏi nhiều trang hơn trong bộ nhớ vì bộ làm việc giờ đây nằm rải rác trong bộ nhớ và điều đó có nghĩa là dung lượng bộ nhớ của nó cao hơn nhiều. Nếu ứng dụng này đang cạnh tranh cho các khe vật lý trong RAM (các máy vẫn thực sự chỉ có khoảng 4 - 8 GB RAM cho một thiết lập nhà thông thường) thì nó gây ra nhiều trao đổi trang hơn. Nói chung bạn muốn giảm dung lượng bộ nhớ ứng dụng của bạn để tránh áp lực bộ nhớ và tranh chấp với các ứng dụng khác.

Có những trường hợp mặc dù nó không thực sự quan trọng, nó sẽ không giết bạn để sử dụng thêm một megabyte ở đây hoặc ở đó nhưng tất cả đều tăng lên trong các ứng dụng lớn hơn. Nó phụ thuộc vào tình huống có hay không điều quan trọng là có ít sự phân mảnh nhất có thể tùy thuộc vào những gì bạn đang viết mã hoặc mục tiêu của dự án của bạn là gì.

+0

Nhưng những gì về "phân mảnh bộ nhớ"? Một câu trả lời cho điều này có thể bao gồm cách malloc, hệ điều hành và các yếu tố phần cứng phân bổ và ánh xạ bộ nhớ ảo ... –

+0

@pst Câu hỏi từ những gì tôi hiểu chỉ được hỏi về hậu quả không phải là nó xảy ra như thế nào ngay từ đầu (mặc dù tôi có thể đã đọc nó sai). –

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