Quản lý bộ nhớ I: Stack, Heap và Static memory

Quản lý bộ nhớ I: Stack, Heap và Static memory

·

4 min read

Một số từ khóa

Tiếng AnhTiếng Việt
allocate(v) cấp phát
deallocate(v) giải phóng
program(n) chương trình
terminates(v)
recursive function(n) hàm đệ quy
runtime(n) giai đoạn khi chương trình đang chạy

Cấu trúc Memory

Trong bài viết này chúng ta sẽ tìm hiểu về cấu trúc của memory, cách hoạt động của các vùng trong memory như: stack, heap, static. Việc cấp phát bộ nhớ khi khởi tạo các variable/constant trong code sẽ có tác động thế nào tới các loại vùng nhớ này

Tại runtime, code sau khi được biên dịch sẽ được lưu lại ở phần machine code dưới dạng các execution instructions trong memory

Stack memory là gì?

Stack memory là nơi dùng để chứa các local variables và thông tin của các function call. Khi một function được gọi, các local variables và function-call-information của nó được đẩy vào Stack. Khi function đó chạy xong, stack-frame chứa các thông tin của function này sẽ được đẩy ra khỏi Stack đồng thời vùng nhớ nó chiếm sẽ được giải phóng

Stack memory có 2 nhiệm vụ chính khi chương trình đang chạy:

  • Theo dõi thông tin của các function được gọi
  • Giữ các giá trị của local variables được sử dụng trong các function

Stack memory nhanh và hiệu quả, vì các thao tác allocation và deallocation đều đơn giản. Tuy nhiên, không gian của stack memory bị giới hạn, việc sử dụng quá mức stack memory sẽ dẫn tới hiện tượng stack-overflow

Call Stack hoạt động thế nào?

Mỗi khi ta gọi 1 function với 1 lời gọi hàm (function call) → function này sẽ được thêm vào (push) call Stack cùng với thông tin của các local variables của function này. Khi việc thực thi của function này được thực hiện xong, nó sẽ được đẩy ra (pop) khỏi call Stack

Heap memory là gì?

Heap memory là vùng động của memory, cho phép allocate và deallocation trong khoảng thời gian runtime. Việc sử dụng heap memory không cẩn thận sẽ dẫn tới các hiện tượng như memory leaks, fragmentation:

  • Những vùng nhớ được cấp phát (allocate) không được giải phóng (deallocate) sau khi sử dụng

Heap memory thường được dùng để chứa data có kích thước chưa biết hoặc là biến số, ví dụ như: dynamic arrays (mảng động),…

Static Memory / Initialized Data Segment là gì?

Static memory được cấp phát trong quá trinh compile-time và không đổi trong suốt quá trình chương trình (program) chạy. Nó chứa các global variables, constants, và static variables. Vùng nhớ dành cho các static variables được cấp phát khi chương trình bắt đầu và giải phóng khi chương trình chấm dứt (terminate)

Static memory rất ổn định nên phù hợp cho những static variablesconstant

Best Practices for Memory Management

Stack Memory

  • Dùng cho các local variables và function calls.

  • Chú ý tới giới hạn của stack memory

  • Tránh các recursive function calls để tránh stack overflow.

Heap Memory

  • Allocate memory on the heap for data with dynamic or unknown sizes.

  • Luôn giải phóng những vùng nhớ được cấp phát động khi không dùng tới để tránh memory leaks.

  • Consider using smart pointers or garbage collection in languages that support them

Static Memory

  • Use static memory for global variables and constants.

  • Be cautious with the size of static variables to avoid unnecessary memory consumption.

  • Minimize the use of global variables to maintain code modularity and improve maintainability.

Tài liệu tham khảo