Làm thế nào là kích thước của ngăn xếp và đống được giới hạn bởi hệ điều hành?


21

Lưu ý : nếu bạn cần xem xét một HĐH cụ thể để có thể trả lời, vui lòng xem xét Linux.

Bất cứ khi nào tôi chạy một chương trình, nó sẽ được cung cấp một không gian bộ nhớ ảo để chạy, với một khu vực cho ngăn xếp của nó và một khu vực cho đống của nó.

Câu hỏi 1 : ngăn xếp và vùng heap có giới hạn kích thước tĩnh (ví dụ: 2 gigabyte mỗi lần) hay giới hạn này là động, thay đổi theo phân bổ bộ nhớ trong khi thực hiện chương trình (nghĩa là tổng số 4 gigabyte được sử dụng bởi cả hai, vậy nếu một chương trình chỉ sử dụng ngăn xếp, nó sẽ có thể có một ngăn xếp với 4 gigabyte)?

Câu 2 : Giới hạn được định nghĩa như thế nào? Đây có phải là tổng bộ nhớ RAM khả dụng không?

Câu 3 : Thế còn phần văn bản (mã) và phần dữ liệu, chúng bị giới hạn như thế nào?


Câu trả lời:


23

Có hai giới hạn bộ nhớ khác nhau. Giới hạn bộ nhớ ảo và giới hạn bộ nhớ vật lý.

Bộ nhớ ảo

Bộ nhớ ảo bị giới hạn bởi kích thước và bố cục không gian địa chỉ có sẵn. Thông thường ngay từ đầu là mã thực thi và dữ liệu tĩnh và quá khứ phát triển heap, trong khi ở cuối là vùng dành riêng cho kernel, trước đó là các thư viện và ngăn xếp được chia sẻ (trên hầu hết các nền tảng phát triển xuống). Điều đó mang lại cho đống và không gian trống để phát triển, các khu vực khác được biết đến khi khởi động quá trình và cố định.

Bộ nhớ ảo miễn phí ban đầu không được đánh dấu là có thể sử dụng được, nhưng được đánh dấu như vậy trong quá trình phân bổ. Mặc dù heap có thể phát triển đến tất cả bộ nhớ khả dụng, hầu hết các hệ thống không tự động phát triển ngăn xếp. Giới hạn mặc định của IIRC cho ngăn xếp là 8MiB trên Linux và 1MiB trên Windows và có thể được thay đổi trên cả hai hệ thống. Bộ nhớ ảo cũng chứa bất kỳ tệp và phần cứng ánh xạ bộ nhớ.

Một lý do tại sao ngăn xếp không thể được tự động phát triển (một cách tùy tiện) là các chương trình đa luồng cần ngăn xếp riêng cho từng luồng, do đó cuối cùng chúng sẽ gặp nhau.

Trên nền tảng 32 bit, tổng dung lượng bộ nhớ ảo là 4GiB, cả Linux và Windows thường dự trữ 1GiB cuối cùng cho kernel, cung cấp cho bạn tối đa 3GiB không gian địa chỉ. Có một phiên bản Linux đặc biệt không bảo lưu bất cứ thứ gì cung cấp cho bạn 4GiB đầy đủ. Nó rất hữu ích cho trường hợp hiếm hoi của cơ sở dữ liệu lớn trong đó 1GiB cuối cùng tiết kiệm trong ngày, nhưng để sử dụng thường xuyên, nó sẽ chậm hơn một chút do tải lại bảng trang bổ sung.

Trên nền tảng 64 bit, bộ nhớ ảo là 64EiB và bạn không phải suy nghĩ về nó.

Bộ nhớ vật lý

Bộ nhớ vật lý thường chỉ được phân bổ bởi hệ điều hành khi quá trình cần truy cập. Số lượng bộ nhớ vật lý mà một quá trình đang sử dụng là số rất mờ, vì một số bộ nhớ được chia sẻ giữa các quy trình (mã, thư viện dùng chung và bất kỳ tệp ánh xạ nào khác), dữ liệu từ các tệp được tải vào bộ nhớ theo yêu cầu và bị loại bỏ khi thiếu bộ nhớ và Bộ nhớ "ẩn danh" (bộ nhớ không được hỗ trợ bởi các tệp) có thể được hoán đổi.

Trên Linux, điều gì xảy ra khi bạn hết bộ nhớ vật lý phụ thuộc vào vm.overcommit_memorycài đặt hệ thống. Mặc định là overcommit. Khi bạn yêu cầu hệ thống phân bổ bộ nhớ, nó sẽ cung cấp một số cho bạn, nhưng chỉ phân bổ bộ nhớ ảo. Khi bạn thực sự truy cập vào bộ nhớ, nó sẽ cố gắng lấy một số bộ nhớ vật lý để sử dụng, loại bỏ dữ liệu có thể đọc lại hoặc hoán đổi mọi thứ khi cần thiết. Nếu nó thấy nó không thể giải phóng bất cứ thứ gì, nó sẽ đơn giản loại bỏ quá trình khỏi sự tồn tại (không có cách nào để phản ứng, bởi vì phản ứng đó có thể cần nhiều bộ nhớ hơn và điều đó sẽ dẫn đến vòng lặp vô tận).

Đây là cách các tiến trình chết trên Android (cũng là Linux). Logic được cải thiện với logic quá trình loại bỏ khỏi sự tồn tại dựa trên những gì quá trình đang làm và bao nhiêu tuổi. Hơn các quy trình Android chỉ đơn giản là ngừng làm bất cứ điều gì, nhưng ngồi trong nền và "kẻ giết người hết bộ nhớ" sẽ giết chúng khi nó cần bộ nhớ cho những cái mới.


9

Tôi nghĩ sẽ dễ dàng hơn để trả lời điều này theo thứ tự cách sử dụng bộ nhớ.

Câu 3: Thế còn phần văn bản (mã) và phần dữ liệu, chúng bị giới hạn như thế nào? Văn bản và dữ liệu được chuẩn bị bởi trình biên dịch. Yêu cầu đối với trình biên dịch là đảm bảo rằng chúng có thể truy cập được và đóng gói chúng ở phần dưới của không gian địa chỉ. Không gian địa chỉ có thể truy cập sẽ bị giới hạn bởi phần cứng, ví dụ: nếu thanh ghi con trỏ lệnh là 32 bit, thì không gian địa chỉ văn bản sẽ là 4 GiB.

Câu 2: Giới hạn được định nghĩa như thế nào? Đây có phải là tổng bộ nhớ RAM khả dụng không? Sau văn bản và dữ liệu, khu vực trên đó là đống. Với bộ nhớ ảo, heap thực tế có thể lớn lên gần với không gian địa chỉ tối đa.

Câu hỏi 1: ngăn xếp và vùng heap có giới hạn kích thước tĩnh (ví dụ: 2 gigabyte mỗi lần) hay giới hạn này là động, thay đổi theo phân bổ bộ nhớ trong khi thực hiện chương trình (nghĩa là tổng số 4 gigabyte được sử dụng bởi cả hai, vậy nếu một chương trình chỉ sử dụng ngăn xếp, nó sẽ có thể có một ngăn xếp với 4 gigabyte)? Phân đoạn cuối cùng trong không gian địa chỉ tiến trình là ngăn xếp. Ngăn xếp lấy đoạn cuối của không gian địa chỉ và nó bắt đầu từ cuối và phát triển xuống .

Bởi vì đống lớn lên và ngăn xếp phát triển xuống, về cơ bản chúng hạn chế lẫn nhau. Ngoài ra, vì cả hai loại phân đoạn đều có thể ghi, nên việc một trong số chúng vượt qua ranh giới là không vi phạm, do đó bạn có thể có bộ đệm hoặc ngăn xếp tràn. Bây giờ có cơ chế để ngăn chặn chúng xảy ra.

Có một giới hạn được đặt cho heap (stack) cho mỗi quá trình bắt đầu. Giới hạn này có thể được thay đổi khi chạy (sử dụng brk () / sbrk ()). Về cơ bản những gì xảy ra là khi quá trình cần nhiều không gian heap và nó đã hết dung lượng được phân bổ, thư viện chuẩn sẽ đưa ra cuộc gọi đến HĐH. HĐH sẽ phân bổ một trang, thường sẽ được quản lý bởi thư viện người dùng để chương trình sử dụng. Tức là nếu chương trình muốn 1 KiB, HĐH sẽ cung cấp thêm 4 KiB và thư viện sẽ cung cấp 1 KiB cho chương trình và còn lại 3 KiB để sử dụng khi chương trình yêu cầu thêm lần sau.

Hầu hết thời gian bố trí sẽ là Văn bản, Dữ liệu, Heap (lớn lên), không gian chưa phân bổ và cuối cùng là Stack (phát triển xuống). Tất cả đều có chung không gian địa chỉ.

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.