Phõn bổ bộ nhớ động

Một phần của tài liệu Bài giảng Xây dựng các hệ thống nhúng: Phần 2 (Trang 82 - 85)

3. The OS must be fast

3.5.22 Phõn bổ bộ nhớ động

Kỹ thuật cấp phỏt bộ nhớ động được sử dụng trong cỏc hệ thống nhỳng dựa trờn Hệ điều hành (HĐH). Hệ điều hành chứa một (Đơn vị quản lý bộ nhớ) và nú chịu trỏch nhiệm xử lý cỏc hoạt động liờn quan đến cấp phỏt bộ nhớ. Đơn vị quản lý bộ nhớ phõn bổ bộ nhớ để giữ mó cho ứng dụng và cỏc biến liờn quan đến ứng dụng. Khung nhỡn khỏi niệm về lưu trữ của một ứng dụng và cỏc biến liờn quan đến ứng dụng được trỡnh bày trong Hỡnh 8.

Hỡnh 8. Phõn bổ bộ nhớ tĩnh và động

Hàm malloc (): malloc () phõn bổ động một khối bộ nhớ. Hàm malloc () dự trữ một khối bộ nhớ cú kớch thước được chỉ định làm tham số cho hàm, trong bộ nhớ heap và trả về một con trỏ cú kiểu void. Điều này cú thể được gỏn cho một con trỏ của bất kỳ loại hợp lệ. Hỡnh thức chung của việc sử dụng hàm malloc () được đưa ra dưới đõy.

221

trong đú ‘pointer’ là một con trỏ kiểu ‘pointer_type’. ‘pointer_type’ cú thể là hàm int, char, float, v.v. Hàm malloc () trả về một con trỏ kiểu ‘pointer_type’ cho một khối bộ nhớ cú kớch thước khụng. của byte. Một vớ dụ điển hỡnh được đưa ra dưới đõy:

ptr= (char *) malloc(50);

Hướng dẫn này phõn bổ 50 byte (Nếu cú 50 byte bộ nhớ khả dụng trong vựng heap) và địa chỉ của byte đầu tiờn của bộ nhớ được phõn bổ trong vựng heap được gỏn cho con trỏ ptr của kiểu char. Cần lưu ý rằng hàm malloc () chỉ phõn bổ số byte được yờu cầu và nú sẽ khụng phõn bổ bộ nhớ tự động cho cỏc đơn vị của con trỏ đang sử dụng. Vớ dụ: nếu lập trỡnh viờn muốn cấp phỏt bộ nhớ cho 100 số nguyờn một cỏch linh hoạt, mó sau đõy:

x= (int *) malloc(100);

sẽ khụng phõn bổ kớch thước bộ nhớ cho 100 số nguyờn, thay vào đú, nú phõn bổ bộ nhớ cho chỉ 100 byte. Để làm cho nú dự trữ bộ nhớ cho 100 biến số nguyờn, mó phải được viết lại thành: x= (int *) malloc(100 * sizeof (int));

Hàm malloc () cũng cú thể được sử dụng để phõn bổ bộ nhớ cho cỏc loại dữ liệu phức tạp như con trỏ cấu trỳc ngoài cỏc loại dữ liệu thụng thường như int, char, float, v.v. malloc () phõn bổ cỏc byte bộ nhớ được yờu cầu theo kiểu liờn tục và việc phõn bổ thất bại nếu khụng cú đủ bộ nhớ khả dụng theo kiểu liờn tục cho số byte được yờu cầu bởi cỏc hàm malloc (). Giỏ trị trả về của malloc () sẽ là NULL (0) nếu thất bại. Do đú, giỏ trị trả về của malloc () phải được kiểm tra để đảm bảo việc cấp phỏt bộ nhớ cú thành cụng hay khụng trước khi sử dụng con trỏ được trả về bởi hàm malloc ().

int * ptr;

if ((ptr= (int *) malloc(50 * sizeof (int)))) printf (“Memory allocated successfully”); else

printf (“Memory allocation failed”);

malloc () chỉ phõn bổ cỏc byte bộ nhớ cần thiết và sẽ khụng khởi tạo bộ nhớ được phõn bổ. Bộ nhớ được phõn bổ chứa dữ liệu ngẫu nhiờn.

calloc (): Hàm thư viện calloc () phõn bổ nhiều khối byte lưu trữ và khởi tạo mỗi byte được phõn bổ thành 0. Cỳ phỏp của hàm calloc () được minh họa bờn dưới.

222

trong đú con trỏ là một con trỏ kiểu ‘pointer_type’. ‘pointer_type’ cú thể là int, char, float, v.v ... là viết tắt của số khối được phõn bổ và kớch thước của khối cho biết kớch thước của byte được yờu cầu cho mỗi khối. Hàm calloc (n, kớch thước của khối) phõn bổ bộ nhớ liờn tục cho n số khối với kớch thước số byte của mỗi khối và trả về một con trỏ kiểu ‘pointer_type’ trỏ đến byte đầu tiờn của khối bộ nhớ được phõn bổ. Một vớ dụ điển hỡnh được đưa ra dưới đõy.

ptr= (char *) calloc (50,1);

Hướng dẫn trờn phõn bổ 50 khối bộ nhớ liền kề mỗi kớch thước một byte trong bộ nhớ heap và gỏn địa chỉ của byte đầu tiờn của vựng bộ nhớ được phõn bổ cho con trỏ ký tự ptr. Vỡ malloc () chỉ cú khả năng phõn bổ số byte cố định trong vựng heap bất kể loại lưu trữ, nờn calloc () cú thể được sử dụng để vượt quỏ giới hạn này như được thảo luận dưới đõy:

ptr= (int *) calloc(50,sizeof(int));

Cỏc tớnh năng được cung cấp bởi calloc () cú thể được triển khai bằng hàm malloc () như: pointer = (pointer_type *) malloc (n * size of block);

memset (pointer, 0, n * size of block); Vớ dụ:

ptr= (int *) malloc (10 * sizeof (int)); memset(ptr, 0, n * size of block);

free (): Hàm thư viện quản lý bộ nhớ C free () được sử dụng để giải phúng hoặc phõn bổ bộ nhớ được phõn bổ trong bộ nhớ heap bởi cỏc hàm malloc () hoặc calloc (). Nếu bộ nhớ được cấp phỏt động, lập trỡnh viờn sẽ giải phúng nú nếu bộ nhớ được cấp phỏt động khụng cũn cần thiết cho bất kỳ hoạt động nào. Giải phúng bộ nhớ được phõn bổ động làm cho nú sẵn sàng để sử dụng cho cỏc phõn bổ động khỏc. Cỳ phỏp của hàm free () được đưa ra dưới đõy.

free (ptr);

ptr là con trỏ hợp lệ được trả về bởi hàm calloc () hoặc malloc () trờn cấp phỏt bộ nhớ động. Việc sử dụng một con trỏ khụng hợp lệ với hàm free () cú thể dẫn đến hành vi khụng mong muốn của ứng dụng.

Hàm realloc (): realloc () được sử dụng để thay đổi kớch thước của cỏc byte được phõn bổ trong một khối bộ nhớ được cấp phỏt động. Bạn cú thể gặp cỏc tỡnh huống trong đú bộ nhớ được phõn bổ khụng đủ để chứa dữ liệu cần thiết hoặc nú dư thừa về cỏc byte bộ nhớ được phõn bổ. Cả hai tỡnh huống này đều được xử lý bằng hàm realloc (). Hàm realloc () thay đổi kớch thước của khối bộ nhớ được trỏ đến, bởi tham số con trỏ thành số byte được chỉ định bởi tham số kớch thước đó sửa đổi và nú trả về một con trỏ mới cho khối. Con trỏ được chỉ định bởi tham số con trỏ phải

223

được tạo bằng cỏc chương trỡnh con malloc, calloc hoặc realloc và khụng được phõn bổ với cỏc chương trỡnh con miễn phớ hoặc realloc. Hàm realloc () cú thể thay đổi vị trớ của khối đó được phõn bổ tựy thuộc vào kớch thước mới, với việc giữ nguyờn nội dung của khối đó được phõn bổ và trả về một con trỏ trỏ đến byte đầu tiờn của khối bộ nhớ được phõn bổ lại. realloc () trả về một con trỏ void nếu cú đủ bộ nhớ để cấp phỏt, nếu khụng thỡ trả về một con trỏ NULL.

realloc (pointer, modifi ed size); Vớ dụ:

char *p; p= (char*) malloc (10); //Allocate 10 bytes of memory p= realloc(p,15); //Change the allocation to 15 bytes realloc(p,0) is same as free(p), provided ‘p’ is a valid pointer.

Một phần của tài liệu Bài giảng Xây dựng các hệ thống nhúng: Phần 2 (Trang 82 - 85)

Tải bản đầy đủ (PDF)

(196 trang)