2011-08-31 10 views
6

Tôi là một chút nhầm lẫn như thế nào glibc trên linux cấp phát bộ nhớ của nó để program.These khác nhau là một vài câu hỏi:Các chương trình khác nhau có được bộ nhớ của chúng từ một đống thông thường hay từ một vùng riêng biệt?

  1. Có được phân bổ từ một đống chung (ví dụ là có một đống chung trên tất cả các các quy trình trong linux) hoặc có một đống được phân bổ cho mọi quá trình trong hệ thống.

  2. Giả sử nếu tôi biên soạn một thư viện tĩnh và cuối cùng nó được liên kết tĩnh với quy trình chính, cách nó sẽ nhận được bộ nhớ của nó? Là nó đã được liên kết với một số heap khác (như chúng tôi đã biên dịch nó) hoặc sẽ nhận được bộ nhớ của nó từ heap của quá trình chính.

+1

Dưới đây là một câu trả lời mà minh họa Linux Memory Model: http://stackoverflow.com/questions/2048007/linux-ia-32-memory-model –

+1

Xem [Làm thế nào Các Kernel Quản lý bộ nhớ của bạn] (http : //duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory) để biết tổng quan ... và sau đó là một số! Vì vậy, nhiều cho là "đơn giản" ;-) –

Trả lời

4
  1. Không có đống chung theo nghĩa libc - điều này sẽ vi phạm bảo vệ quá trình và các quy tắc bộ nhớ ảo. Mỗi quá trình duy trì đống riêng của nó. Nhân (với sự trợ giúp của MMU trong bộ xử lý) duy trì các bảng bộ nhớ ảo ánh xạ các địa chỉ ảo tới bộ nhớ thực.

  2. Thư viện tĩnh không gì khác ngoài việc liên kết mã tại thời gian biên dịch - không có khái niệm thời gian chạy của thư viện tĩnh. Nó là một và giống như quá trình, và sẽ sử dụng đống của nó.

+0

từ điểm của bạn 2) -Đó có nghĩa là một bộ nhớ chia sẻ sẽ có bộ nhớ riêng của nó và nó khác với đống được sử dụng bởi quá trình chính của hệ thống? – pjain

+0

Các thư viện được chia sẻ sẽ sử dụng đống quy trình, nhưng mã của chúng sẽ được chia sẻ giữa các quá trình. –

+0

và những gì về thư viện động. Họ cũng chia sẻ đống từ quá trình chính hoặc có đống khác nhau cho họ. – pjain

0

Heap (và mọi bộ nhớ có thể ghi khác - ngăn xếp, BSS, v.v ...) là riêng biệt cho mỗi quy trình. Trong quá trình, bộ nhớ có thể được chia sẻ giữa các luồng và có thể không (trong trường hợp lưu trữ cục bộ luồng). Điều này đúng cho các ứng dụng mới được tạo. Đối với ứng dụng fork -ed, bộ nhớ được chia sẻ cho đến khi một trong hai quá trình ghi vào nó (copy-on-write).

Mọi bộ nhớ chỉ đọc (như thư viện được chia sẻ hoặc chạy cùng một ứng dụng nhiều lần) có thể sẽ được chia sẻ giữa các quá trình. Đây là một quyết định cho bộ tải thực thi hạt nhân.

Thư viện tĩnh được liên kết trực tiếp với tệp thực thi, vì vậy có một bản sao riêng cho mỗi lần chạy thực thi (trừ khi có nhiều phiên bản của cùng một tệp thi hành).

0

Mỗi quy trình có một vùng ảo riêng. Nó có thể, tuy nhiên, chia sẻ RAM vật lý, hay không, tùy thuộc vào truy cập. Xem copy-on-write để biết thêm thông tin cơ bản.

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