Search…

Tổ Chức Bộ Nhớ Chương Trình

04/09/20203 min read
Tổ chức bộ nhớ của 1 chương trình C/C++ với các segments: Stack segment, Heap segment, Data segment, Code segment.

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.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024