2013-08-30 72 views
7

Câu hỏi của tôi tương tự như this, tuy nhiên tôi hỏi một điều gì đó hơi khác một chút.Có phải std :: các phần tử vectơ tiếp giáp trong bộ nhớ vật lý không?

Rõ ràng, có thể sử dụng địa chỉ của thành phần std::vector đầu tiên làm mảng loại C. Điều đó có nghĩa là trong bộ nhớ ảo, các phần tử std::vector tiếp giáp nhau. Tuy nhiên, nếu bộ nhớ vật lý bị phân mảnh, có thể là std::vector thực sự được chia thành nhiều phần trong bộ nhớ vật lý.

Câu hỏi của tôi là: Các yếu tố std::vector tiếp giáp trong bộ nhớ vật lý (cũng như bộ nhớ ảo)?

+4

@hsouza: Đó là những gì anh ấy đã liên kết. Dường như anh ta đang hỏi liệu bản thân hệ điều hành có thể tiếp giáp "giả" hay không nhưng lại có sự phân chia bộ nhớ "thực"; thẳng thắn tôi không hiểu. – GManNickG

+0

@hsouza Tôi đã thêm liên kết vào câu hỏi này. – ST3

+2

Dưới mui xe malloc sử dụng mmap, do đó, câu hỏi sẽ là nếu mmap có thể cung cấp cho bạn bộ nhớ vật lý liền kề. Bạn đã xem xét điều này: http://stackoverflow.com/questions/4401912/linux-contiguous-physical-memory-from-userspace – LarryPel

Trả lời

14

Bộ nhớ được sử dụng để lưu trữ dữ liệu trong vec-tơ phải ở các địa chỉ liền kề vì các địa chỉ đó hiển thị với mã.

Trong trường hợp điển hình trên hầu hết các CPU/HĐH hiện đại, điều đó có nghĩa là các địa chỉ ảo phải tiếp giáp nhau. Nếu những địa chỉ ảo đó vượt qua một ranh giới trang, thì có khả năng là các địa chỉ vật lý sẽ không còn tiếp giáp nữa.

Tôi nên thêm rằng điều này chỉ hiếm khi là mối quan tâm chính. Các hệ thống hiện đại có ít nhất một số hỗ trợ cho việc sử dụng bộ nhớ phân mảnh như vậy xuống đến mức phần cứng trong nhiều trường hợp. Ví dụ, nhiều bộ điều khiển mạng và đĩa bao gồm khả năng "phân tán/thu thập", nơi hệ điều hành sử dụng các bảng trang để dịch địa chỉ ảo cho bộ đệm thành địa chỉ vật lý, sau đó cung cấp một số địa chỉ vật lý trực tiếp cho bộ điều khiển. dữ liệu từ các địa chỉ đó nếu nó chuyển từ bộ nhớ sang ngoại vi hoặc "phân tán" dữ liệu ra các địa chỉ đó nếu nó chuyển từ ngoại vi sang bộ nhớ.

6

Không, không có gì đảm bảo rằng bạn sẽ được cung cấp bộ nhớ vật lý liền kề trong máy trừu tượng của C++. Tóm tắt và phần cứng bên dưới malloc là miễn phí để sử dụng bộ nhớ không liên tục.

Chỉ thực hiện được nhắm mục tiêu của bạn mới có thể đảm bảo như vậy, nhưng ngôn ngữ/kiểu máy không quan tâm. Nó dựa vào hệ thống để thực hiện công việc của mình.

1

Ánh xạ ảo tới vật lý được xử lý chủ yếu bởi CPU, nhưng với sự hỗ trợ hạt nhân. Một quá trình sử dụng không thể biết bản đồ này là gì: chương trình của bạn, bất kể ngôn ngữ lập trình, chỉ giao dịch trong địa chỉ bộ nhớ ảo. Bạn không thể mong đợi, cũng không có bất kỳ cách nào để tìm ra, nếu hai địa chỉ bộ nhớ ảo liền kề nằm ngang một ranh giới trang liền kề trong bộ nhớ vật lý, do đó, hoàn toàn không có điểm đáng lo ngại về nó.

+3

"cũng không có bất kỳ cách nào để tìm ra" - tốt, điều này nói chung là không đúng, thông thường mọi hệ điều hành đều cung cấp một số cách để tìm ra (mặc dù nó có thể bị che khuất hoặc yêu cầu trình điều khiển tùy chỉnh) http://stackoverflow.com/ câu hỏi/6252063/đơn giản-cách-to-get-vật lý-địa chỉ-từ-the-hợp lý-một-trong-linux-kernel-mô-đun http://stackoverflow.com/questions/366602/how-to-translate-a -virtual-memory-address-to-a-physical-address; mặt khác, tôi đồng ý rằng không có cách nào * chuẩn * để làm một điều như vậy. –

+0

OK, @Matteo, bạn có thể cho tôi biết làm thế nào một chương trình userland có thể xác định địa chỉ vật lý tương ứng với một con trỏ tùy ý trong C dưới Linux và những gì sử dụng thông tin đó? – Emmet

+1

Ví dụ, thẩm vấn một trình điều khiển tùy chỉnh thực hiện các bước được mô tả trong liên kết đầu tiên ở trên và trả về kết quả cho nó; để sử dụng, nó có thể là lối vào cho trình gỡ rối hạt nhân, hoặc công cụ hack hoặc bất cứ thứ gì. Quan điểm của tôi là nói rằng "không có cách nào để tìm ra" là không chính xác, chỉ đơn giản là không có * tiêu chuẩn * hoặc * đơn giản * cách. Tôi biết rằng nó là nitpicking (và trên thực tế, +1 bạn có ở đây là của tôi), nhưng tôi không thích những tuyên bố tuyệt đối không chính xác. –

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