Một số từ khóa
Tiếng Anh | Tiế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 variables
và constant
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ánhstack 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.