2012-11-13 59 views
5

Tôi hiện đang học về những thứ arduino cấp thấp bao gồm cả bộ nhớ. Câu hỏi của tôi là kể từ đống và chồng mọc ở phía đối diện của bộ nhớ, không có bộ nhớ chỉ xảy ra nếu cả hai đáp ứng ở đâu đó ở giữa, hoặc nó xảy ra khi một trong số họ đánh vào giữa.Out of Memory Concepts

+7

Đó là toàn bộ lý do chúng phát triển theo các hướng khác nhau - bạn ổn cho đến khi chúng thực sự va chạm. –

Trả lời

3
  • không có khái niệm "trung"
  • tùy thuộc vào cách hệ điều hành cơ bản (nếu có ở tất cả!) Quản lý các quá trình (nếu có điều như vậy trên bục giảng !), ngăn xếp có thể có kích thước giới hạn, nhỏ hơn nhiều so với "phần còn lại của toàn bộ bộ nhớ"
  • tùy thuộc vào cách hệ điều hành bên dưới (nếu có!) quản lý không gian bộ nhớ ảo (nếu có nền tảng!), heap có thể có kích thước giới hạn, nhỏ hơn nhiều han "phần còn lại của toàn bộ bộ nhớ"

Nếu có bất kỳ giới hạn nào trong số đó, thì có khả năng rất nhỏ các vùng đó gặp nhau. Trên thực tế, hầu hết có lẽ họ sẽ sớm chỉ đơn giản là chạy ra khỏi không gian, và các cơ chế bảo vệ sẽ tăng phần cứng có liên quan của trường hợp ngoại lệ phần mềm.

Điều này có nghĩa là sự kiện 'hết bộ nhớ' không phải là một vấn đề. Có OOM trong ngăn xếp, và OOM trong đống. Trong phần của tôi trên thế giới, theo truyền thống, có liên quan đến ngăn xếp được gọi là StackOverflow :) và một trong những liên quan đến heap là OutOf [Heap] Memory.

Đáng chú ý, nếu nền tảng của bạn có khái niệm bộ nhớ ảo, thì ngăn xếp nhiều nhất có lẽ vẫn là một khối không gian, nhưng có thể là một cấu trúc thưa thớt và sẽ bao gồm nhiều khối không gian, nhất thiết phải được sắp xếp vật lý theo cách tăng dần hoặc giảm dần. Trong trường hợp như vậy, thật khó để nói về bất cứ điều gì đáp ứng bất cứ điều gì. StackOverflow xảy ra khi stack đạt đến giới hạn kích thước, và OutOfMemory xảy ra khi người quản lý bộ nhớ không thể tìm thấy một lỗ trống thích hợp trong không gian bộ nhớ.

Nếu bỏ qua bộ nhớ ảo và nếu chỉ nói về 'phần cứng thô', thì nó phụ thuộc vào .. nơi ngăn xếp thực sự nằm. IIRC (!), Trên một số nền tảng (thực sự cũ) ngăn xếp được preallocated tại một số không gian được xác định trước nằm ở đầu bộ nhớ vật lý, chúng ta hãy nói mười trang đầu tiên, và phát triển 'đến đáy'. Sau đó là một vài trang của phần cứng được ánh xạ các bảng và các hình ảnh trạng thái cổng, và sau đó đuôi còn lại là đống. Với thiết lập như vậy, StackOverflow được tăng lên khi con trỏ ngăn xếp đạt đến số không. Ngoài ra, đối với những bộ vi xử lý cũ nó đã dễ dàng hơn để đạt được địa chỉ thấp hơn so với những cái cao hơn, do đó, đặt ngăn xếp thường truy cập trong các địa chỉ thấp hơn là một cộng lớn .

IIRC (!), các nền tảng mới hơn không có những vấn đề đó (thông thường, chúng ta hãy bỏ qua NUMA và những thứ tương tự), và thiết lập 'phần cứng thô' truyền thống hiện tại đưa các vùng đặc biệt (bảng, cổng, vv) vào đầu không gian, sau đó là Heap, rồi ' khu vực tự do 'sau đó ngăn xếp, và StackOverflow xảy ra khi khu vực tự do đã biến mất, đó là khi ngăn xếp đáp ứng bất kỳ khối nào đã có bởi đống. Lưu ý rằng StackOverflow đó vẫn không có nghĩa là OutOfMemory: ngăn xếp có thể bị tràn, nhưng đống có thể có một số khoảng trống và vẫn có thể có nhiều không gian trống!

Hãy lưu ý rằng những 'IIRC là quan trọng. Tôi không phải là một chuyên gia về kiến ​​trúc bộ vi xử lý hiện tại và Arduino, và cả blargh 'lịch sử' ở trên có thể khá giả về những gì mới hơn/cũ hơn. Tôi cho nó xác suất 80% là đúng.

+0

đã làm sáng tỏ một số ánh sáng thực sự. cảm ơn –

1

Ngăn xếp có kích thước được phân bổ nhất định và nếu bạn vượt quá kích thước đó, bạn sẽ bị tràn bộ đệm ngăn xếp.

Trong phần mềm, tràn ngăn xảy ra khi quá nhiều bộ nhớ được sử dụng trên ngăn xếp cuộc gọi. Ngăn xếp cuộc gọi chứa một lượng bộ nhớ giới hạn, thường được xác định khi bắt đầu chương trình.

Nguồn Wikipedia

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