Giới thiệu
Khi một chương trình được thực thi, nó sẽ được nạp vào bộ nhớ, vậy quá trình đó được thực hiện và tổ chức như thế nào?
Khi khai báo một biến trong C/C++, biến này chứa 2 thể hiện là địa chỉ và giá trị. Không chỉ có biến mà các đoạn mã nguồn cũng có địa chỉ và giá trị.
Khi chương trình được khởi chạy, hệ điều hành sẽ tổ chức 4 vùng nhớ logic, có kích thước tương ứng với kích thước của 4 vùng nhớ mà chương trình cần sử dụng, được gọi là Memory Segment. Biến và mã thực thi sẽ được lưu trữ trong các Segment này.
Các vùng nhớ
Code Segment
Mã nguồn của chương trình sau khi hoàn tất quá trình Build sẽ chuyển thành các đoạn mã thực thi, mã máy 0 và 1. Khi chương trình khởi chạy, mã thực thi sẽ được nạp vào Code Segment. Cách để truy xuất vào vùng nhớ này là sử dụng con trỏ hàm.
Code Segment có kích thước cố định sau khi nạp chương trình và có 1 tên gọi khác là Text Segment.
Data Segment
Khi chương trình khởi chạy, toàn bộ các biến toàn cục (global) và static
(static int count;
) được lưu trữ ở đây, các đoạn chuỗi cố định ("Hello World"
, "Welcome to"
, ...) cũng được lưu trữ trong Data Segment.
Data Segment có kích thước cố định sau khi nạp hoàn tất.
Stack Segment
Là vùng nhớ được tương tác nhiều khi lập trình, khi một hàm được gọi, stack frame
của hàm đó sẽ được đưa vào vùng nhớ Stack như các biến được khai báo trong hàm hoặc cũng được đưa vào vùng nhớ Stack. Khi hàm kết thúc, toàn bộ các biến trong hàm cùng với bản thân hàm sẽ được tự động giải phóng để các hàm sau sử dụng.
Stack Segment có kích thước cố định, khi khai báo quá nhiều biến hoặc một mảng có số lượng phần tử quá lớn, một hàm đệ quy quá sâu, ... bộ nhớ Stack sẽ bị đầy, dẫn đến chương trình bị bắt buộc dừng do lỗi phổ biến - stack overflow.
Heap Segment
Vùng nhớ khác cần quan tâm, vùng nhớ này phải hoàn toàn kiểm soát nó. Khi sử dụng con trỏ và cấp phát động một vùng nhớ cho con trỏ quản lý, vùng nhớ này sẽ nằm trong Heap Segment. Những vùng nhớ được cấp phát động sẽ không tự động thu hồi khi khối lệnh kết thúc, lập trình viên phải chủ động thu hồi khi không còn nhu cầu sử dụng.
Heap Segment dành cho việc cấp phát khi chương trình thực thi, nó còn được gọi là vùng nhớ động, kích thước của nó có thể tăng hoặc giảm tùy vào nhu cầu sự cấp phát động. Heap có thể mở rộng cho đến khi bộ nhớ đầy, cần kiểm soát thật tốt, thu hồi các vùng nhớ được cấp phát động khi không còn nhu cầu sử dụng để có thêm vùng nhớ khi cần.